use std::sync::Arc;
use rustc_hash::FxHashMap as HashMap;
use crate::collection::error::{CollectionError, CollectionResult};
#[derive(Debug, Default)]
pub struct UserTable {
pub uid_user_mapping: HashMap<libc::uid_t, Arc<str>>,
}
impl UserTable {
pub fn uid_to_username(&mut self, uid: libc::uid_t) -> CollectionResult<Arc<str>> {
if let Some(user) = self.uid_user_mapping.get(&uid) {
Ok(user.clone())
} else {
let passwd = unsafe { libc::getpwuid(uid) };
if passwd.is_null() {
Err("passwd is inaccessible".into())
} else {
let username: Arc<str> = unsafe { std::ffi::CStr::from_ptr((*passwd).pw_name) }
.to_str()
.map_err(|err| CollectionError::General(err.into()))?
.into();
self.uid_user_mapping.insert(uid, username.clone());
Ok(username)
}
}
}
}