This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
The URL for the dist source repo changed
[metaconfig.git] / U / modified / d_union_semun.U
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:
10 ?MAKE:d_union_semun d_semctl_semun d_semctl_semid_ds: Compile Setvar Myread run \
11         cat rm_try 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
48 ?F:!try
49 ?LINT: set d_union_semun d_semctl_semun d_semctl_semid_ds
50 : see whether sys/sem.h defines union semun
51 echo " "
52 $cat > try.c <<'END'
53 #include <sys/types.h>
54 #include <sys/ipc.h>
55 #include <sys/sem.h>
56 int main () { union semun semun; semun.buf = 0; }
57 END
58 set try
59 if eval $compile; then
60     echo "You have union semun in <sys/sem.h>." >&4
61     val="$define"
62 else
63     echo "You do not have union semun in <sys/sem.h>." >&4
64     val="$undef"
65 fi
66 $rm_try
67 set d_union_semun
68 eval $setvar
69
70 : see how to do semctl IPC_STAT
71 case "$d_sem" in
72 $define)
73     echo " "
74 ?X: use tryh.h instead of try.h because $rm_try cleans up try.*
75     $cat > tryh.h <<END
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
98 END
99     : see whether semctl IPC_STAT can use union semun
100     case "$d_semctl_semun" in
101     '')
102       val="$undef"
103       $cat > try.c <<END
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>
110 #include "tryh.h"
111 #ifndef errno
112 extern int errno;
113 #endif
114 #$d_union_semun HAS_UNION_SEMUN
115 int 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)
141 #       endif /* IPC_RMID */
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 }
148 END
149       set try
150       if eval $compile; then
151           xxx=`$run ./try`
152           case "$xxx" in
153           semun) val="$define" ;;
154           esac
155       fi
156       $rm_try
157       set d_semctl_semun
158       eval $setvar
159       ;;
160     esac
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
172     case "$d_semctl_semid_ds" in
173     '')
174       val="$undef"
175       $cat > try.c <<'END'
176 #include <sys/types.h>
177 #include <sys/ipc.h>
178 #include <sys/sem.h>
179 #include <sys/stat.h>
180 #include "tryh.h"
181 #include <stdio.h>
182 #include <errno.h>
183 #ifndef errno
184 extern int errno;
185 #endif
186 int main() {
187     struct semid_ds arg;
188     int sem, st;
189
190 #if defined(IPC_PRIVATE) && defined(S_IRWXU) && defined(S_IRWXG) &&  defined(S_IRWXO) && defined(IPC_CREAT)
191     sem = semget(IPC_PRIVATE, 1, S_IRWXU|S_IRWXG|S_IRWXO|IPC_CREAT);
192     if (sem > -1) {
193 #       ifdef IPC_STAT
194         st = semctl(sem, 0, IPC_STAT, &arg);
195         if (st == 0)
196             printf("semid_ds\n");
197         else
198 #       endif /* IPC_STAT */
199             printf("semctl IPC_STAT failed: errno = %d\n", errno);
200 #       ifdef IPC_RMID
201         if (semctl(sem, 0, IPC_RMID, &arg) != 0)
202 #       endif /* IPC_RMID */
203             printf("semctl IPC_RMID failed: errno = %d\n", errno);
204     } else
205 #endif /* IPC_PRIVATE && ... */
206         printf("semget failed: errno = %d\n", errno);
207
208     return 0;
209 }
210 END
211       set try
212       if eval $compile; then
213           xxx=`$run ./try`
214           case "$xxx" in
215           semid_ds) val="$define" ;;
216           esac
217       fi
218       $rm_try
219       set d_semctl_semid_ds
220       eval $setvar
221       ;;
222     esac
223     case "$d_semctl_semid_ds" in
224     $define)
225         echo "You can $also use struct semid_ds* for semctl IPC_STAT." >&4
226         ;;
227     *)  echo "You cannot use struct semid_ds* for semctl IPC_STAT." >&4
228         ;;
229     esac
230     ;;
231 *)  val="$undef"
232
233     # We do not have the full sem*(2) library, so assume we can not
234     # use either.
235
236     set d_semctl_semun
237     eval $setvar
238
239     set d_semctl_semid_ds
240     eval $setvar
241     ;;
242 esac
243 $rm_try tryh.h
244