X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fipc%2Fsemctl.c;h=673a9a8c996b2bd18657b1dff7f6934ec34b2d69;hb=689e0e6bf7ccf136ad870f103e4ef3a8554ff1bc;hp=a210e20baa12f01e6854b057f5fea96f0f517661;hpb=07e865cc5afb11e6e882e998306ab0f7fb64357e;p=musl diff --git a/src/ipc/semctl.c b/src/ipc/semctl.c index a210e20b..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); + 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 | 0x100, arg); + return syscall(SYS_semctl, id, num, cmd | IPC_64, arg.buf); #else - return syscall(SYS_ipc, IPCOP_semctl, id, num, cmd | 0x100, &arg); + return syscall(SYS_ipc, IPCOP_semctl, id, num, cmd | IPC_64, &arg.buf); #endif }