From: Malcolm Beattie Date: Thu, 28 May 1998 17:55:48 +0000 (+0000) Subject: Back out change 1043 since Andy's forthcoming Config patch X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=1d26b16b4a5b44b9f5893c8b4c8ce90d163883e5;p=p5sagit%2Fp5-mst-13.2.git Back out change 1043 since Andy's forthcoming Config patch includes a modified version. p4raw-id: //depot/perl@1046 --- diff --git a/Configure b/Configure index 04ab73c..79b7a5d 100755 --- a/Configure +++ b/Configure @@ -408,9 +408,6 @@ d_sem='' d_semctl='' d_semget='' d_semop='' -d_union_semun='' -d_semctl_semun='' -d_semctl_semid_ds='' d_setegid='' d_seteuid='' d_setgrps='' @@ -7948,162 +7945,6 @@ fi set d_sem eval $setvar -: see how to do semctl IPC_STAT -case "$h_sem$d_sem$d_semctl" in -true$define$define) - : see whether sys/sem.h defines union semun - $cat > try.c <<'END' -#include -#include -#include -int main () { union semun semun; semun.buf = 0; } -END - if $cc $ccflags -o try try.c > /dev/null 2>&1; then - echo "You have union semun in ." >&4 - val="$define" - else - echo "You do not have union semun in ." >&4 - val="$undef" - fi - $rm -f try try.c - set d_union_semun - eval $setvar - - : see whether semctl IPC_STAT can use union semun - $cat > try.c < -#include -#include -#include -#include -#include -#ifndef errno -extern int errno; -#endif -#$d_union_semun HAS_UNION_SEMUN -int main() { - union semun -#ifndef HAS_UNION_SEMUN - { - int val; - struct semid_ds *buf; - unsigned short *array; - } -#endif - arg; - int sem, st; - -#if defined(IPC_PRIVATE) && defined(S_IRWXU) && defined(S_IRWXG) && \ - defined(S_IRWXO) && defined(IPC_CREAT) - sem = semget(IPC_PRIVATE, 1, S_IRWXU|S_IRWXG|S_IRWXO|IPC_CREAT); - if (sem > -1) { - struct semid_ds argbuf; - arg.buf = &argbuf; -# ifdef IPC_STAT - st = semctl(sem, 0, IPC_STAT, arg); - if (st == 0) - printf("semun\n"); - else -# endif /* IPC_STAT */ - printf("semctl IPC_STAT failed: errno = %d\n", errno); -# ifdef IPC_RMID - if (semctl(sem, 0, IPC_RMID, arg) != 0) -# endif /* IPC_RMID */ - printf("semctl IPC_RMID failed: errno = %d\n", errno); - } else -#endif /* IPC_PRIVATE && ... */ - printf("semget failed: errno = %d\n", errno); - - return 0; -} -END - val="$undef" - if $cc $ccflags -o try try.c > /dev/null 2>&1; then - d_semctl_semun=`./try` - case "$d_semctl_semun" in - semun) val="$define" ;; - esac - fi - $rm -f try try.c - set d_semctl_semun - eval $setvar - case "$d_semctl_semun" in - $define|true) - echo "You can use union semun for semctl IPC_STAT." >&4 - ;; - *) echo "You cannot use union semun for semctl IPC_STAT." >&4 - ;; - esac - - : see whether semctl IPC_STAT can use struct semid_ds pointer - - $cat > try.c <<'END' -#include -#include -#include -#include -#include -#include -#ifndef errno -extern int errno; -#endif -int main() { - struct semid_ds arg; - int sem, st; - -#if defined(IPC_PRIVATE) && defined(S_IRWXU) && defined(S_IRWXG) && \ - defined(S_IRWXO) && defined(IPC_CREAT) - sem = semget(IPC_PRIVATE, 1, S_IRWXU|S_IRWXG|S_IRWXO|IPC_CREAT); - if (sem > -1) { -# ifdef IPC_STAT - st = semctl(sem, 0, IPC_STAT, &arg); - if (st == 0) - printf("semid_ds\n"); - else -# endif /* IPC_STAT */ - printf("semctl IPC_STAT failed: errno = %d\n", errno); -# ifdef IPC_RMID - if (semctl(sem, 0, IPC_RMID, &arg) != 0) -# endif /* IPC_RMID */ - printf("semctl IPC_RMID failed: errno = %d\n", errno); - } else -#endif /* IPC_PRIVATE && ... */ - printf("semget failed: errno = %d\n", errno); - - return 0; -} -END - val="$undef" - if $cc $ccflags -o try try.c > /dev/null 2>&1; then - d_semctl_semid_ds=`./try` - case "$d_semctl_semid_ds" in - semid_ds) val="$define" ;; - esac - fi - $rm -f try try.c - set d_semctl_semid_ds - eval $setvar - case "$d_semctl_semid_ds" in - $define|true) - echo "You can use struct semid_ds * for semctl IPC_STAT." >&4 - ;; - *) echo "You cannot use struct semid_ds * for semctl IPC_STAT." >&4 - ;; - esac - ;; -*) val="$undef" - - set d_union_semun - eval $setvar - - set d_semctl_semun - eval $setvar - - set d_semctl_semid_ds - eval $setvar - ;; -esac - : see if setegid exists set setegid d_setegid eval $inlibc @@ -11293,9 +11134,6 @@ d_sem='$d_sem' d_semctl='$d_semctl' d_semget='$d_semget' d_semop='$d_semop' -d_union_semun='$d_union_semun' -d_semctl_semun='$d_semctl_semun' -d_semctl_semid_ds='$d_semctl_semid_ds' d_setegid='$d_setegid' d_seteuid='$d_seteuid' d_setgrps='$d_setgrps' diff --git a/config_h.SH b/config_h.SH index ab532e5..78486ba 100644 --- a/config_h.SH +++ b/config_h.SH @@ -536,30 +536,6 @@ sed <config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un- */ #$d_sem HAS_SEM /**/ -/* HAS_UNION_SEMUN: - * This symbol, if defined, indicates that the union semun - * is defined in . If not, the user code probably - * needs to define it as: - * union semun { - * int val; - * struct semid_ds *buf; - * unsigned short *array; - * } - */ -#$d_union_semun HAS_UNION_SEMUN /**/ - -/* USE_SEMCTL_SEMUN: - * This symbol, if defined, indicates that union semun is - * used for semctl IPC_STAT. - */ -#$d_semctl_semun USE_SEMCTL_SEMUN /**/ - -/* USE_SEMCTL_SEMID_DS: - * This symbol, if defined, indicates that struct semid_ds * is - * used for semctl IPC_STAT. - */ -#$d_semctl_semid_ds USE_SEMCTL_SEMID_DS /**/ - /* HAS_SETEGID: * This symbol, if defined, indicates that the setegid routine is available * to change the effective gid of the current program. diff --git a/doio.c b/doio.c index 37d6167..bbf3837 100644 --- a/doio.c +++ b/doio.c @@ -1389,6 +1389,21 @@ do_ipcget(I32 optype, SV **mark, SV **sp) return -1; /* should never happen */ } +#if defined(__sun) && defined(__svr4__) /* XXX Need metaconfig test */ +/* Solaris manpage says that it uses (like linux) + int semctl (int semid, int semnum, int cmd, union semun arg) + but the system include files do not define union semun !!!! + Note: Linux/glibc *does* declare union semun in + but, unlike the older Linux libc and Solaris, it has an extra + struct seminfo * on the end. +*/ +union semun { + int val; + struct semid_ds *buf; + ushort *array; +}; +#endif + I32 do_ipcctl(I32 optype, SV **mark, SV **sp) { @@ -1397,6 +1412,26 @@ do_ipcctl(I32 optype, SV **mark, SV **sp) char *a; I32 id, n, cmd, infosize, getinfo; I32 ret = -1; +/* XXX REALLY need metaconfig test */ +/* linux and Solaris2 use: + int semctl (int semid, int semnum, int cmd, union semun arg) + instead of: + int semctl (int semid, int semnum, int cmd, struct semid_ds *arg); + Solaris and Linux (pre-glibc) use + union semun { + int val; + struct semid_ds *buf; + ushort *array; + }; + but Solaris doesn't declare it in a header file (we declared it + explicitly earlier). Linux/glibc declares a *different* union semun + so we just refer to "union semun" here. + +*/ +#if defined(__linux__) || (defined(__sun__) && defined(__svr4__)) +# define SEMCTL_SEMUN + union semun unsemds, semun; +#endif id = SvIVx(*++mark); n = (optype == OP_SEMCTL) ? SvIVx(*++mark) : 0; @@ -1426,9 +1461,13 @@ do_ipcctl(I32 optype, SV **mark, SV **sp) else if (cmd == GETALL || cmd == SETALL) { struct semid_ds semds; - union semun semun; - +#ifdef SEMCTL_SEMUN semun.buf = &semds; + if (semctl(id, 0, IPC_STAT, semun) == -1) +#else + if (semctl(id, 0, IPC_STAT, &semds) == -1) +#endif + return -1; getinfo = (cmd == GETALL); infosize = semds.sem_nsems * sizeof(short); /* "short" is technically wrong but much more portable @@ -1472,12 +1511,14 @@ do_ipcctl(I32 optype, SV **mark, SV **sp) break; #endif #ifdef HAS_SEM - case OP_SEMCTL: { - union semun unsemds; - - unsemds.buf = (struct semid_ds *)a; - ret = Semctl(id, n, cmd, unsemds); - } + case OP_SEMCTL: +#ifdef SEMCTL_SEMUN + /* XXX Need metaconfig test */ + unsemds.buf = (struct semid_ds *)a; + ret = semctl(id, n, cmd, unsemds); +#else + ret = semctl(id, n, cmd, (struct semid_ds *)a); +#endif break; #endif #ifdef HAS_SHM diff --git a/perl.h b/perl.h index 8645c39..fc96064 100644 --- a/perl.h +++ b/perl.h @@ -2090,26 +2090,6 @@ enum { UNLOCK_SV_MUTEX; \ } while (0) -#ifdef HAS_SEM -# include -# include -# ifndef HAS_UNION_SEMUN /* Provide the union semun. */ - union semun { - int val; - struct semid_ds *buf; - unsigned short *array; - }; -# endif -# ifdef USE_SEMCTL_SEMUN -# define Semctl(id, num, cmd, semun) semctl(id, num, cmd, semun) -# else -# ifdef USE_SEMCTL_SEMID_DS -# define Semctl(id, num, cmd, semun) semctl(id, num, cmd, semun.buf) -# endif -# endif -# ifndef Semctl /* Place our bets on the semun horse. */ -# define Semctl(id, num, cmd, semun) semctl(id, num, cmd, semun) -# endif -#endif #endif /* Include guard */ +