| 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 !tryh.h |
| 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 | |