authorgravatar for mail@isaacfreund.comIsaac Freund <mail@isaacfreund.com> 2020-09-03 15:22:43+02:00
committergravatar for mail@isaacfreund.comIsaac Freund <mail@isaacfreund.com> 2020-09-03 15:22:43+02:00
logd0d6647fdbfbe1a5764c2624e46eee35052d0da6
treea0da6ecebeb163156a1f77f0700564ac0e975254
parent01a365f1b008fc1546f99c339dbae99521c169cd
signaturelock-open Commit is signed but in an unrecognized format.

std: add seteuid/setegid to std.os

Currently these are only implemented for linux.

1 files changed, 22 insertions(+), 3 deletions(-)

lib/std/os.zig+22-3
...@@ -2512,11 +2512,12 @@ pub fn readlinkatZ(dirfd: fd_t, file_path: [*:0]const u8, out_buffer: []u8) Read...@@ -2512,11 +2512,12 @@ pub fn readlinkatZ(dirfd: fd_t, file_path: [*:0]const u8, out_buffer: []u8) Read
2512 }2512 }
2513}2513}
25142514
2515pub const SetIdError = error{2515pub const SetEidError = error{
2516 ResourceLimitReached,
2517 InvalidUserId,2516 InvalidUserId,
2518 PermissionDenied,2517 PermissionDenied,
2519} || UnexpectedError;2518};
2519
2520pub const SetIdError = error{ResourceLimitReached} || SetEidError || UnexpectedError;
25202521
2521pub fn setuid(uid: uid_t) SetIdError!void {2522pub fn setuid(uid: uid_t) SetIdError!void {
2522 switch (errno(system.setuid(uid))) {2523 switch (errno(system.setuid(uid))) {
...@@ -2528,6 +2529,15 @@ pub fn setuid(uid: uid_t) SetIdError!void {...@@ -2528,6 +2529,15 @@ pub fn setuid(uid: uid_t) SetIdError!void {
2528 }2529 }
2529}2530}
25302531
2532pub fn seteuid(uid: uid_t) SetEidError!void {
2533 switch (errno(system.seteuid(uid))) {
2534 0 => return,
2535 EINVAL => return error.InvalidUserId,
2536 EPERM => return error.PermissionDenied,
2537 else => |err| return unexpectedErrno(err),
2538 }
2539}
2540
2531pub fn setreuid(ruid: uid_t, euid: uid_t) SetIdError!void {2541pub fn setreuid(ruid: uid_t, euid: uid_t) SetIdError!void {
2532 switch (errno(system.setreuid(ruid, euid))) {2542 switch (errno(system.setreuid(ruid, euid))) {
2533 0 => return,2543 0 => return,
...@@ -2548,6 +2558,15 @@ pub fn setgid(gid: gid_t) SetIdError!void {...@@ -2548,6 +2558,15 @@ pub fn setgid(gid: gid_t) SetIdError!void {
2548 }2558 }
2549}2559}
25502560
2561pub fn setegid(uid: uid_t) SetEidError!void {
2562 switch (errno(system.setegid(uid))) {
2563 0 => return,
2564 EINVAL => return error.InvalidUserId,
2565 EPERM => return error.PermissionDenied,
2566 else => |err| return unexpectedErrno(err),
2567 }
2568}
2569
2551pub fn setregid(rgid: gid_t, egid: gid_t) SetIdError!void {2570pub fn setregid(rgid: gid_t, egid: gid_t) SetIdError!void {
2552 switch (errno(system.setregid(rgid, egid))) {2571 switch (errno(system.setregid(rgid, egid))) {
2553 0 => return,2572 0 => return,