summaryrefslogtreecommitdiffstats
path: root/src/util.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/util.rs')
-rw-r--r--src/util.rs65
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)
-}