use std::ffi::{CStr, CString};
use crate::JouleProfilerError;
pub fn signal(pid: i32, sig: i32) -> Result<(), JouleProfilerError> {
if unsafe { libc::kill(pid, sig) } != 0 {
let sig_name = unsafe {
let ptr = libc::strsignal(sig);
if ptr.is_null() {
"unknown signal".to_string()
} else {
CStr::from_ptr(ptr).to_string_lossy().to_string()
}
};
Err(JouleProfilerError::ProcessControlFailed(format!(
"Cannot send signal {sig_name} to process {pid}"
)))
} else {
Ok(())
}
}
pub fn geteuid() -> u32 {
unsafe { libc::geteuid() }
}
pub fn is_root() -> bool {
geteuid() == 0
}
pub fn get_uid_from_username(username: &str) -> Result<u32, JouleProfilerError> {
let cname =
CString::new(username).map_err(|_| JouleProfilerError::CannotRetrieveCurrentUserId)?;
let passwd = unsafe { libc::getpwnam(cname.as_ptr()) };
if passwd.is_null() {
return Err(JouleProfilerError::CannotRetrieveCurrentUserId);
}
Ok(unsafe { (*passwd).pw_uid })
}