diff options
| author | Laytan <laytanlaats@hotmail.com> | 2024-07-22 13:58:17 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-07-22 13:58:17 +0200 |
| commit | 73a9a97413e31a2a976f3068a6887cdcfcdbb20b (patch) | |
| tree | 794b433551e977d067346e2a4075b9d8bf902813 /core/sys/linux | |
| parent | 68550cf9156934f1748fc96af21cfbc30f853e6c (diff) | |
| parent | 1873f7215dd42e4ee628fcd0947579bf42557dbe (diff) | |
Merge pull request #3476 from PucklaJ/syscall-fix
[sys/linux] Fix fork and execve syscalls on arm64
Diffstat (limited to 'core/sys/linux')
| -rw-r--r-- | core/sys/linux/bits.odin | 8 | ||||
| -rw-r--r-- | core/sys/linux/sys.odin | 12 | ||||
| -rw-r--r-- | core/sys/linux/types.odin | 5 |
3 files changed, 17 insertions, 8 deletions
diff --git a/core/sys/linux/bits.odin b/core/sys/linux/bits.odin index 96c3de18d..e10edf558 100644 --- a/core/sys/linux/bits.odin +++ b/core/sys/linux/bits.odin @@ -1815,3 +1815,11 @@ EPoll_Ctl_Opcode :: enum i32 { DEL = 2, MOD = 3, } + +/* + Bits for execveat(2) flags. +*/ +Execveat_Flags_Bits :: enum { + AT_SYMLINK_NOFOLLOW = 8, + AT_EMPTY_PATH = 12, +} diff --git a/core/sys/linux/sys.odin b/core/sys/linux/sys.odin index 90db862e2..f7cacc544 100644 --- a/core/sys/linux/sys.odin +++ b/core/sys/linux/sys.odin @@ -749,17 +749,13 @@ getsockopt :: proc { getsockopt_base, } -// TODO(flysand): clone (probably not in this PR, maybe not ever) - /* Creates a copy of the running process. Available since Linux 1.0. */ fork :: proc "contextless" () -> (Pid, Errno) { when ODIN_ARCH == .arm64 { - // Note(flysand): this syscall is not documented, but the bottom 8 bits of flags - // are for exit signal - ret := syscall(SYS_clone, Signal.SIGCHLD) + ret := syscall(SYS_clone, u64(Signal.SIGCHLD), cast(rawptr) nil, cast(rawptr) nil, cast(rawptr) nil, u64(0)) return errno_unwrap(ret, Pid) } else { ret := syscall(SYS_fork) @@ -789,8 +785,8 @@ execve :: proc "contextless" (name: cstring, argv: [^]cstring, envp: [^]cstring) ret := syscall(SYS_execve, cast(rawptr) name, cast(rawptr) argv, cast(rawptr) envp) return Errno(-ret) } else { - ret := syscall(SYS_execveat, AT_FDCWD, cast(rawptr) name, cast(rawptr) argv, cast(rawptr) envp) - return Errno(-ret) + ret := syscall(SYS_execveat, AT_FDCWD, cast(rawptr) name, cast(rawptr) argv, cast(rawptr) envp, i32(0)) + return Errno(-ret) } } @@ -2818,7 +2814,7 @@ getrandom :: proc "contextless" (buf: []u8, flags: Get_Random_Flags) -> (int, Er Execute program relative to a directory file descriptor. Available since Linux 3.19. */ -execveat :: proc "contextless" (dirfd: Fd, name: cstring, argv: [^]cstring, envp: [^]cstring, flags: FD_Flags = {}) -> (Errno) { +execveat :: proc "contextless" (dirfd: Fd, name: cstring, argv: [^]cstring, envp: [^]cstring, flags: Execveat_Flags = {}) -> (Errno) { ret := syscall(SYS_execveat, dirfd, cast(rawptr) name, cast(rawptr) argv, cast(rawptr) envp, transmute(i32) flags) return Errno(-ret) } diff --git a/core/sys/linux/types.odin b/core/sys/linux/types.odin index d373f96f2..288edf879 100644 --- a/core/sys/linux/types.odin +++ b/core/sys/linux/types.odin @@ -1303,3 +1303,8 @@ EPoll_Event :: struct #packed { events: EPoll_Event_Kind, data: EPoll_Data, } + +/* + Flags for execveat(2) syscall. +*/ +Execveat_Flags :: bit_set[Execveat_Flags_Bits; i32] |