in src/app.rs [79:119]
fn get_pid_map(link: &Option<Link>) -> HashMap<u32, Vec<Process>> {
let mut pid_map: HashMap<u32, Vec<Process>> = HashMap::new();
// Check if there is a link
if let Some(actual_link) = link {
let mut iter = match Iter::new(actual_link) {
Ok(iter) => iter,
Err(e) => {
error!("Failed to create iterator: {}", e);
return pid_map;
}
};
let struct_size = std::mem::size_of::<PidIterEntry>();
loop {
let mut buffer = vec![0u8; struct_size];
match iter.read(&mut buffer) {
Ok(0) => break, // No more data to read
Ok(n) => {
if n != struct_size {
error!("Expected {} bytes, read {} bytes", buffer.len(), n);
break;
}
let pid_entry: PidIterEntry = unsafe { ptr::read(buffer.as_ptr() as *const _) };
let process = Process {
pid: pid_entry.pid,
comm: String::from_utf8_lossy(&pid_entry.comm).to_string(),
};
pid_map.entry(pid_entry.id).or_default().push(process);
}
Err(e) => {
error!("Failed to read from iterator: {}", e);
break;
}
}
}
}
pid_map
}