this repo has no description
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Fix sys_semctl

+28 -4
+25 -3
src/kernel/emulation/linux/sysv_sem/semctl.c
··· 1 1 #include "semctl.h" 2 2 #include "../base.h" 3 3 #include "../errno.h" 4 + #include "../duct_errno.h" 4 5 #include <linux-syscalls/linux.h> 5 6 #include <stdint.h> 7 + #include <stdarg.h> 6 8 9 + #if defined(__i386__) || defined(__arm__) 7 10 #define LINUX_IPC_64 0x100 11 + #else 12 + #define LINUX_IPC_64 0 13 + #endif 14 + 8 15 #define IPCOP_semop 1 9 16 #define IPCOP_semget 2 10 17 #define IPCOP_semctl 3 ··· 12 19 #define IPC_SET 1 13 20 #define IPC_STAT 2 14 21 22 + static const int cmd_map[] = { // bsd cmds to linux cmds 23 + 0, 1, 2, 14, 11, 12, 13, 15, 16, 17 24 + }; 25 + 15 26 extern void *memcpy(void *dest, const void *src, __SIZE_TYPE__ n); 16 27 17 - long sys_semctl(int semid, int semnum, int cmd, semun_t arg) 28 + long sys_semctl(int semid, int semnum, int cmd, ...) 18 29 { 30 + union semun arg; 31 + va_list ap; 32 + va_start(ap, cmd); 33 + arg = va_arg(ap, union semun); 34 + va_end(ap); 35 + 36 + if (cmd < 0 || cmd >= sizeof(cmd_map) / sizeof(cmd_map[0])) 37 + return -EINVAL; 38 + 39 + int linux_cmd = cmd_map[cmd]; 40 + 19 41 #ifdef __NR_semctl 20 - int ret = LINUX_SYSCALL(__NR_semctl, semid, semnum, cmd | LINUX_IPC_64, arg.buf); 42 + int ret = LINUX_SYSCALL(__NR_semctl, semid, semnum, linux_cmd | LINUX_IPC_64, arg.buf); 21 43 #else 22 - int ret = LINUX_SYSCALL(__NR_ipc, IPCOP_semctl, semid, semnum, cmd | LINUX_IPC_64, &arg.buf); 44 + int ret = LINUX_SYSCALL(__NR_ipc, IPCOP_semctl, semid, semnum, linux_cmd | LINUX_IPC_64, &arg.buf); 23 45 #endif 24 46 25 47 if (ret < 0)
+3 -1
src/kernel/emulation/linux/sysv_sem/semctl.h
··· 4 4 5 5 union semun 6 6 { 7 + int val; 7 8 struct bsd_semid_ds* buf; 9 + unsigned short* array; 8 10 }; 9 11 10 12 struct linux_ipc_perm ··· 47 49 48 50 typedef union semun semun_t; 49 51 50 - long sys_semctl(int semid, int semnum, int cmd, semun_t arg); 52 + long sys_semctl(int semid, int semnum, int cmd, ...); 51 53 52 54 #endif