From 3f58cad6388b21fbbcdc7285fc907d620c32cf1a Mon Sep 17 00:00:00 2001 From: Steve Price Date: Sun, 31 May 1998 04:09:09 +0000 Subject: [PATCH] Several sources including Unix98 say that semctl's fourth parameter is optional except where: cmd == {IPC_SET || IPC_STAT || GETALL || SETVAL || SETALL} PR: 2448 Reviewed by: bde Submitted by: Tim Singletary Minor tweaks by: steve --- lib/libc/gen/semctl.c | 31 +++++++++++++++++++++++++------ sys/sys/sem.h | 4 ++-- 2 files changed, 27 insertions(+), 8 deletions(-) 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