heim-process 0.0.11

Cross-platform processes information
Documentation
use std::io;

use crate::os::unix::Signal;
use crate::{Pid, ProcessError, ProcessResult};

pub fn pid_exists(pid: Pid) -> bool {
    if pid == 0 {
        return true;
    }

    let result = unsafe { libc::kill(pid, 0) };

    if result == 0 {
        true
    } else {
        let e = io::Error::last_os_error();
        match e.raw_os_error() {
            Some(libc::ESRCH) => false,
            Some(libc::EPERM) => true,
            _ => true,
        }
    }
}

pub fn pid_kill(pid: Pid, signal: Signal) -> ProcessResult<()> {
    let result = unsafe { libc::kill(pid, signal.into()) };

    if result == 0 {
        Ok(())
    } else {
        let e = io::Error::last_os_error();
        match e.raw_os_error() {
            Some(libc::ESRCH) => Err(ProcessError::NoSuchProcess(pid)),
            Some(libc::EPERM) => Err(ProcessError::AccessDenied(pid)),
            _ => Err(e.into()),
        }
    }
}