From d6fa71cd67b35f6fdb7a19a9728ff66247ab13c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nguy=E1=BB=85n=20Gia=20Phong?= Date: Tue, 9 Jul 2024 21:29:23 +0900 Subject: [PATCH] std: Wrap setpgid on POSIX --- lib/std/c.zig | 1 + lib/std/os/linux.zig | 4 ++++ lib/std/posix.zig | 18 ++++++++++++++++++ 3 files changed, 23 insertions(+) diff --git a/lib/std/c.zig b/lib/std/c.zig index d2501b7355..ac891d3256 100644 --- a/lib/std/c.zig +++ b/lib/std/c.zig @@ -9167,6 +9167,7 @@ pub extern "c" fn setreuid(ruid: uid_t, euid: uid_t) c_int; pub extern "c" fn setregid(rgid: gid_t, egid: gid_t) c_int; pub extern "c" fn setresuid(ruid: uid_t, euid: uid_t, suid: uid_t) c_int; pub extern "c" fn setresgid(rgid: gid_t, egid: gid_t, sgid: gid_t) c_int; +pub extern "c" fn setpgid(pid: pid_t, pgid: pid_t) c_int; pub extern "c" fn malloc(usize) ?*anyopaque; pub extern "c" fn realloc(?*anyopaque, usize) ?*anyopaque; diff --git a/lib/std/os/linux.zig b/lib/std/os/linux.zig index c6b53d6f0d..9ceaaaad81 100644 --- a/lib/std/os/linux.zig +++ b/lib/std/os/linux.zig @@ -1551,6 +1551,10 @@ pub fn setresgid(rgid: gid_t, egid: gid_t, sgid: gid_t) usize { } } +pub fn setpgid(pid: pid_t, pgid: pid_t) usize { + return syscall2(.setpgid, @intCast(pid), @intCast(pgid)); +} + pub fn getgroups(size: usize, list: *gid_t) usize { if (@hasField(SYS, "getgroups32")) { return syscall2(.getgroups32, size, @intFromPtr(list)); diff --git a/lib/std/posix.zig b/lib/std/posix.zig index facb4b8cd6..51ec462821 100644 --- a/lib/std/posix.zig +++ b/lib/std/posix.zig @@ -3415,6 +3415,24 @@ pub fn setregid(rgid: gid_t, egid: gid_t) SetIdError!void { } } +pub const SetPgidError = error{ + ProcessAlreadyExec, + InvalidProcessGroupId, + PermissionDenied, + ProcessNotFound, +} || UnexpectedError; + +pub fn setpgid(pid: pid_t, pgid: pid_t) SetPgidError!void { + switch (errno(system.setpgid(pid, pgid))) { + .SUCCESS => return, + .ACCES => return error.ProcessAlreadyExec, + .INVAL => return error.InvalidProcessGroupId, + .PERM => return error.PermissionDenied, + .SRCH => return error.ProcessNotFound, + else => |err| return unexpectedErrno(err), + } +} + /// Test whether a file descriptor refers to a terminal. pub fn isatty(handle: fd_t) bool { if (native_os == .windows) {