Expand PMF_FN_* macros.
[netbsd-mini2440.git] / external / bsd / libelf / dist / elf_flag.c
blob4e3db69815def31be90ef7aa90ad81b664431c68
1 /* $NetBSD$ */
3 /*-
4 * Copyright (c) 2006 Joseph Koshy
5 * All rights reserved.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
29 #include <sys/cdefs.h>
30 /* __FBSDID("$FreeBSD: src/lib/libelf/elf_flag.c,v 1.1.10.1.2.1 2009/10/25 01:10:29 kensmith Exp $"); */
32 #include <libelf.h>
34 #include "_libelf.h"
36 unsigned int
37 elf_flagdata(Elf_Data *d, Elf_Cmd c, unsigned int flags)
39 Elf *e;
40 Elf_Scn *scn;
41 unsigned int r;
43 if (d == NULL)
44 return (0);
46 if ((c != ELF_C_SET && c != ELF_C_CLR) || (scn = d->d_scn) == NULL ||
47 (e = scn->s_elf) == NULL || e->e_kind != ELF_K_ELF ||
48 (flags & ~ELF_F_DIRTY) != 0) {
49 LIBELF_SET_ERROR(ARGUMENT, 0);
50 return (0);
53 if (c == ELF_C_SET)
54 r = scn->s_flags |= flags;
55 else
56 r = scn->s_flags &= ~flags;
58 return (r);
61 unsigned int
62 elf_flagehdr(Elf *e, Elf_Cmd c, unsigned int flags)
64 int ec;
65 void *ehdr;
67 if (e == NULL)
68 return (0);
70 if ((c != ELF_C_SET && c != ELF_C_CLR) ||
71 (e->e_kind != ELF_K_ELF) || (flags & ~ELF_F_DIRTY) != 0 ||
72 ((ec = e->e_class) != ELFCLASS32 && ec != ELFCLASS64)) {
73 LIBELF_SET_ERROR(ARGUMENT, 0);
74 return (0);
77 if (ec == ELFCLASS32)
78 ehdr = e->e_u.e_elf.e_ehdr.e_ehdr32;
79 else
80 ehdr = e->e_u.e_elf.e_ehdr.e_ehdr64;
82 if (ehdr == NULL) {
83 LIBELF_SET_ERROR(SEQUENCE, 0);
84 return (0);
87 return (elf_flagelf(e, c, flags));
90 unsigned int
91 elf_flagelf(Elf *e, Elf_Cmd c, unsigned int flags)
93 int r;
95 if (e == NULL)
96 return (0);
98 if ((c != ELF_C_SET && c != ELF_C_CLR) ||
99 (e->e_kind != ELF_K_ELF) ||
100 (flags & ~(ELF_F_DIRTY|ELF_F_LAYOUT)) != 0) {
101 LIBELF_SET_ERROR(ARGUMENT, 0);
102 return (0);
105 if (c == ELF_C_SET)
106 r = e->e_flags |= flags;
107 else
108 r = e->e_flags &= ~flags;
109 return (r);
112 unsigned int
113 elf_flagphdr(Elf *e, Elf_Cmd c, unsigned int flags)
115 int ec;
116 void *phdr;
118 if (e == NULL)
119 return (0);
121 if ((c != ELF_C_SET && c != ELF_C_CLR) ||
122 (e->e_kind != ELF_K_ELF) || (flags & ~ELF_F_DIRTY) != 0 ||
123 ((ec = e->e_class) != ELFCLASS32 && ec != ELFCLASS64)) {
124 LIBELF_SET_ERROR(ARGUMENT, 0);
125 return (0);
128 if (ec == ELFCLASS32)
129 phdr = e->e_u.e_elf.e_phdr.e_phdr32;
130 else
131 phdr = e->e_u.e_elf.e_phdr.e_phdr64;
133 if (phdr == NULL) {
134 LIBELF_SET_ERROR(SEQUENCE, 0);
135 return (0);
138 return (elf_flagelf(e, c, flags));
141 unsigned int
142 elf_flagscn(Elf_Scn *s, Elf_Cmd c, unsigned int flags)
144 int r;
146 if (s == NULL)
147 return (0);
149 if ((c != ELF_C_SET && c != ELF_C_CLR) ||
150 (flags & ~ELF_F_DIRTY) != 0) {
151 LIBELF_SET_ERROR(ARGUMENT, 0);
152 return (0);
155 if (c == ELF_C_SET)
156 r = s->s_flags |= flags;
157 else
158 r = s->s_flags &= ~flags;
159 return (r);
162 unsigned int
163 elf_flagshdr(Elf_Scn *s, Elf_Cmd c, unsigned int flags)
165 return (elf_flagscn(s, c, flags));