X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fipc%2Fsemctl.c;h=673a9a8c996b2bd18657b1dff7f6934ec34b2d69;hb=7c82870d4543f0eeb0e3a2638b083ff97b41a0fb;hp=7ada116bf5d90436c01d22eeb3f0ec477c7f0769;hpb=0b44a0315b47dd8eced9f3b7f31580cf14bbfc01;p=musl diff --git a/src/ipc/semctl.c b/src/ipc/semctl.c index 7ada116b..673a9a8c 100644 --- a/src/ipc/semctl.c +++ b/src/ipc/semctl.c @@ -3,16 +3,26 @@ #include "syscall.h" #include "ipc.h" +union semun { + int val; + struct semid_ds *buf; + unsigned short *array; +}; + int semctl(int id, int num, int cmd, ...) { - long arg; + union semun arg = {0}; va_list ap; - va_start(ap, cmd); - arg = va_arg(ap, long); - va_end(ap); -#ifdef __NR_semctl - return syscall4(__NR_semctl, id, num, cmd, arg); + switch (cmd) { + case SETVAL: case GETALL: case SETALL: case IPC_STAT: case IPC_SET: + case IPC_INFO: case SEM_INFO: case SEM_STAT: + va_start(ap, cmd); + arg = va_arg(ap, union semun); + va_end(ap); + } +#ifdef SYS_semctl + return syscall(SYS_semctl, id, num, cmd | IPC_64, arg.buf); #else - return syscall5(__NR_ipc, IPCOP_semctl, id, num, cmd | 0x100, (long)&arg); + return syscall(SYS_ipc, IPCOP_semctl, id, num, cmd | IPC_64, &arg.buf); #endif }