diff options
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | sysdeps/generic/semctl.c | 8 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/semctl.c | 31 |
3 files changed, 30 insertions, 13 deletions
diff --git a/ChangeLog b/ChangeLog index 520c7ebbc3..9e5ed4233b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 1998-04-28 Ulrich Drepper <drepper@cygnus.com> + * sysdeps/unix/sysv/linux/semctl.c (semctl): Define own union + semun and use stdarg macros to get the value. + * sysdeps/generic/semctl.c: Don't use union semun. + * sysvipc/sys/sem.h: Don't use union semun in semctl prototype. * string/basename.c [!_LIBC]: Define function as gnu_basename. diff --git a/sysdeps/generic/semctl.c b/sysdeps/generic/semctl.c index 297c26bb8a..30cbffae4f 100644 --- a/sysdeps/generic/semctl.c +++ b/sysdeps/generic/semctl.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. +/* Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995. @@ -24,11 +24,7 @@ KEY. */ int -semctl (semid, semnum, cmd, arg) - int semid; - int semnum; - int cmd; - union semun arg; +semctl (int semid, int semnum, int cmd, ...) { __set_errno (ENOSYS); return -1; diff --git a/sysdeps/unix/sysv/linux/semctl.c b/sysdeps/unix/sysv/linux/semctl.c index 3d95e08d98..c87b407d2c 100644 --- a/sysdeps/unix/sysv/linux/semctl.c +++ b/sysdeps/unix/sysv/linux/semctl.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995, 1997 Free Software Foundation, Inc. +/* Copyright (C) 1995, 1997, 1998 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995. @@ -17,17 +17,34 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#include <stdarg.h> #include <sys/sem.h> +/* Define a `union semun' suitable for Linux here. */ +union semun +{ + int val; /* value for SETVAL */ + struct semid_ds *buf; /* buffer for IPC_STAT & IPC_SET */ + unsigned short int *array; /* array for GETALL & SETALL */ + struct seminfo *__buf; /* buffer for IPC_INFO */ +}; + + /* Return identifier for array of NSEMS semaphores associated with KEY. */ int -semctl (semid, semnum, cmd, arg) - int semid; - int semnum; - int cmd; - union semun arg; +semctl (int semid, int semnum, int cmd, ...) { - return __ipc (IPCOP_semctl, semid, semnum, cmd, &arg); + union semun *arg; + va_list ap; + + va_start (ap, cmd); + + /* Get a pointer the argument. */ + arg = &va_arg (ap, union semun); + + va_end (ap); + + return __ipc (IPCOP_semctl, semid, semnum, cmd, arg); } |