mod ext {
extern "C" {
pub fn fork() -> isize;
pub fn waitpid(pid: isize, wstatus: &mut isize, options: isize) -> isize;
}
}
#[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(())
}
}