This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
RE: [perl #26136] localtime(3) calls tzset(3), but localtime_r(3) may not.
[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 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 ?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
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     echo " "
73     $cat > try.h <<END
74 #ifndef S_IRUSR
75 #   ifdef S_IREAD
76 #       define S_IRUSR S_IREAD
77 #       define S_IWUSR S_IWRITE
78 #       define S_IXUSR S_IEXEC
79 #   else
80 #       define S_IRUSR 0400
81 #       define S_IWUSR 0200
82 #       define S_IXUSR 0100
83 #   endif
84 #   define S_IRGRP (S_IRUSR>>3)
85 #   define S_IWGRP (S_IWUSR>>3)
86 #   define S_IXGRP (S_IXUSR>>3)
87 #   define S_IROTH (S_IRUSR>>6)
88 #   define S_IWOTH (S_IWUSR>>6)
89 #   define S_IXOTH (S_IXUSR>>6)
90 #endif
91 #ifndef S_IRWXU
92 #   define S_IRWXU (S_IRUSR|S_IWUSR|S_IXUSR)
93 #   define S_IRWXG (S_IRGRP|S_IWGRP|S_IXGRP)
94 #   define S_IRWXO (S_IROTH|S_IWOTH|S_IXOTH)
95 #endif
96 END
97     : see whether semctl IPC_STAT can use union semun
98     case "$d_semctl_semun" in
99     '')
100       val="$undef"
101       $cat > try.c <<END
102 #include <sys/types.h>
103 #include <sys/ipc.h>
104 #include <sys/sem.h>
105 #include <sys/stat.h>
106 #include <stdio.h>
107 #include <errno.h>
108 #include "try.h"
109 #ifndef errno
110 extern int errno;
111 #endif
112 #$d_union_semun HAS_UNION_SEMUN
113 int main() {
114     union semun
115 #ifndef HAS_UNION_SEMUN
116     {
117         int val;
118         struct semid_ds *buf;
119         unsigned short *array;
120     }
121 #endif
122     arg;
123     int sem, st;
124
125 #if defined(IPC_PRIVATE) && defined(S_IRWXU) && defined(S_IRWXG) && defined(S_IRWXO) && defined(IPC_CREAT)
126     sem = semget(IPC_PRIVATE, 1, S_IRWXU|S_IRWXG|S_IRWXO|IPC_CREAT);
127     if (sem > -1) {
128         struct semid_ds argbuf;
129         arg.buf = &argbuf;
130 #       ifdef IPC_STAT
131         st = semctl(sem, 0, IPC_STAT, arg);
132         if (st == 0)
133             printf("semun\n");
134         else
135 #       endif /* IPC_STAT */
136             printf("semctl IPC_STAT failed: errno = %d\n", errno);
137 #       ifdef IPC_RMID
138         if (semctl(sem, 0, IPC_RMID, arg) != 0)
139 #       endif /* IPC_RMID */
140             printf("semctl IPC_RMID failed: errno = %d\n", errno);
141     } else
142 #endif /* IPC_PRIVATE && ... */
143         printf("semget failed: errno = %d\n", errno);
144   return 0;
145 }
146 END
147       set try
148       if eval $compile; then
149           xxx=`$run ./try`
150           case "$xxx" in
151           semun) val="$define" ;;
152           esac
153       fi
154       $rm -f try try.c
155       set d_semctl_semun
156       eval $setvar
157       ;;
158     esac
159     case "$d_semctl_semun" in
160     $define)
161         echo "You can use union semun for semctl IPC_STAT." >&4
162         also='also'
163         ;;
164     *)  echo "You cannot use union semun for semctl IPC_STAT." >&4
165         also=''
166         ;;
167     esac
168
169     : see whether semctl IPC_STAT can use struct semid_ds pointer
170     case "$d_semctl_semid_ds" in
171     '')
172       val="$undef"
173       $cat > try.c <<'END'
174 #include <sys/types.h>
175 #include <sys/ipc.h>
176 #include <sys/sem.h>
177 #include <sys/stat.h>
178 #include "try.h"
179 #include <stdio.h>
180 #include <errno.h>
181 #ifndef errno
182 extern int errno;
183 #endif
184 int main() {
185     struct semid_ds arg;
186     int sem, st;
187
188 #if defined(IPC_PRIVATE) && defined(S_IRWXU) && defined(S_IRWXG) &&  defined(S_IRWXO) && defined(IPC_CREAT)
189     sem = semget(IPC_PRIVATE, 1, S_IRWXU|S_IRWXG|S_IRWXO|IPC_CREAT);
190     if (sem > -1) {
191 #       ifdef IPC_STAT
192         st = semctl(sem, 0, IPC_STAT, &arg);
193         if (st == 0)
194             printf("semid_ds\n");
195         else
196 #       endif /* IPC_STAT */
197             printf("semctl IPC_STAT failed: errno = %d\n", errno);
198 #       ifdef IPC_RMID
199         if (semctl(sem, 0, IPC_RMID, &arg) != 0)
200 #       endif /* IPC_RMID */
201             printf("semctl IPC_RMID failed: errno = %d\n", errno);
202     } else
203 #endif /* IPC_PRIVATE && ... */
204         printf("semget failed: errno = %d\n", errno);
205
206     return 0;
207 }
208 END
209       set try
210       if eval $compile; then
211           xxx=`$run ./try`
212           case "$xxx" in
213           semid_ds) val="$define" ;;
214           esac
215       fi
216       $rm -f try try.c
217       set d_semctl_semid_ds
218       eval $setvar
219       ;;
220     esac
221     case "$d_semctl_semid_ds" in
222     $define)
223         echo "You can $also use struct semid_ds* for semctl IPC_STAT." >&4
224         ;;
225     *)  echo "You cannot use struct semid_ds* for semctl IPC_STAT." >&4
226         ;;
227     esac
228     $rm -f try.h
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
242