blob: 132a267184b166fe1a3740424fff2b85bfd65896 [file] [log] [blame]
Viet-Trung Luu96b05c12016-01-11 11:26:36 -08001#include <sys/sem.h>
2#include <stdarg.h>
3#include "syscall.h"
4#include "ipc.h"
5
6union semun {
George Kulakowski17e3b042016-02-18 15:59:50 -08007 int val;
8 struct semid_ds* buf;
9 unsigned short* array;
Viet-Trung Luu96b05c12016-01-11 11:26:36 -080010};
11
George Kulakowski17e3b042016-02-18 15:59:50 -080012int semctl(int id, int num, int cmd, ...) {
13 union semun arg = {0};
14 va_list ap;
15 switch (cmd) {
16 case SETVAL:
17 case GETALL:
18 case SETALL:
19 case IPC_STAT:
20 case IPC_SET:
21 case IPC_INFO:
22 case SEM_INFO:
23 case SEM_STAT:
24 va_start(ap, cmd);
25 arg = va_arg(ap, union semun);
26 va_end(ap);
27 }
Viet-Trung Luu96b05c12016-01-11 11:26:36 -080028#ifdef SYS_semctl
George Kulakowski17e3b042016-02-18 15:59:50 -080029 return syscall(SYS_semctl, id, num, cmd | IPC_64, arg.buf);
Viet-Trung Luu96b05c12016-01-11 11:26:36 -080030#else
George Kulakowski17e3b042016-02-18 15:59:50 -080031 return syscall(SYS_ipc, IPCOP_semctl, id, num, cmd | IPC_64, &arg.buf);
Viet-Trung Luu96b05c12016-01-11 11:26:36 -080032#endif
33}