Date: Thu, 21 Dec 1995 16:25:10 -0500 From: tsingle@sunland.gsfc.nasa.gov (Tim Singletary) To: hackers@freebsd.org Subject: semctl() portability issue and fix Message-ID: <199512212125.QAA10262@sunward.gsfc.nasa.gov.gsfc743>
next in thread | raw e-mail | index | archive | help
FreeBSD 2.1, in /usr/include/sys/sem.h declares
int semctl __P((int, int, int, union semun));
Note that the fourth argument to semctl() is required. Other unix
systems (SunOS, Solaris, HPUX, and OSF1, to name a few) treat the
fourth argument as optional unless the third argument is SETVAL,
GETALL, SETALL, IPC_STAT, or IPC_SET. The SunOS manual
_Porting_Software_to_SPARC_ even says:
Programs that call semctl() with these subcommands [those
requiring a fourth argument] must pass the union itself, rather
than an element of the union, or a constant such as 0 (zero).
Programs that call semctl() with other subcommands should omit the
fourth argument, rather than pass a constant such as 0 (zero).
So there's a portability issue: code which compiles and runs just
fine on other systems won't compile on FreeBSD!
I've `fixed' things so that the fourth argument is optional on my
system. My fix ignores the ``#if __STDC__'' wrapper in the original
semctl.c -- won't it always get compiled in a `__STDC__'
environment?
Anyway, here's what I've done:
1: I changed line 164 of /usr/include/sys/sem.h from
int semctl __P((int, int, int, union semun));
to
int semctl __P((int, int, int, ...));
2: I replaced /usr/src/lib/libc/gen/semctl.c with
-begin--------------
#include <stdarg.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int semctl(int semid, int semnum, int cmd, ...)
{
va_list ap;
union semun fourth_arg;
union semun *fourth_arg_ptr;
va_start(ap,cmd);
if (cmd == IPC_SET || cmd == IPC_STAT || cmd == GETALL
|| cmd == SETVAL || cmd == SETALL) {
fourth_arg = va_arg(ap, union semun);
fourth_arg_ptr = &fourth_arg;
}
fourth_arg_ptr = NULL;
va_end(ap);
return (semsys(0, semid, semnum, cmd, fourth_arg_ptr));
}
-end----------------
Anyway, I'd appreciate all comments! Naturally, I'd like to see this
(or some other fix) make its way into the FreeBSD source tree.
tim
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199512212125.QAA10262>
