this repo has no description
1
fork

Configure Feed

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

Add missing SysV Semaphore syscalls + some other improvements in submodules

+183
+3
src/kernel/emulation/linux/CMakeLists.txt
··· 275 275 psynch/psynch_cvsignal.c 276 276 psynch/ulock_wait.c 277 277 psynch/ulock_wake.c 278 + sysv_sem/semget.c 279 + sysv_sem/semctl.c 280 + sysv_sem/semop.c 278 281 conf/pathconf.c 279 282 conf/fpathconf.c 280 283 vchroot_userspace.c
+6
src/kernel/emulation/linux/syscalls.c
··· 198 198 #include "bsdthread/pthread_kill.h" 199 199 #include "conf/pathconf.h" 200 200 #include "conf/fpathconf.h" 201 + #include "sysv_sem/semctl.h" 202 + #include "sysv_sem/semget.h" 203 + #include "sysv_sem/semop.h" 201 204 202 205 void* __bsd_syscall_table[600] = { 203 206 [0] = sys_syscall, ··· 342 345 [241] = sys_flistxattr, 343 346 [243] = sys_initgroups, 344 347 [244] = sys_posix_spawn, 348 + [254] = sys_semctl, 349 + [255] = sys_semget, 350 + [256] = sys_semop, 345 351 [266] = sys_shm_open, 346 352 [267] = sys_shm_unlink, 347 353 [268] = sys_sem_open,
+47
src/kernel/emulation/linux/sysv_sem/semctl.c
··· 1 + #include "semctl.h" 2 + #include "../base.h" 3 + #include "../errno.h" 4 + #include <linux-syscalls/linux.h> 5 + #include <stdint.h> 6 + 7 + #define LINUX_IPC_64 0x100 8 + #define IPCOP_semop 1 9 + #define IPCOP_semget 2 10 + #define IPCOP_semctl 3 11 + 12 + #define IPC_SET 1 13 + #define IPC_STAT 2 14 + 15 + extern void *memcpy(void *dest, const void *src, __SIZE_TYPE__ n); 16 + 17 + long sys_semctl(int semid, int semnum, int cmd, semun_t arg) 18 + { 19 + #ifdef __NR_semctl 20 + int ret = LINUX_SYSCALL(__NR_semctl, semid, semnum, cmd | LINUX_IPC_64, arg.buf); 21 + #else 22 + int ret = LINUX_SYSCALL(__NR_ipc, IPCOP_semctl, semid, semnum, cmd | LINUX_IPC_64, &arg.buf); 23 + #endif 24 + 25 + if (ret < 0) 26 + return errno_linux_to_bsd(ret); 27 + 28 + if (cmd == IPC_SET || cmd == IPC_STAT) 29 + { 30 + struct linux_semid_ds orig; 31 + 32 + memcpy(&orig, arg.buf, sizeof(orig)); 33 + 34 + arg.buf->sem_perm.uid = orig.sem_perm.uid; 35 + arg.buf->sem_perm.gid = orig.sem_perm.gid; 36 + arg.buf->sem_perm.cuid = orig.sem_perm.cuid; 37 + arg.buf->sem_perm.cgid = orig.sem_perm.cgid; 38 + arg.buf->sem_perm.mode = orig.sem_perm.mode; 39 + 40 + arg.buf->sem_base = 0; 41 + arg.buf->sem_nsems = orig.sem_nsems; 42 + arg.buf->sem_otime = orig.sem_otime; 43 + arg.buf->sem_ctime = orig.sem_ctime; 44 + } 45 + 46 + return 0; 47 + }
+52
src/kernel/emulation/linux/sysv_sem/semctl.h
··· 1 + #ifndef LINUX_SYSV_SEMCTL_H 2 + #define LINUX_SYSV_SEMCTL_H 3 + #include <stdint.h> 4 + 5 + union semun 6 + { 7 + struct bsd_semid_ds* buf; 8 + }; 9 + 10 + struct linux_ipc_perm 11 + { 12 + int32_t _key; 13 + uint32_t uid; 14 + uint32_t gid; 15 + uint32_t cuid; 16 + uint32_t cgid; 17 + short int mode; 18 + }; 19 + 20 + struct linux_semid_ds 21 + { 22 + struct linux_ipc_perm sem_perm; 23 + unsigned long long sem_otime; 24 + unsigned long long sem_ctime; 25 + unsigned long sem_nsems; 26 + }; 27 + 28 + struct bsd_ipc_perm 29 + { 30 + uint32_t uid; 31 + uint32_t gid; 32 + uint32_t cuid; 33 + uint32_t cgid; 34 + short int mode; 35 + }; 36 + 37 + struct bsd_semid_ds 38 + { 39 + struct bsd_ipc_perm sem_perm; 40 + int32_t sem_base; 41 + unsigned short sem_nsems; 42 + unsigned long long sem_otime; 43 + uint32_t sem_pad1; 44 + unsigned long long sem_ctime; 45 + uint32_t sem_pad2; 46 + }; 47 + 48 + typedef union semun semun_t; 49 + 50 + long sys_semctl(int semid, int semnum, int cmd, semun_t arg); 51 + 52 + #endif
+21
src/kernel/emulation/linux/sysv_sem/semget.c
··· 1 + #include "semget.h" 2 + #include "../base.h" 3 + #include <linux-syscalls/linux.h> 4 + #include "../errno.h" 5 + 6 + #define IPCOP_semop 1 7 + #define IPCOP_semget 2 8 + #define IPCOP_semctl 3 9 + 10 + long sys_semget(int32_t key, int n, int fl) 11 + { 12 + #ifdef __NR_semget 13 + int ret = LINUX_SYSCALL(__NR_semget, key, n, fl); 14 + #else 15 + int ret = LINUX_SYSCALL(__NR_ipc, IPCOP_semget, key, n, fl); 16 + #endif 17 + 18 + if (ret < 0) 19 + return errno_linux_to_bsd(ret); 20 + return 0; 21 + }
+7
src/kernel/emulation/linux/sysv_sem/semget.h
··· 1 + #ifndef LINUX_SYSV_SEMGET_H 2 + #define LINUX_SYSV_SEMGET_H 3 + #include <stdint.h> 4 + 5 + long sys_semget(int32_t key, int nsems, int semflg); 6 + 7 + #endif
+21
src/kernel/emulation/linux/sysv_sem/semop.c
··· 1 + #include "semop.h" 2 + #include "../base.h" 3 + #include "../errno.h" 4 + #include <linux-syscalls/linux.h> 5 + 6 + #define IPCOP_semop 1 7 + #define IPCOP_semget 2 8 + #define IPCOP_semctl 3 9 + 10 + long sys_semop(int semid, struct sembuf *sops, int nsops) 11 + { 12 + #ifdef __NR_semop 13 + int ret = LINUX_SYSCALL(__NR_semop, semid, sops, nsops); 14 + #else 15 + int ret = LINUX_SYSCALL(__NR_ipc, IPCOP_semop, semid, nsops, 0, sops); 16 + #endif 17 + 18 + if (ret < 0) 19 + return errno_linux_to_bsd(ret); 20 + return 0; 21 + }
+8
src/kernel/emulation/linux/sysv_sem/semop.h
··· 1 + #ifndef LINUX_SYSV_SEMOP_H 2 + #define LINUX_SYSV_SEMOP_H 3 + #include <stdint.h> 4 + 5 + struct sembuf; 6 + long sys_semop(int semid, struct sembuf *sops, int nsops); 7 + 8 + #endif
+18
src/kernel/emulation/linux/vchroot_userspace.c
··· 102 102 return 0; 103 103 } 104 104 105 + #ifndef TEST 106 + VISIBLE 107 + int __darling_vchroot_expand(const char* path, char* out) 108 + { 109 + struct vchroot_expand_args a = { 110 + .dfd = -100, 111 + .flags = 0 112 + }; 113 + 114 + strcpy(a.path, path); 115 + 116 + int rv = vchroot_expand(&a); 117 + 118 + strcpy(out, a.path); 119 + return rv; 120 + } 121 + #endif 122 + 105 123 static void init_vchroot_path(void) 106 124 { 107 125 struct vchroot_expand_args a = {