zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit d6fa71cd67b35f6fdb7a19a9728ff66247ab13c8 (tree)
parent 179a6e61e8be2e5736e9cab9661f04269907247c
Author: Nguyễn Gia Phong <cnx@loang.net>
Date:   Tue,  9 Jul 2024 21:29:23 +0900

std: Wrap setpgid on POSIX

Diffstat:
Mlib/std/c.zig | 1+
Mlib/std/os/linux.zig | 4++++
Mlib/std/posix.zig | 18++++++++++++++++++
3 files changed, 23 insertions(+), 0 deletions(-)

diff --git 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 @@ -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 @@ -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) {