heim-process 0.0.11

Cross-platform processes information
Documentation
use std::convert::TryFrom;

use super::bindings;
use crate::{Pid, ProcessError, Status};

pub(crate) fn catch_zombie<T: Into<ProcessError>>(e: T, pid: Pid) -> ProcessError {
    match e.into() {
        ProcessError::Load(ref e) if e.raw_os_error() == Some(libc::ESRCH) => {
            let kinfo_proc = match bindings::process(pid) {
                Ok(info) => info,
                Err(e) => return e,
            };

            match Status::try_from(kinfo_proc.kp_proc.p_stat) {
                Ok(Status::Zombie) => ProcessError::ZombieProcess(pid),
                Ok(_) => ProcessError::AccessDenied(pid),
                Err(e) => e.into(),
            }
        }
        other => other,
    }
}