use std::process::Command;
#[cfg(unix)]
pub fn uid_is_root() -> bool {
Command::new("id")
.arg("-u")
.output()
.ok()
.and_then(|o| {
String::from_utf8(o.stdout)
.ok()
.map(|s| s.trim().to_string())
})
.map(|s| s == "0")
.unwrap_or(false)
}
#[cfg(not(unix))]
pub fn uid_is_root() -> bool {
false
}
#[cfg(unix)]
pub fn chmod_unreadable(path: &std::path::Path) {
use std::os::unix::fs::PermissionsExt;
let perms = std::fs::Permissions::from_mode(0o000);
std::fs::set_permissions(path, perms).expect("chmod 000 must succeed");
}
#[cfg(unix)]
pub fn chmod_readable(path: &std::path::Path) {
use std::os::unix::fs::PermissionsExt;
let perms = std::fs::Permissions::from_mode(0o700);
let _ = std::fs::set_permissions(path, perms);
}
#[allow(dead_code)]
pub struct MockCommandRunner {
responses: std::collections::HashMap<(String, Vec<String>), Option<String>>,
}
#[allow(dead_code)]
impl MockCommandRunner {
pub fn new() -> Self {
Self {
responses: std::collections::HashMap::new(),
}
}
pub fn with_response(mut self, bin: &str, args: &[&str], stdout: Option<&str>) -> Self {
let key = (
bin.to_string(),
args.iter().map(|s| s.to_string()).collect(),
);
self.responses.insert(key, stdout.map(|s| s.to_string()));
self
}
}
impl socket_patch_core::utils::process::CommandRunner for MockCommandRunner {
fn run(&self, bin: &str, args: &[&str]) -> Option<String> {
let key = (
bin.to_string(),
args.iter().map(|s| s.to_string()).collect(),
);
self.responses.get(&key).cloned().unwrap_or(None)
}
}