1/* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22/* 23 * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27/* Copyright (c) 1988 AT&T */ 28/* All Rights Reserved */ 29 30#pragma ident "@(#)flag.c 1.11 08/05/31 SMI" 31 32#include "libelf.h" 33#include "decl.h" 34#include "msg.h" 35 36 37unsigned 38elf_flagdata(Elf_Data * data, Elf_Cmd cmd, unsigned flags) 39{ 40 unsigned rc = 0; 41 Elf * elf; 42 Elf_Scn * scn; 43 Dnode * d; 44 45 if (data == 0) 46 return (0); 47 d = (Dnode *) data; 48 scn = d->db_scn; 49 elf = scn->s_elf; 50 51 READLOCKS(elf, scn) 52 53 if (cmd == ELF_C_SET) { 54 rc = d->db_uflags |= flags; 55 } else if (cmd == ELF_C_CLR) { 56 rc = d->db_uflags &= ~flags; 57 } else 58 _elf_seterr(EREQ_FLAG, 0); 59 READUNLOCKS(elf, scn) 60 return (rc); 61} 62 63 64unsigned int 65elf_flagehdr(Elf * elf, Elf_Cmd cmd, unsigned flags) 66{ 67 int rc; 68 if (elf == 0) 69 return (0); 70 if (cmd == ELF_C_SET) { 71 ELFWLOCK(elf) 72 rc = elf->ed_ehflags |= flags; 73 ELFUNLOCK(elf) 74 return (rc); 75 } 76 if (cmd == ELF_C_CLR) { 77 ELFWLOCK(elf) 78 rc = elf->ed_ehflags &= ~flags; 79 ELFUNLOCK(elf) 80 return (rc); 81 } 82 _elf_seterr(EREQ_FLAG, 0); 83 return (0); 84} 85 86 87unsigned 88elf_flagelf(Elf * elf, Elf_Cmd cmd, unsigned flags) 89{ 90 int rc; 91 if (elf == 0) 92 return (0); 93 if (cmd == ELF_C_SET) { 94 ELFWLOCK(elf) 95 rc = elf->ed_uflags |= flags; 96 ELFUNLOCK(elf) 97 return (rc); 98 } 99 if (cmd == ELF_C_CLR) { 100 ELFWLOCK(elf) 101 rc = elf->ed_uflags &= ~flags; 102 ELFUNLOCK(elf) 103 return (rc); 104 } 105 _elf_seterr(EREQ_FLAG, 0); 106 return (0); 107} 108 109 110unsigned 111elf_flagphdr(Elf * elf, Elf_Cmd cmd, unsigned flags) 112{ 113 int rc; 114 if (elf == 0) 115 return (0); 116 if (cmd == ELF_C_SET) { 117 ELFWLOCK(elf); 118 rc = elf->ed_phflags |= flags; 119 ELFUNLOCK(elf); 120 return (rc); 121 } 122 if (cmd == ELF_C_CLR) { 123 ELFWLOCK(elf); 124 rc = elf->ed_phflags &= ~flags; 125 ELFUNLOCK(elf); 126 return (rc); 127 } 128 _elf_seterr(EREQ_FLAG, 0); 129 return (0); 130} 131 132 133unsigned 134elf_flagscn(Elf_Scn * scn, Elf_Cmd cmd, unsigned flags) 135{ 136 unsigned rc; 137 Elf * elf; 138 139 if (scn == 0) 140 return (0); 141 142 elf = scn->s_elf; 143 if (cmd == ELF_C_SET) { 144 READLOCKS(elf, scn) 145 rc = scn->s_uflags |= flags; 146 READUNLOCKS(elf, scn) 147 return (rc); 148 } 149 if (cmd == ELF_C_CLR) { 150 READLOCKS(elf, scn) 151 rc = scn->s_uflags &= ~flags; 152 READUNLOCKS(elf, scn) 153 return (rc); 154 } 155 _elf_seterr(EREQ_FLAG, 0); 156 return (0); 157} 158 159 160unsigned 161elf_flagshdr(Elf_Scn * scn, Elf_Cmd cmd, unsigned flags) 162{ 163 unsigned rc; 164 Elf * elf; 165 if (scn == 0) 166 return (0); 167 168 elf = scn->s_elf; 169 if (cmd == ELF_C_SET) { 170 READLOCKS(elf, scn) 171 rc = scn->s_shflags |= flags; 172 READUNLOCKS(elf, scn) 173 return (rc); 174 } 175 if (cmd == ELF_C_CLR) { 176 READLOCKS(elf, scn) 177 rc = scn->s_shflags &= ~flags; 178 READUNLOCKS(elf, scn) 179 return (rc); 180 } 181 _elf_seterr(EREQ_FLAG, 0); 182 return (0); 183} 184