mythical 0.0.0

Bindings for unistd
Documentation
mod ext {
    // Required C functions and global variables

    extern "C" {
        /// The C fork(2) function
        pub fn fork() -> isize;

        /// The C waitpid(2) function
        pub fn waitpid(pid: isize, wstatus: &mut isize, options: isize) -> isize;
    }
}

/// Errors corresponding to C functions
#[derive(Debug)]
pub enum Mishap {
    Fork,
    Exec,
}

#[derive(Debug)]
pub enum Proc {
    Parent(isize),
    Child,
}

pub fn fork() -> Result<Proc, Mishap> {
    let pid = unsafe { ext::fork() };

    if pid < 0 {
        return Err(Mishap::Fork);
    }

    if pid == 0 {
        return Ok(Proc::Child);
    }

    Ok(Proc::Parent(pid))
}

pub fn wait(pid: isize) -> Result<isize, Mishap> {
    let mut status: isize = 0;
    unsafe { ext::waitpid(pid, &mut status, 0) };
    Ok(status)
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn it_forks() -> Result<(), Mishap> {
        let result = fork()?;
        match result {
            Proc::Parent(pid) => {
                wait(pid)?;
                assert_ne!(pid, 0);
            }
            Proc::Child => {}
        }
        Ok(())
    }
}