Add setresguid.
This commit is contained in:
@@ -21,6 +21,7 @@ pub enum ProcCall {
|
||||
Setrens = 1,
|
||||
Exit = 2,
|
||||
Waitpgid = 3,
|
||||
SetResugid = 4,
|
||||
}
|
||||
|
||||
impl ProcCall {
|
||||
|
||||
+50
-5
@@ -190,22 +190,67 @@ pub fn get_umask() -> u32 {
|
||||
UMASK.load(Ordering::Acquire)
|
||||
}
|
||||
|
||||
pub fn posix_setresuid(ruid: Option<u32>, euid: Option<u32>, suid: Option<u32>) -> Result<()> {
|
||||
todo!("posix_setresuid")
|
||||
}
|
||||
pub fn posix_setresgid(rgid: Option<u32>, egid: Option<u32>, sgid: Option<u32>) -> Result<()> {
|
||||
todo!("posix_setresgid")
|
||||
pub fn posix_setresugid(
|
||||
ruid: Option<u32>,
|
||||
euid: Option<u32>,
|
||||
suid: Option<u32>,
|
||||
rgid: Option<u32>,
|
||||
egid: Option<u32>,
|
||||
sgid: Option<u32>,
|
||||
) -> Result<()> {
|
||||
// TODO: not sure how "tmp" an IPC call is?
|
||||
let _sig_guard = tmp_disable_signals();
|
||||
let mut guard = DYNAMIC_PROC_INFO.lock();
|
||||
|
||||
let mut buf = [0_u8; size_of::<u32>() * 6];
|
||||
plain::slice_from_mut_bytes(&mut buf)
|
||||
.unwrap()
|
||||
.copy_from_slice(&[
|
||||
ruid.unwrap_or(u32::MAX),
|
||||
euid.unwrap_or(u32::MAX),
|
||||
suid.unwrap_or(u32::MAX),
|
||||
rgid.unwrap_or(u32::MAX),
|
||||
egid.unwrap_or(u32::MAX),
|
||||
sgid.unwrap_or(u32::MAX),
|
||||
]);
|
||||
|
||||
proc_call(
|
||||
&mut buf,
|
||||
CallFlags::empty(),
|
||||
&[ProcCall::SetResugid as usize],
|
||||
)?;
|
||||
|
||||
if let Some(ruid) = ruid {
|
||||
guard.ruid = ruid;
|
||||
}
|
||||
if let Some(euid) = euid {
|
||||
guard.euid = euid;
|
||||
}
|
||||
// TODO: suid?
|
||||
if let Some(rgid) = rgid {
|
||||
guard.rgid = rgid;
|
||||
}
|
||||
if let Some(egid) = egid {
|
||||
guard.egid = egid;
|
||||
}
|
||||
// TODO: sgid?
|
||||
|
||||
Ok(())
|
||||
}
|
||||
pub fn posix_getruid() -> u32 {
|
||||
let _guard = tmp_disable_signals();
|
||||
DYNAMIC_PROC_INFO.lock().ruid
|
||||
}
|
||||
pub fn posix_getrgid() -> u32 {
|
||||
let _guard = tmp_disable_signals();
|
||||
DYNAMIC_PROC_INFO.lock().rgid
|
||||
}
|
||||
pub fn posix_geteuid() -> u32 {
|
||||
let _guard = tmp_disable_signals();
|
||||
DYNAMIC_PROC_INFO.lock().euid
|
||||
}
|
||||
pub fn posix_getegid() -> u32 {
|
||||
let _guard = tmp_disable_signals();
|
||||
DYNAMIC_PROC_INFO.lock().egid
|
||||
}
|
||||
pub fn posix_exit(status: i32) -> ! {
|
||||
|
||||
@@ -864,7 +864,10 @@ impl Pal for Sys {
|
||||
}
|
||||
|
||||
fn setresgid(rgid: gid_t, egid: gid_t, sgid: gid_t) -> Result<()> {
|
||||
Ok(redox_rt::sys::posix_setresgid(
|
||||
Ok(redox_rt::sys::posix_setresugid(
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
cvt_uid(rgid)?,
|
||||
cvt_uid(egid)?,
|
||||
cvt_uid(sgid)?,
|
||||
@@ -872,10 +875,13 @@ impl Pal for Sys {
|
||||
}
|
||||
|
||||
fn setresuid(ruid: uid_t, euid: uid_t, suid: uid_t) -> Result<()> {
|
||||
Ok(redox_rt::sys::posix_setresuid(
|
||||
Ok(redox_rt::sys::posix_setresugid(
|
||||
cvt_uid(ruid)?,
|
||||
cvt_uid(euid)?,
|
||||
cvt_uid(suid)?,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
)?)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user