xref: /dflybsd-src/lib/libc/gen/sysvipc_semctl.c (revision 08f3ae3e21d368468aa4fb2d779eda101befe182)
1 /* $DragonFly: src/lib/libc/gen/semctl.c,v 1.3 2005/04/26 06:08:42 joerg Exp $
2  * $DragonFly: src/lib/libc/gen/msgget.c,v 1.2 2013/09/24 21:37:00 Lrisa Grigore <larisagrigore@gmail.com> Exp $
3  */
4 
5 #include <sys/types.h>
6 #include <sys/ipc.h>
7 #include <sys/sem.h>
8 #include <stdarg.h>
9 #include <stdlib.h>
10 
11 #include "sysvipc_sem.h"
12 
13 extern char use_userland_impl;
14 
15 int
16 semctl(int semid, int semnum, int cmd, ...)
17 {
18 	va_list ap;
19 	union semun semun = {0};
20 	union semun *semun_ptr = NULL;
21 	va_start(ap, cmd);
22 	if (cmd == IPC_SET || cmd == IPC_STAT || cmd == GETALL
23 	    || cmd == SETVAL || cmd == SETALL) {
24 		semun = va_arg(ap, union semun);
25 		semun_ptr = &semun;
26 	}
27 	va_end(ap);
28 
29 	if (use_userland_impl)
30 		return (sysvipc_semctl(semid, semnum, cmd, semun));
31 	return (semsys(0, semid, semnum, cmd, semun_ptr));
32 }
33