xref: /dflybsd-src/lib/libc/gen/sysvipc_semctl.c (revision 61871f77781057bd99cf509b946fe7d352e74309)
182657471SMarkus Pfeiffer #include <sys/types.h>
282657471SMarkus Pfeiffer #include <sys/ipc.h>
382657471SMarkus Pfeiffer #include <sys/sem.h>
482657471SMarkus Pfeiffer #include <stdarg.h>
582657471SMarkus Pfeiffer 
682657471SMarkus Pfeiffer #include "sysvipc_sem.h"
782657471SMarkus Pfeiffer 
88d485ff9SSascha Wildner extern char sysvipc_userland;
9*61871f77SSascha Wildner extern int __sys___semctl(int, int, int, union semun *);
1082657471SMarkus Pfeiffer 
1182657471SMarkus Pfeiffer int
semctl(int semid,int semnum,int cmd,...)1282657471SMarkus Pfeiffer semctl(int semid, int semnum, int cmd, ...)
1382657471SMarkus Pfeiffer {
1482657471SMarkus Pfeiffer 	va_list ap;
1582657471SMarkus Pfeiffer 	union semun semun = { 0 };
1682657471SMarkus Pfeiffer 	union semun *semun_ptr = NULL;
17*61871f77SSascha Wildner 
1882657471SMarkus Pfeiffer 	va_start(ap, cmd);
1982657471SMarkus Pfeiffer 	if (cmd == IPC_SET || cmd == IPC_STAT || cmd == GETALL
2082657471SMarkus Pfeiffer 	    || cmd == SETVAL || cmd == SETALL) {
2182657471SMarkus Pfeiffer 		semun = va_arg(ap, union semun);
2282657471SMarkus Pfeiffer 		semun_ptr = &semun;
2382657471SMarkus Pfeiffer 	}
2482657471SMarkus Pfeiffer 	va_end(ap);
2582657471SMarkus Pfeiffer 
268d485ff9SSascha Wildner 	if (sysvipc_userland)
274a41674fSSascha Wildner 		return (sysvipc___semctl(semid, semnum, cmd, semun_ptr));
28*61871f77SSascha Wildner 	return (__sys___semctl(semid, semnum, cmd, semun_ptr));
2982657471SMarkus Pfeiffer }
30