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