From 7f301790d0e1828082f8f314475a332084026dd5 Mon Sep 17 00:00:00 2001 From: PucklaJ Date: Sun, 28 Apr 2024 11:48:18 +0200 Subject: [PATCH] [sys/linux] Change flags parameter of execveat to bit_set --- core/sys/linux/bits.odin | 8 ++++++++ core/sys/linux/constants.odin | 2 -- core/sys/linux/sys.odin | 6 +++--- core/sys/linux/types.odin | 5 +++++ 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/core/sys/linux/bits.odin b/core/sys/linux/bits.odin index ad519e1cd..88c4f40c9 100644 --- a/core/sys/linux/bits.odin +++ b/core/sys/linux/bits.odin @@ -1756,3 +1756,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/constants.odin b/core/sys/linux/constants.odin index 389ff1417..51f7db68f 100644 --- a/core/sys/linux/constants.odin +++ b/core/sys/linux/constants.odin @@ -5,8 +5,6 @@ package linux that relative paths are relative to current directory. */ AT_FDCWD :: Fd(-100) -AT_EMPTY_PATH :: 0x1000 -AT_SYMLINK_NOFOLLOW :: 0x100 /* Special value to put into timespec for utimensat() to set timestamp to the current time. diff --git a/core/sys/linux/sys.odin b/core/sys/linux/sys.odin index 5b2948c8f..a9ec3c24e 100644 --- a/core/sys/linux/sys.odin +++ b/core/sys/linux/sys.odin @@ -783,7 +783,7 @@ 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 { - return execveat(AT_FDCWD, name, argv, envp, 0) + return execveat(AT_FDCWD, name, argv, envp, nil) } } @@ -2816,8 +2816,8 @@ 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: i32) -> (Errno) { - ret := syscall(SYS_execveat, dirfd, cast(rawptr) name, cast(rawptr) argv, cast(rawptr) envp, flags) +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 677bac7e0..e7ecfc609 100644 --- a/core/sys/linux/types.odin +++ b/core/sys/linux/types.odin @@ -1238,3 +1238,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]