From a4dc232a3330ef7822bdba06f271b6edcc4847d7 Mon Sep 17 00:00:00 2001 From: 4lDO2 <4lDO2@protonmail.com> Date: Mon, 31 Mar 2025 13:12:02 +0200 Subject: [PATCH] Impl getres[ug]id C function. --- src/header/unistd/mod.rs | 22 ++++++++++++++-------- src/platform/linux/mod.rs | 31 +++++++++++++++++++++++++++++++ src/platform/pal/mod.rs | 12 ++++++++++++ src/platform/redox/mod.rs | 39 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 96 insertions(+), 8 deletions(-) diff --git a/src/header/unistd/mod.rs b/src/header/unistd/mod.rs index d0140d3977..bcd682035e 100644 --- a/src/header/unistd/mod.rs +++ b/src/header/unistd/mod.rs @@ -569,15 +569,21 @@ pub extern "C" fn getppid() -> pid_t { } /// See . -// #[no_mangle] -pub extern "C" fn getresgid(rgid: *mut gid_t, egid: *mut gid_t, sgid: *mut gid_t) -> c_int { - unimplemented!(); +#[no_mangle] +pub unsafe extern "C" fn getresgid(rgid: *mut gid_t, egid: *mut gid_t, sgid: *mut gid_t) -> c_int { + // TODO: Out write-only wrapper? + Sys::getresgid(rgid.as_mut(), egid.as_mut(), sgid.as_mut()) + .map(|()| 0) + .or_minus_one_errno() } /// See . -// #[no_mangle] -pub extern "C" fn getresuid(ruid: *mut uid_t, euid: *mut uid_t, suid: *mut uid_t) -> c_int { - unimplemented!(); +#[no_mangle] +pub unsafe extern "C" fn getresuid(ruid: *mut uid_t, euid: *mut uid_t, suid: *mut uid_t) -> c_int { + // TODO: Out write-only wrapper? + Sys::getresuid(ruid.as_mut(), euid.as_mut(), suid.as_mut()) + .map(|()| 0) + .or_minus_one_errno() } /// See . @@ -812,13 +818,13 @@ pub unsafe extern "C" fn set_default_scheme(scheme: *const c_char) -> c_int { /// See . // #[no_mangle] pub extern "C" fn setegid(gid: gid_t) -> c_int { - unimplemented!(); + Sys::setresgid(-1, gid, -1).map(|()| 0).or_minus_one_errno() } /// See . // #[no_mangle] pub extern "C" fn seteuid(uid: uid_t) -> c_int { - unimplemented!(); + Sys::setresuid(-1, uid, -1).map(|()| 0).or_minus_one_errno() } /// See . diff --git a/src/platform/linux/mod.rs b/src/platform/linux/mod.rs index 86ae1af3b7..b624a7da3a 100644 --- a/src/platform/linux/mod.rs +++ b/src/platform/linux/mod.rs @@ -328,6 +328,37 @@ impl Pal for Sys { e_raw(syscall!(GETRLIMIT, resource, rlim)).map(|_| ()) } + fn getresgid( + rgid: Option<&mut gid_t>, + egid: Option<&mut gid_t>, + sgid: Option<&mut gid_t>, + ) -> Result<()> { + unsafe { + e_raw(syscall!( + GETRESGID, + rgid.map_or(0, |r| r as *const _ as usize), + egid.map_or(0, |r| r as *const _ as usize), + sgid.map_or(0, |r| r as *const _ as usize) + )) + .map(|_| ()) + } + } + fn getresuid( + ruid: Option<&mut uid_t>, + euid: Option<&mut uid_t>, + suid: Option<&mut uid_t>, + ) -> Result<()> { + unsafe { + e_raw(syscall!( + GETRESUID, + ruid.map_or(0, |r| r as *const _ as usize), + euid.map_or(0, |r| r as *const _ as usize), + suid.map_or(0, |r| r as *const _ as usize) + )) + .map(|_| ()) + } + } + unsafe fn setrlimit(resource: c_int, rlimit: *const rlimit) -> Result<()> { e_raw(syscall!(SETRLIMIT, resource, rlimit)).map(|_| ()) } diff --git a/src/platform/pal/mod.rs b/src/platform/pal/mod.rs index 6c55a98955..fd5de3e2d8 100644 --- a/src/platform/pal/mod.rs +++ b/src/platform/pal/mod.rs @@ -131,6 +131,18 @@ pub trait Pal { fn getrandom(buf: &mut [u8], flags: c_uint) -> Result; + fn getresgid( + rgid: Option<&mut gid_t>, + egid: Option<&mut gid_t>, + sgid: Option<&mut gid_t>, + ) -> Result<()>; + + fn getresuid( + ruid: Option<&mut uid_t>, + euid: Option<&mut uid_t>, + suid: Option<&mut uid_t>, + ) -> Result<()>; + unsafe fn getrlimit(resource: c_int, rlim: *mut rlimit) -> Result<()>; unsafe fn setrlimit(resource: c_int, rlim: *const rlimit) -> Result<()>; diff --git a/src/platform/redox/mod.rs b/src/platform/redox/mod.rs index 07612a5d42..6b869367c9 100644 --- a/src/platform/redox/mod.rs +++ b/src/platform/redox/mod.rs @@ -468,6 +468,45 @@ impl Pal for Sys { Ok(syscall::read(*fd, buf)?) } + fn getresgid( + rgid_out: Option<&mut gid_t>, + egid_out: Option<&mut gid_t>, + sgid_out: Option<&mut gid_t>, + ) -> Result<()> { + let Resugid { + rgid, egid, sgid, .. + } = redox_rt::sys::posix_getresugid(); + if let Some(rgid_out) = rgid_out { + *rgid_out = rgid as _; + } + if let Some(egid_out) = egid_out { + *egid_out = egid as _; + } + if let Some(sgid_out) = sgid_out { + *sgid_out = sgid as _; + } + Ok(()) + } + fn getresuid( + ruid_out: Option<&mut uid_t>, + euid_out: Option<&mut uid_t>, + suid_out: Option<&mut uid_t>, + ) -> Result<()> { + let Resugid { + ruid, euid, suid, .. + } = redox_rt::sys::posix_getresugid(); + if let Some(ruid_out) = ruid_out { + *ruid_out = ruid as _; + } + if let Some(euid_out) = euid_out { + *euid_out = euid as _; + } + if let Some(suid_out) = suid_out { + *suid_out = suid as _; + } + Ok(()) + } + unsafe fn getrlimit(resource: c_int, rlim: *mut rlimit) -> Result<()> { //TODO eprintln!(