diff options
author | Matthias Schiffer <mschiffer@universe-factory.net> | 2021-06-19 18:39:49 +0200 |
---|---|---|
committer | Matthias Schiffer <mschiffer@universe-factory.net> | 2021-06-19 18:39:49 +0200 |
commit | cab6abe0c28d3702ad8f4319bc00e2eca00479f2 (patch) | |
tree | 056db572a3f282cb7d5ed97b2453fefa683804f0 | |
parent | a162424dc18e95e8497a412f6964395bb4595371 (diff) | |
download | rebel-cab6abe0c28d3702ad8f4319bc00e2eca00479f2.tar rebel-cab6abe0c28d3702ad8f4319bc00e2eca00479f2.zip |
Refactor util module
-rw-r--r-- | src/runner/runc.rs | 2 | ||||
-rw-r--r-- | src/runner/runc/run.rs | 2 | ||||
-rw-r--r-- | src/util.rs | 65 | ||||
-rw-r--r-- | src/util/ipc.rs | 23 | ||||
-rw-r--r-- | src/util/uid.rs | 44 |
5 files changed, 72 insertions, 64 deletions
diff --git a/src/runner/runc.rs b/src/runner/runc.rs index 938bab0..ded73fa 100644 --- a/src/runner/runc.rs +++ b/src/runner/runc.rs @@ -10,7 +10,7 @@ use serde::{Deserialize, Serialize}; use crate::types::*; use crate::unshare; -use crate::util::CheckDisconnect; +use crate::util::ipc::CheckDisconnect; #[derive(Debug, Deserialize, Serialize)] struct Request(TaskRef, Task, ipc::IpcSender<run::Error>); diff --git a/src/runner/runc/run.rs b/src/runner/runc/run.rs index 39adbc1..5d01908 100644 --- a/src/runner/runc/run.rs +++ b/src/runner/runc/run.rs @@ -68,7 +68,7 @@ fn output_filename(task: TaskRef) -> PathBuf { } fn collect_output(task: TaskRef, task_def: Task) -> Result<(), io::Error> { - let file = util::create_as( + let file = util::uid::create_as( output_filename(task), Some(unshare::BUILD_UID), Some(unshare::BUILD_GID), 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) -} diff --git a/src/util/ipc.rs b/src/util/ipc.rs new file mode 100644 index 0000000..9fa6b9d --- /dev/null +++ b/src/util/ipc.rs @@ -0,0 +1,23 @@ +use std::{ + io::{self, Error, ErrorKind}, + result, +}; + +use ipc_channel::ipc; +pub trait CheckDisconnect { + type Output; + + fn check_disconnect(self) -> io::Result<Self::Output>; +} + +impl<T> CheckDisconnect for result::Result<T, ipc::IpcError> { + type Output = result::Result<(), T>; + + fn check_disconnect(self) -> io::Result<Self::Output> { + match self { + Ok(v) => Ok(Err(v)), + Err(ipc::IpcError::Disconnected) => Ok(Ok(())), + Err(error) => Err(Error::new(ErrorKind::Other, error)), + } + } +} diff --git a/src/util/uid.rs b/src/util/uid.rs new file mode 100644 index 0000000..ee1e16b --- /dev/null +++ b/src/util/uid.rs @@ -0,0 +1,44 @@ +use std::{fs::File, io::Result, path::Path}; + +use nix::unistd; + +use super::ToIOResult; + +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) +} |