#include <sys/sem.h> | |
#include <stdarg.h> | |
#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, ...) { | |
union semun arg = {0}; | |
va_list 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 | IPC_64, arg.buf); | |
#else | |
return syscall(SYS_ipc, IPCOP_semctl, id, num, cmd | IPC_64, &arg.buf); | |
#endif | |
} |