/// Wait for process to change state.
///
/// # Example
///
/// ```
/// let ret = unsafe { nc::fork() };
/// match ret {
/// Err(errno) => {
/// eprintln!("fork() error: {}", nc::strerror(errno));
/// unsafe { nc::exit(1) };
/// }
/// Ok(0) => println!("[child] pid is: {}", unsafe { nc::getpid() }),
/// Ok(pid) => {
/// let mut status = 0;
/// let mut usage = nc::rusage_t::default();
/// let ret = unsafe { nc::wait4(-1, &mut status, 0, &mut usage) };
/// assert!(ret.is_ok());
/// println!("status: {}", status);
/// let exited_pid = ret.unwrap();
/// assert_eq!(exited_pid, pid);
/// }
/// }
/// ```
pub unsafe fn wait4(
pid: pid_t,
wstatus: &mut i32,
options: i32,
rusage: &mut rusage_t,
) -> Result<pid_t, Errno> {
let pid = pid as usize;
let wstatus_ptr = wstatus as *mut i32 as usize;
let options = options as usize;
let rusage_ptr = rusage as *mut rusage_t as usize;
syscall4(SYS_WAIT4, pid, wstatus_ptr, options, rusage_ptr).map(|ret| ret as pid_t)
}