Impl getres[ug]id C function.
This commit is contained in:
@@ -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>.
|
||||
|
||||
@@ -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(|_| ())
|
||||
}
|
||||
|
||||
@@ -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<()>;
|
||||
|
||||
@@ -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!(
|
||||
|
||||
Reference in New Issue
Block a user