summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Schiffer <mschiffer@universe-factory.net>2021-06-19 18:39:49 +0200
committerMatthias Schiffer <mschiffer@universe-factory.net>2021-06-19 18:39:49 +0200
commitcab6abe0c28d3702ad8f4319bc00e2eca00479f2 (patch)
tree056db572a3f282cb7d5ed97b2453fefa683804f0
parenta162424dc18e95e8497a412f6964395bb4595371 (diff)
downloadrebel-cab6abe0c28d3702ad8f4319bc00e2eca00479f2.tar
rebel-cab6abe0c28d3702ad8f4319bc00e2eca00479f2.zip
Refactor util module
-rw-r--r--src/runner/runc.rs2
-rw-r--r--src/runner/runc/run.rs2
-rw-r--r--src/util.rs65
-rw-r--r--src/util/ipc.rs23
-rw-r--r--src/util/uid.rs44
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)
+}