diff options
| author | Brandon Black <bblack@wikimedia.org> | 2025-07-11 08:33:15 -0500 |
|---|---|---|
| committer | Alex Rønne Petersen <alex@alexrp.com> | 2025-07-14 07:26:49 +0200 |
| commit | e8a4e47d384ab059c856fc99755f5e176bab67d2 (patch) | |
| tree | ee895edaa679a6e37928966568ae69f2c0e4270b /lib/std | |
| parent | c6a18e9534025bb84f2707b3d2bd7437f2168a7e (diff) | |
| download | zig-e8a4e47d384ab059c856fc99755f5e176bab67d2.tar.gz zig-e8a4e47d384ab059c856fc99755f5e176bab67d2.zip | |
Add setsid to std.(c|posix)
The interface and errors for this seem to be very universal and
generic. Note Linux already has this defined as a syscall as well.
Diffstat (limited to 'lib/std')
| -rw-r--r-- | lib/std/c.zig | 1 | ||||
| -rw-r--r-- | lib/std/posix.zig | 14 |
2 files changed, 15 insertions, 0 deletions
diff --git a/lib/std/c.zig b/lib/std/c.zig index e652b10ce0..51f1ddfaeb 100644 --- a/lib/std/c.zig +++ b/lib/std/c.zig @@ -10808,6 +10808,7 @@ pub extern "c" fn if_nametoindex([*:0]const u8) c_int; pub extern "c" fn getpid() pid_t; pub extern "c" fn getppid() pid_t; +pub extern "c" fn setsid() pid_t; /// These are implementation defined but share identical values in at least musl and glibc: /// - https://git.musl-libc.org/cgit/musl/tree/include/locale.h?id=ab31e9d6a0fa7c5c408856c89df2dfb12c344039#n18 diff --git a/lib/std/posix.zig b/lib/std/posix.zig index df5837a995..e3e1657705 100644 --- a/lib/std/posix.zig +++ b/lib/std/posix.zig @@ -7089,6 +7089,20 @@ pub fn tcsetpgrp(handle: fd_t, pgrp: pid_t) TermioSetPgrpError!void { } } +pub const SetSidError = error{ + /// The calling process is already a process group leader, or the process group ID of a process other than the calling process matches the process ID of the calling process. + PermissionDenied, +} || UnexpectedError; + +pub fn setsid() SetSidError!pid_t { + const rc = system.setsid(); + switch (errno(rc)) { + .SUCCESS => return rc, + .PERM => return error.PermissionDenied, + else => |err| return unexpectedErrno(err), + } +} + pub fn signalfd(fd: fd_t, mask: *const sigset_t, flags: u32) !fd_t { const rc = system.signalfd(fd, mask, flags); switch (errno(rc)) { |
