Commit | Line | Data |
---|---|---|
959f3c4c JH |
1 | ?RCS: $Id: d_union_semun.U,v $ |
2 | ?RCS: | |
3 | ?RCS: Copyright (c) 1998 Andy Dougherty | |
4 | ?RCS: | |
5 | ?RCS: You may distribute under the terms of either the GNU General Public | |
6 | ?RCS: License or the Artistic License, as specified in the README file. | |
7 | ?RCS: | |
8 | ?RCS: $Log: d_union_semun.U,v $ | |
9 | ?RCS: | |
0f00356b | 10 | ?MAKE:d_union_semun d_semctl_semun d_semctl_semid_ds: Compile Setvar Myread run \ |
959f3c4c JH |
11 | cat rm d_sem |
12 | ?MAKE: -pick add $@ %< | |
13 | ?S:d_union_semun: | |
14 | ?S: This variable conditionally defines HAS_UNION_SEMUN if the | |
15 | ?S: union semun is defined by including <sys/sem.h>. | |
16 | ?S:. | |
17 | ?S:d_semctl_semun: | |
18 | ?S: This variable conditionally defines USE_SEMCTL_SEMUN, which | |
19 | ?S: indicates that union semun is to be used for semctl IPC_STAT. | |
20 | ?S:. | |
21 | ?S:d_semctl_semid_ds: | |
22 | ?S: This variable conditionally defines USE_SEMCTL_SEMID_DS, which | |
23 | ?S: indicates that struct semid_ds * is to be used for semctl IPC_STAT. | |
24 | ?S:. | |
25 | ?C:HAS_UNION_SEMUN: | |
26 | ?C: This symbol, if defined, indicates that the union semun is | |
27 | ?C: defined by including <sys/sem.h>. If not, the user code | |
28 | ?C: probably needs to define it as: | |
29 | ?C: union semun { | |
30 | ?C: int val; | |
31 | ?C: struct semid_ds *buf; | |
32 | ?C: unsigned short *array; | |
33 | ?C: } | |
34 | ?C:. | |
35 | ?C:USE_SEMCTL_SEMUN: | |
36 | ?C: This symbol, if defined, indicates that union semun is | |
37 | ?C: used for semctl IPC_STAT. | |
38 | ?C:. | |
39 | ?C:USE_SEMCTL_SEMID_DS: | |
40 | ?C: This symbol, if defined, indicates that struct semid_ds * is | |
41 | ?C: used for semctl IPC_STAT. | |
42 | ?C:. | |
43 | ?H:#$d_union_semun HAS_UNION_SEMUN /**/ | |
44 | ?H:#$d_semctl_semun USE_SEMCTL_SEMUN /**/ | |
45 | ?H:#$d_semctl_semid_ds USE_SEMCTL_SEMID_DS /**/ | |
46 | ?H:. | |
47 | ?T:xxx also | |
959f3c4c JH |
48 | ?LINT: set d_union_semun d_semctl_semun d_semctl_semid_ds |
49 | : see whether sys/sem.h defines union semun | |
50 | echo " " | |
51 | $cat > try.c <<'END' | |
52 | #include <sys/types.h> | |
53 | #include <sys/ipc.h> | |
54 | #include <sys/sem.h> | |
55 | int main () { union semun semun; semun.buf = 0; } | |
56 | END | |
57 | set try | |
58 | if eval $compile; then | |
59 | echo "You have union semun in <sys/sem.h>." >&4 | |
60 | val="$define" | |
61 | else | |
62 | echo "You do not have union semun in <sys/sem.h>." >&4 | |
63 | val="$undef" | |
64 | fi | |
65 | $rm -f try try.c try.h | |
66 | set d_union_semun | |
67 | eval $setvar | |
68 | ||
69 | : see how to do semctl IPC_STAT | |
70 | case "$d_sem" in | |
71 | $define) | |
72 | : see whether semctl IPC_STAT can use union semun | |
73 | echo " " | |
74 | $cat > try.h <<END | |
75 | #ifndef S_IRUSR | |
76 | # ifdef S_IREAD | |
77 | # define S_IRUSR S_IREAD | |
78 | # define S_IWUSR S_IWRITE | |
79 | # define S_IXUSR S_IEXEC | |
80 | # else | |
81 | # define S_IRUSR 0400 | |
82 | # define S_IWUSR 0200 | |
83 | # define S_IXUSR 0100 | |
84 | # endif | |
85 | # define S_IRGRP (S_IRUSR>>3) | |
86 | # define S_IWGRP (S_IWUSR>>3) | |
87 | # define S_IXGRP (S_IXUSR>>3) | |
88 | # define S_IROTH (S_IRUSR>>6) | |
89 | # define S_IWOTH (S_IWUSR>>6) | |
90 | # define S_IXOTH (S_IXUSR>>6) | |
91 | #endif | |
92 | #ifndef S_IRWXU | |
93 | # define S_IRWXU (S_IRUSR|S_IWUSR|S_IXUSR) | |
94 | # define S_IRWXG (S_IRGRP|S_IWGRP|S_IXGRP) | |
95 | # define S_IRWXO (S_IROTH|S_IWOTH|S_IXOTH) | |
96 | #endif | |
97 | END | |
98 | ||
99 | $cat > try.c <<END | |
100 | #include <sys/types.h> | |
101 | #include <sys/ipc.h> | |
102 | #include <sys/sem.h> | |
103 | #include <sys/stat.h> | |
104 | #include <stdio.h> | |
105 | #include <errno.h> | |
106 | #include "try.h" | |
107 | #ifndef errno | |
108 | extern int errno; | |
109 | #endif | |
110 | #$d_union_semun HAS_UNION_SEMUN | |
111 | int main() { | |
112 | union semun | |
113 | #ifndef HAS_UNION_SEMUN | |
114 | { | |
115 | int val; | |
116 | struct semid_ds *buf; | |
117 | unsigned short *array; | |
118 | } | |
119 | #endif | |
120 | arg; | |
121 | int sem, st; | |
122 | ||
123 | #if defined(IPC_PRIVATE) && defined(S_IRWXU) && defined(S_IRWXG) && defined(S_IRWXO) && defined(IPC_CREAT) | |
124 | sem = semget(IPC_PRIVATE, 1, S_IRWXU|S_IRWXG|S_IRWXO|IPC_CREAT); | |
125 | if (sem > -1) { | |
126 | struct semid_ds argbuf; | |
127 | arg.buf = &argbuf; | |
128 | # ifdef IPC_STAT | |
129 | st = semctl(sem, 0, IPC_STAT, arg); | |
130 | if (st == 0) | |
131 | printf("semun\n"); | |
132 | else | |
133 | # endif /* IPC_STAT */ | |
134 | printf("semctl IPC_STAT failed: errno = %d\n", errno); | |
135 | # ifdef IPC_RMID | |
136 | if (semctl(sem, 0, IPC_RMID, arg) != 0) | |
137 | # endif /* IPC_RMID */ | |
138 | printf("semctl IPC_RMID failed: errno = %d\n", errno); | |
139 | } else | |
140 | #endif /* IPC_PRIVATE && ... */ | |
141 | printf("semget failed: errno = %d\n", errno); | |
142 | return 0; | |
143 | } | |
144 | END | |
145 | val="$undef" | |
146 | set try | |
147 | if eval $compile; then | |
0f00356b | 148 | xxx=`$run ./try` |
959f3c4c JH |
149 | case "$xxx" in |
150 | semun) val="$define" ;; | |
151 | esac | |
152 | fi | |
153 | $rm -f try try.c | |
154 | set d_semctl_semun | |
155 | eval $setvar | |
156 | case "$d_semctl_semun" in | |
157 | $define) | |
158 | echo "You can use union semun for semctl IPC_STAT." >&4 | |
159 | also='also' | |
160 | ;; | |
161 | *) echo "You cannot use union semun for semctl IPC_STAT." >&4 | |
162 | also='' | |
163 | ;; | |
164 | esac | |
165 | ||
166 | : see whether semctl IPC_STAT can use struct semid_ds pointer | |
167 | $cat > try.c <<'END' | |
168 | #include <sys/types.h> | |
169 | #include <sys/ipc.h> | |
170 | #include <sys/sem.h> | |
171 | #include <sys/stat.h> | |
172 | #include "try.h" | |
173 | #include <stdio.h> | |
174 | #include <errno.h> | |
175 | #ifndef errno | |
176 | extern int errno; | |
177 | #endif | |
178 | int main() { | |
179 | struct semid_ds arg; | |
180 | int sem, st; | |
181 | ||
182 | #if defined(IPC_PRIVATE) && defined(S_IRWXU) && defined(S_IRWXG) && defined(S_IRWXO) && defined(IPC_CREAT) | |
183 | sem = semget(IPC_PRIVATE, 1, S_IRWXU|S_IRWXG|S_IRWXO|IPC_CREAT); | |
184 | if (sem > -1) { | |
185 | # ifdef IPC_STAT | |
186 | st = semctl(sem, 0, IPC_STAT, &arg); | |
187 | if (st == 0) | |
188 | printf("semid_ds\n"); | |
189 | else | |
190 | # endif /* IPC_STAT */ | |
191 | printf("semctl IPC_STAT failed: errno = %d\n", errno); | |
192 | # ifdef IPC_RMID | |
193 | if (semctl(sem, 0, IPC_RMID, &arg) != 0) | |
194 | # endif /* IPC_RMID */ | |
195 | printf("semctl IPC_RMID failed: errno = %d\n", errno); | |
196 | } else | |
197 | #endif /* IPC_PRIVATE && ... */ | |
198 | printf("semget failed: errno = %d\n", errno); | |
199 | ||
200 | return 0; | |
201 | } | |
202 | END | |
203 | val="$undef" | |
204 | set try | |
205 | if eval $compile; then | |
0f00356b | 206 | xxx=`$run ./try` |
959f3c4c JH |
207 | case "$xxx" in |
208 | semid_ds) val="$define" ;; | |
209 | esac | |
210 | fi | |
211 | $rm -f try try.c | |
212 | set d_semctl_semid_ds | |
213 | eval $setvar | |
214 | case "$d_semctl_semid_ds" in | |
215 | $define) | |
216 | echo "You can $also use struct semid_ds* for semctl IPC_STAT." >&4 | |
217 | ;; | |
218 | *) echo "You cannot use struct semid_ds* for semctl IPC_STAT." >&4 | |
219 | ;; | |
220 | esac | |
221 | $rm -f try.h | |
222 | ;; | |
223 | *) val="$undef" | |
224 | ||
225 | # We do not have the full sem*(2) library, so assume we can not | |
226 | # use either. | |
227 | ||
228 | set d_semctl_semun | |
229 | eval $setvar | |
230 | ||
231 | set d_semctl_semid_ds | |
232 | eval $setvar | |
233 | ;; | |
234 | esac | |
235 |