xref: /freebsd/lib/libc/gen/semctl.c (revision c11e094d96120a2e0e726ed9705ae0ec08db49b6)
1 #include <sys/cdefs.h>
2 __FBSDID("$FreeBSD$");
3 
4 #include <sys/types.h>
5 #include <sys/ipc.h>
6 #include <sys/sem.h>
7 #if __STDC__
8 #include <stdarg.h>
9 #else
10 #include <varargs.h>
11 #endif
12 #include <stdlib.h>
13 
14 #if __STDC__
15 int semctl(int semid, int semnum, int cmd, ...)
16 #else
17 int semctl(semid, semnum, cmd, va_alist)
18 	int semid, semnum;
19 	int cmd;
20 	va_dcl
21 #endif
22 {
23 	va_list ap;
24 	union semun semun;
25 	union semun *semun_ptr;
26 #if __STDC__
27 	va_start(ap, cmd);
28 #else
29 	va_start(ap);
30 #endif
31 	if (cmd == IPC_SET || cmd == IPC_STAT || cmd == GETALL
32 	    || cmd == SETVAL || cmd == SETALL) {
33 		semun = va_arg(ap, union semun);
34 		semun_ptr = &semun;
35 	} else {
36 		semun_ptr = NULL;
37 	}
38 	va_end(ap);
39 
40 #ifdef	__NETBSD_SYSCALLS
41 	return (__semctl(semid, semnum, cmd, semun_ptr));
42 #else
43 	return (semsys(0, semid, semnum, cmd, semun_ptr));
44 #endif
45 }
46