xref: /dflybsd-src/lib/libc/gen/sysvipc_semctl.c (revision 8d485ff955df3a811e5f6379ad61bc6c1164a143)
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 #include <stdlib.h>
682657471SMarkus Pfeiffer 
782657471SMarkus Pfeiffer #include "sysvipc_sem.h"
882657471SMarkus Pfeiffer 
9*8d485ff9SSascha Wildner extern char sysvipc_userland;
1082657471SMarkus Pfeiffer 
1182657471SMarkus Pfeiffer int
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;
1782657471SMarkus Pfeiffer 	va_start(ap, cmd);
1882657471SMarkus Pfeiffer 	if (cmd == IPC_SET || cmd == IPC_STAT || cmd == GETALL
1982657471SMarkus Pfeiffer 	    || cmd == SETVAL || cmd == SETALL) {
2082657471SMarkus Pfeiffer 		semun = va_arg(ap, union semun);
2182657471SMarkus Pfeiffer 		semun_ptr = &semun;
2282657471SMarkus Pfeiffer 	}
2382657471SMarkus Pfeiffer 	va_end(ap);
2482657471SMarkus Pfeiffer 
25*8d485ff9SSascha Wildner 	if (sysvipc_userland)
2682657471SMarkus Pfeiffer 		return (sysvipc_semctl(semid, semnum, cmd, semun));
2782657471SMarkus Pfeiffer 	return (semsys(0, semid, semnum, cmd, semun_ptr));
2882657471SMarkus Pfeiffer }
29