diff options
| author | Brandon Black <bblack@wikimedia.org> | 2025-09-12 07:19:01 -0500 |
|---|---|---|
| committer | Brandon Black <bblack@wikimedia.org> | 2025-09-12 07:19:01 -0500 |
| commit | 04071d64bb83c0600d445a2f4b2541e68a6021bf (patch) | |
| tree | 8b89e2ad35aeadce808932ee934923945cd632d7 /lib/std/os/linux.zig | |
| parent | a0ec4e270e680960290642468f6df3ce7e7d7664 (diff) | |
| download | zig-04071d64bb83c0600d445a2f4b2541e68a6021bf.tar.gz zig-04071d64bb83c0600d445a2f4b2541e68a6021bf.zip | |
std.os.linux.setsid(): return raw syscall0 result
When not linking libc on 64-bit Linux and calling posix.setsid(),
we get a type error at compile time inside of posix.errno(). This
is because posix.errno()'s non-libc branch expects a usize-sized
value, which is what all the error-returning os.linux syscalls
return, and linux.setsid() instead returned a pid_t, which is only
32 bits wide.
This and the other 3 pid-related calls just below it (getpid(),
getppid(), and gettid()) are the only Linux syscall examples here
that are casting their return values to pid_t. For the other 3
this makes sense: those calls are documented to have no possible
errors and always return a valid pid_t value.
However, setsid() actually can return the error EPERM, and
therefore needs to return the raw value from syscall0 for
posix.errno() to process like normal.
Additionally, posix.setsid() needs an @intCast(rc) for the success
case as a result, like most other such cases.
Diffstat (limited to 'lib/std/os/linux.zig')
| -rw-r--r-- | lib/std/os/linux.zig | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/lib/std/os/linux.zig b/lib/std/os/linux.zig index d7d29e0df1..3319f08fc7 100644 --- a/lib/std/os/linux.zig +++ b/lib/std/os/linux.zig @@ -1834,8 +1834,8 @@ pub fn setgroups(size: usize, list: [*]const gid_t) usize { } } -pub fn setsid() pid_t { - return @bitCast(@as(u32, @truncate(syscall0(.setsid)))); +pub fn setsid() usize { + return syscall0(.setsid); } pub fn getpid() pid_t { |
