diff options
Diffstat (limited to 'src/util.rs')
-rw-r--r-- | src/util.rs | 65 |
1 files changed, 3 insertions, 62 deletions
diff --git a/src/util.rs b/src/util.rs index 460f735..746d5d7 100644 --- a/src/util.rs +++ b/src/util.rs @@ -1,15 +1,13 @@ +pub mod ipc; pub mod tar; +pub mod uid; use std::{ - fs::File, io::{Error, ErrorKind, Result}, - path::Path, process::ExitStatus, - result, }; -use ipc_channel::ipc; -use nix::{sys::wait, unistd}; +use nix::sys::wait; pub trait ToIOResult<T> { fn to_io_result(self) -> Result<T>; @@ -52,60 +50,3 @@ impl Checkable for wait::WaitStatus { } } } - -pub trait CheckDisconnect { - type Output; - - fn check_disconnect(self) -> Result<Self::Output>; -} - -impl<T> CheckDisconnect for result::Result<T, ipc::IpcError> { - type Output = result::Result<(), T>; - - fn check_disconnect(self) -> Result<Self::Output> { - match self { - Ok(v) => Ok(Err(v)), - Err(ipc::IpcError::Disconnected) => Ok(Ok(())), - Err(error) => Err(Error::new(ErrorKind::Other, error)), - } - } -} - -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)) -} - -pub fn create_as<P: AsRef<Path>>( - path: P, - uid: Option<unistd::Uid>, - gid: Option<unistd::Gid>, -) -> Result<File> { - let _setegid = gid.map(setegid).transpose()?; - let _seteuid = uid.map(seteuid).transpose()?; - - File::create(path) -} |