std: Wrap setpgid on POSIX

This commit is contained in:
Nguyễn Gia Phong 2024-07-09 21:29:23 +09:00
parent 179a6e61e8
commit d6fa71cd67
No known key found for this signature in database
GPG key ID: 84B69CE6F3F6B767
3 changed files with 23 additions and 0 deletions

View file

@ -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 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 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 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 malloc(usize) ?*anyopaque;
pub extern "c" fn realloc(?*anyopaque, usize) ?*anyopaque; pub extern "c" fn realloc(?*anyopaque, usize) ?*anyopaque;

View file

@ -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 { pub fn getgroups(size: usize, list: *gid_t) usize {
if (@hasField(SYS, "getgroups32")) { if (@hasField(SYS, "getgroups32")) {
return syscall2(.getgroups32, size, @intFromPtr(list)); return syscall2(.getgroups32, size, @intFromPtr(list));

View file

@ -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. /// Test whether a file descriptor refers to a terminal.
pub fn isatty(handle: fd_t) bool { pub fn isatty(handle: fd_t) bool {
if (native_os == .windows) { if (native_os == .windows) {