This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
/\=/ does not require \ even in older awk
[metaconfig.git] / U / modified / d_union_semun.U
CommitLineData
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:
ce0b6593 29?C: union semun {
959f3c4c
JH
30?C: int val;
31?C: struct semid_ds *buf;
32?C: unsigned short *array;
ce0b6593 33?C: }
959f3c4c
JH
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
0ef0a663 48?F:!try !tryh.h
959f3c4c
JH
49?LINT: set d_union_semun d_semctl_semun d_semctl_semid_ds
50: see whether sys/sem.h defines union semun
51echo " "
52$cat > try.c <<'END'
53#include <sys/types.h>
54#include <sys/ipc.h>
55#include <sys/sem.h>
56int main () { union semun semun; semun.buf = 0; }
57END
58set try
59if eval $compile; then
60 echo "You have union semun in <sys/sem.h>." >&4
61 val="$define"
62else
63 echo "You do not have union semun in <sys/sem.h>." >&4
64 val="$undef"
65fi
2cb64bf6 66$rm_try
959f3c4c
JH
67set d_union_semun
68eval $setvar
69
70: see how to do semctl IPC_STAT
71case "$d_sem" in
72$define)
959f3c4c 73 echo " "
3fb5973e
MB
74?X: use tryh.h instead of try.h because $rm_try cleans up try.*
75 $cat > tryh.h <<END
959f3c4c
JH
76#ifndef S_IRUSR
77# ifdef S_IREAD
78# define S_IRUSR S_IREAD
79# define S_IWUSR S_IWRITE
80# define S_IXUSR S_IEXEC
81# else
82# define S_IRUSR 0400
83# define S_IWUSR 0200
84# define S_IXUSR 0100
85# endif
86# define S_IRGRP (S_IRUSR>>3)
87# define S_IWGRP (S_IWUSR>>3)
88# define S_IXGRP (S_IXUSR>>3)
89# define S_IROTH (S_IRUSR>>6)
90# define S_IWOTH (S_IWUSR>>6)
91# define S_IXOTH (S_IXUSR>>6)
92#endif
93#ifndef S_IRWXU
94# define S_IRWXU (S_IRUSR|S_IWUSR|S_IXUSR)
95# define S_IRWXG (S_IRGRP|S_IWGRP|S_IXGRP)
96# define S_IRWXO (S_IROTH|S_IWOTH|S_IXOTH)
97#endif
98END
b7d0cd4f 99 : see whether semctl IPC_STAT can use union semun
b7d0cd4f
JH
100 case "$d_semctl_semun" in
101 '')
437d7d39 102 val="$undef"
b7d0cd4f 103 $cat > try.c <<END
959f3c4c
JH
104#include <sys/types.h>
105#include <sys/ipc.h>
106#include <sys/sem.h>
107#include <sys/stat.h>
108#include <stdio.h>
109#include <errno.h>
3fb5973e 110#include "tryh.h"
959f3c4c
JH
111#ifndef errno
112extern int errno;
113#endif
114#$d_union_semun HAS_UNION_SEMUN
115int main() {
116 union semun
117#ifndef HAS_UNION_SEMUN
118 {
119 int val;
120 struct semid_ds *buf;
121 unsigned short *array;
122 }
123#endif
124 arg;
125 int sem, st;
126
127#if defined(IPC_PRIVATE) && defined(S_IRWXU) && defined(S_IRWXG) && defined(S_IRWXO) && defined(IPC_CREAT)
128 sem = semget(IPC_PRIVATE, 1, S_IRWXU|S_IRWXG|S_IRWXO|IPC_CREAT);
129 if (sem > -1) {
130 struct semid_ds argbuf;
131 arg.buf = &argbuf;
132# ifdef IPC_STAT
133 st = semctl(sem, 0, IPC_STAT, arg);
134 if (st == 0)
135 printf("semun\n");
136 else
137# endif /* IPC_STAT */
138 printf("semctl IPC_STAT failed: errno = %d\n", errno);
139# ifdef IPC_RMID
140 if (semctl(sem, 0, IPC_RMID, arg) != 0)
437d7d39 141# endif /* IPC_RMID */
959f3c4c
JH
142 printf("semctl IPC_RMID failed: errno = %d\n", errno);
143 } else
144#endif /* IPC_PRIVATE && ... */
145 printf("semget failed: errno = %d\n", errno);
146 return 0;
147}
148END
b7d0cd4f
JH
149 set try
150 if eval $compile; then
151 xxx=`$run ./try`
152 case "$xxx" in
153 semun) val="$define" ;;
154 esac
155 fi
2cb64bf6 156 $rm_try
437d7d39
YST
157 set d_semctl_semun
158 eval $setvar
b7d0cd4f
JH
159 ;;
160 esac
959f3c4c
JH
161 case "$d_semctl_semun" in
162 $define)
163 echo "You can use union semun for semctl IPC_STAT." >&4
164 also='also'
165 ;;
166 *) echo "You cannot use union semun for semctl IPC_STAT." >&4
167 also=''
168 ;;
169 esac
170
171 : see whether semctl IPC_STAT can use struct semid_ds pointer
b7d0cd4f
JH
172 case "$d_semctl_semid_ds" in
173 '')
437d7d39 174 val="$undef"
b7d0cd4f 175 $cat > try.c <<'END'
959f3c4c
JH
176#include <sys/types.h>
177#include <sys/ipc.h>
178#include <sys/sem.h>
179#include <sys/stat.h>
3fb5973e 180#include "tryh.h"
959f3c4c
JH
181#include <stdio.h>
182#include <errno.h>
183#ifndef errno
184extern int errno;
185#endif
186int main() {
3bb8c09c
MBT
187 union semun
188#ifndef HAS_UNION_SEMUN
189 {
190 int val;
191 struct semid_ds *buf;
192 unsigned short *array;
193 }
194#endif
195 arg;
196 struct semid_ds argbuf;
959f3c4c
JH
197 int sem, st;
198
199#if defined(IPC_PRIVATE) && defined(S_IRWXU) && defined(S_IRWXG) && defined(S_IRWXO) && defined(IPC_CREAT)
200 sem = semget(IPC_PRIVATE, 1, S_IRWXU|S_IRWXG|S_IRWXO|IPC_CREAT);
201 if (sem > -1) {
3bb8c09c 202 arg.buf = &argbuf;
959f3c4c 203# ifdef IPC_STAT
3bb8c09c 204 st = semctl(sem, 0, IPC_STAT, arg);
959f3c4c
JH
205 if (st == 0)
206 printf("semid_ds\n");
207 else
208# endif /* IPC_STAT */
209 printf("semctl IPC_STAT failed: errno = %d\n", errno);
210# ifdef IPC_RMID
3bb8c09c 211 if (semctl(sem, 0, IPC_RMID, arg) != 0)
959f3c4c
JH
212# endif /* IPC_RMID */
213 printf("semctl IPC_RMID failed: errno = %d\n", errno);
214 } else
215#endif /* IPC_PRIVATE && ... */
216 printf("semget failed: errno = %d\n", errno);
217
218 return 0;
219}
220END
b7d0cd4f
JH
221 set try
222 if eval $compile; then
223 xxx=`$run ./try`
224 case "$xxx" in
225 semid_ds) val="$define" ;;
226 esac
227 fi
2cb64bf6 228 $rm_try
437d7d39
YST
229 set d_semctl_semid_ds
230 eval $setvar
b7d0cd4f
JH
231 ;;
232 esac
959f3c4c
JH
233 case "$d_semctl_semid_ds" in
234 $define)
235 echo "You can $also use struct semid_ds* for semctl IPC_STAT." >&4
236 ;;
237 *) echo "You cannot use struct semid_ds* for semctl IPC_STAT." >&4
238 ;;
239 esac
959f3c4c
JH
240 ;;
241*) val="$undef"
242
243 # We do not have the full sem*(2) library, so assume we can not
244 # use either.
245
246 set d_semctl_semun
247 eval $setvar
248
249 set d_semctl_semid_ds
250 eval $setvar
251 ;;
252esac
3fb5973e 253$rm_try tryh.h
959f3c4c 254