diff options
Diffstat (limited to 'sysdeps/unix')
-rw-r--r-- | sysdeps/unix/sysv/linux/semctl.c | 31 |
1 files changed, 24 insertions, 7 deletions
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); } |