Impl getres[ug]id C function.

This commit is contained in:
4lDO2
2025-03-31 13:12:02 +02:00
parent 8bd510ff59
commit a4dc232a33
4 changed files with 96 additions and 8 deletions
+14 -8
View File
@@ -569,15 +569,21 @@ pub extern "C" fn getppid() -> pid_t {
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/getresgid.html>.
// #[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<T> write-only wrapper?
Sys::getresgid(rgid.as_mut(), egid.as_mut(), sgid.as_mut())
.map(|()| 0)
.or_minus_one_errno()
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/getresuid.html>.
// #[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<T> write-only wrapper?
Sys::getresuid(ruid.as_mut(), euid.as_mut(), suid.as_mut())
.map(|()| 0)
.or_minus_one_errno()
}
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/getsid.html>.
@@ -812,13 +818,13 @@ pub unsafe extern "C" fn set_default_scheme(scheme: *const c_char) -> c_int {
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/setegid.html>.
// #[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 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/seteuid.html>.
// #[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 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/setgid.html>.
+31
View File
@@ -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(|_| ())
}
+12
View File
@@ -131,6 +131,18 @@ pub trait Pal {
fn getrandom(buf: &mut [u8], flags: c_uint) -> Result<usize>;
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<()>;
+39
View File
@@ -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!(