diff options
Diffstat (limited to 'src/util.rs')
-rw-r--r-- | src/util.rs | 30 |
1 files changed, 29 insertions, 1 deletions
diff --git a/src/util.rs b/src/util.rs index f5bbfaa..d388a59 100644 --- a/src/util.rs +++ b/src/util.rs @@ -7,7 +7,7 @@ use std::{ }; use ipc_channel::ipc; -use nix::sys::wait; +use nix::{sys::wait, unistd}; pub trait ToIOResult<T> { fn to_io_result(self) -> Result<T>; @@ -68,3 +68,31 @@ impl<T> CheckDisconnect for result::Result<T, ipc::IpcError> { } } } + +pub struct SetEUID(unistd::Uid); + +impl Drop for SetEUID { + fn drop(&mut self) { + unistd::seteuid(self.0).expect("failed to reset effective UID"); + } +} + +pub fn seteuid(uid: unistd::Uid) -> Result<SetEUID> { + let old_uid = unistd::geteuid(); + unistd::seteuid(uid).to_io_result()?; + Ok(SetEUID(old_uid)) +} + +pub struct SetEGID(unistd::Gid); + +impl Drop for SetEGID { + fn drop(&mut self) { + unistd::setegid(self.0).expect("failed to reset effective GID"); + } +} + +pub fn setegid(gid: unistd::Gid) -> Result<SetEGID> { + let old_gid = unistd::getegid(); + unistd::setegid(gid).to_io_result()?; + Ok(SetEGID(old_gid)) +} |