diff --git a/lib/libc/gen/semctl.c b/lib/libc/gen/semctl.c index b0ed7235038..96a86269f6e 100644 --- a/lib/libc/gen/semctl.c +++ b/lib/libc/gen/semctl.c @@ -1,19 +1,38 @@ #include #include #include +#include +#include #if __STDC__ -int semctl(int semid, int semnum, int cmd, union semun semun) +int semctl(int semid, int semnum, int cmd, ...) #else -int semctl(semid, int semnum, cmd, semun) +int semctl(semid, semnum, cmd, va_alist) int semid, semnum; int cmd; - union semun semun; + va_dcl #endif { -#ifdef __NETBSD_SYSCALLS - return (__semctl(semid, semnum, cmd, &semun)); + va_list ap; + union semun semun; + union semun *semun_ptr; +#ifdef __STDC__ + va_start(ap, cmd); #else - return (semsys(0, semid, semnum, cmd, &semun)); + va_start(ap); +#endif + if (cmd == IPC_SET || cmd == IPC_STAT || cmd == GETALL + || cmd == SETVAL || cmd == SETALL) { + semun = va_arg(ap, union semun); + semun_ptr = &semun; + } else { + semun_ptr = NULL; + } + va_end(ap); + +#ifdef __NETBSD_SYSCALLS + return (__semctl(semid, semnum, cmd, semun_ptr)); +#else + return (semsys(0, semid, semnum, cmd, semun_ptr)); #endif } diff --git a/sys/sys/sem.h b/sys/sys/sem.h index ef3086a6b1e..debd5991d38 100644 --- a/sys/sys/sem.h +++ b/sys/sys/sem.h @@ -1,4 +1,4 @@ -/* $Id: sem.h,v 1.12 1997/02/22 09:45:51 peter Exp $ */ +/* $Id: sem.h,v 1.13 1997/09/07 05:27:21 bde Exp $ */ /* $NetBSD: sem.h,v 1.5 1994/06/29 06:45:15 cgd Exp $ */ /* @@ -171,7 +171,7 @@ typedef enum { __BEGIN_DECLS int semsys __P((int, ...)); -int semctl __P((int, int, int, union semun)); +int semctl __P((int, int, int, ...)); int semget __P((key_t, int, int)); int semop __P((int, struct sembuf *,unsigned)); __END_DECLS