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 \ |
2cb64bf6 | 11 | cat rm_try d_sem |
959f3c4c JH |
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 | |
2cb64bf6 | 65 | $rm_try |
959f3c4c JH |
66 | set d_union_semun |
67 | eval $setvar | |
68 | ||
69 | : see how to do semctl IPC_STAT | |
70 | case "$d_sem" in | |
71 | $define) | |
959f3c4c | 72 | echo " " |
3fb5973e MB |
73 | ?X: use tryh.h instead of try.h because $rm_try cleans up try.* |
74 | $cat > tryh.h <<END | |
959f3c4c JH |
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 | |
b7d0cd4f | 98 | : see whether semctl IPC_STAT can use union semun |
b7d0cd4f JH |
99 | case "$d_semctl_semun" in |
100 | '') | |
437d7d39 | 101 | val="$undef" |
b7d0cd4f | 102 | $cat > try.c <<END |
959f3c4c JH |
103 | #include <sys/types.h> |
104 | #include <sys/ipc.h> | |
105 | #include <sys/sem.h> | |
106 | #include <sys/stat.h> | |
107 | #include <stdio.h> | |
108 | #include <errno.h> | |
3fb5973e | 109 | #include "tryh.h" |
959f3c4c JH |
110 | #ifndef errno |
111 | extern int errno; | |
112 | #endif | |
113 | #$d_union_semun HAS_UNION_SEMUN | |
114 | int main() { | |
115 | union semun | |
116 | #ifndef HAS_UNION_SEMUN | |
117 | { | |
118 | int val; | |
119 | struct semid_ds *buf; | |
120 | unsigned short *array; | |
121 | } | |
122 | #endif | |
123 | arg; | |
124 | int sem, st; | |
125 | ||
126 | #if defined(IPC_PRIVATE) && defined(S_IRWXU) && defined(S_IRWXG) && defined(S_IRWXO) && defined(IPC_CREAT) | |
127 | sem = semget(IPC_PRIVATE, 1, S_IRWXU|S_IRWXG|S_IRWXO|IPC_CREAT); | |
128 | if (sem > -1) { | |
129 | struct semid_ds argbuf; | |
130 | arg.buf = &argbuf; | |
131 | # ifdef IPC_STAT | |
132 | st = semctl(sem, 0, IPC_STAT, arg); | |
133 | if (st == 0) | |
134 | printf("semun\n"); | |
135 | else | |
136 | # endif /* IPC_STAT */ | |
137 | printf("semctl IPC_STAT failed: errno = %d\n", errno); | |
138 | # ifdef IPC_RMID | |
139 | if (semctl(sem, 0, IPC_RMID, arg) != 0) | |
437d7d39 | 140 | # endif /* IPC_RMID */ |
959f3c4c JH |
141 | printf("semctl IPC_RMID failed: errno = %d\n", errno); |
142 | } else | |
143 | #endif /* IPC_PRIVATE && ... */ | |
144 | printf("semget failed: errno = %d\n", errno); | |
145 | return 0; | |
146 | } | |
147 | END | |
b7d0cd4f JH |
148 | set try |
149 | if eval $compile; then | |
150 | xxx=`$run ./try` | |
151 | case "$xxx" in | |
152 | semun) val="$define" ;; | |
153 | esac | |
154 | fi | |
2cb64bf6 | 155 | $rm_try |
437d7d39 YST |
156 | set d_semctl_semun |
157 | eval $setvar | |
b7d0cd4f JH |
158 | ;; |
159 | esac | |
959f3c4c JH |
160 | case "$d_semctl_semun" in |
161 | $define) | |
162 | echo "You can use union semun for semctl IPC_STAT." >&4 | |
163 | also='also' | |
164 | ;; | |
165 | *) echo "You cannot use union semun for semctl IPC_STAT." >&4 | |
166 | also='' | |
167 | ;; | |
168 | esac | |
169 | ||
170 | : see whether semctl IPC_STAT can use struct semid_ds pointer | |
b7d0cd4f JH |
171 | case "$d_semctl_semid_ds" in |
172 | '') | |
437d7d39 | 173 | val="$undef" |
b7d0cd4f | 174 | $cat > try.c <<'END' |
959f3c4c JH |
175 | #include <sys/types.h> |
176 | #include <sys/ipc.h> | |
177 | #include <sys/sem.h> | |
178 | #include <sys/stat.h> | |
3fb5973e | 179 | #include "tryh.h" |
959f3c4c JH |
180 | #include <stdio.h> |
181 | #include <errno.h> | |
182 | #ifndef errno | |
183 | extern int errno; | |
184 | #endif | |
185 | int main() { | |
186 | struct semid_ds arg; | |
187 | int sem, st; | |
188 | ||
189 | #if defined(IPC_PRIVATE) && defined(S_IRWXU) && defined(S_IRWXG) && defined(S_IRWXO) && defined(IPC_CREAT) | |
190 | sem = semget(IPC_PRIVATE, 1, S_IRWXU|S_IRWXG|S_IRWXO|IPC_CREAT); | |
191 | if (sem > -1) { | |
192 | # ifdef IPC_STAT | |
193 | st = semctl(sem, 0, IPC_STAT, &arg); | |
194 | if (st == 0) | |
195 | printf("semid_ds\n"); | |
196 | else | |
197 | # endif /* IPC_STAT */ | |
198 | printf("semctl IPC_STAT failed: errno = %d\n", errno); | |
199 | # ifdef IPC_RMID | |
200 | if (semctl(sem, 0, IPC_RMID, &arg) != 0) | |
201 | # endif /* IPC_RMID */ | |
202 | printf("semctl IPC_RMID failed: errno = %d\n", errno); | |
203 | } else | |
204 | #endif /* IPC_PRIVATE && ... */ | |
205 | printf("semget failed: errno = %d\n", errno); | |
206 | ||
207 | return 0; | |
208 | } | |
209 | END | |
b7d0cd4f JH |
210 | set try |
211 | if eval $compile; then | |
212 | xxx=`$run ./try` | |
213 | case "$xxx" in | |
214 | semid_ds) val="$define" ;; | |
215 | esac | |
216 | fi | |
2cb64bf6 | 217 | $rm_try |
437d7d39 YST |
218 | set d_semctl_semid_ds |
219 | eval $setvar | |
b7d0cd4f JH |
220 | ;; |
221 | esac | |
959f3c4c JH |
222 | case "$d_semctl_semid_ds" in |
223 | $define) | |
224 | echo "You can $also use struct semid_ds* for semctl IPC_STAT." >&4 | |
225 | ;; | |
226 | *) echo "You cannot use struct semid_ds* for semctl IPC_STAT." >&4 | |
227 | ;; | |
228 | esac | |
959f3c4c JH |
229 | ;; |
230 | *) val="$undef" | |
231 | ||
232 | # We do not have the full sem*(2) library, so assume we can not | |
233 | # use either. | |
234 | ||
235 | set d_semctl_semun | |
236 | eval $setvar | |
237 | ||
238 | set d_semctl_semid_ds | |
239 | eval $setvar | |
240 | ;; | |
241 | esac | |
3fb5973e | 242 | $rm_try tryh.h |
959f3c4c | 243 |