uapi 0.2.2

Wrappers for OS APIs on UNIX-like platform
Documentation
use std::process::exit;
use testutils::*;
use uapi::*;

#[test]
fn lock() {
    let tmp = Tempdir::new();

    let path = &*format!("{}/a", tmp);

    let fd = open(path, c::O_CREAT | c::O_RDWR, 0o777).unwrap();

    ftruncate(*fd, 1000).unwrap();

    let mut lk: c::flock = pod_zeroed();
    lk.l_type = c::F_WRLCK as _;
    lk.l_whence = c::SEEK_SET as _;
    lk.l_start = 3 as _;
    lk.l_len = 3 as _;

    fcntl_setlk(*fd, &lk).unwrap();

    match unsafe { fork().unwrap() } {
        0 => in_fork(|| {
            let mut lk2: c::flock = pod_zeroed();

            lk2.l_type = c::F_RDLCK as _;
            lk2.l_whence = c::SEEK_SET as _;
            lk2.l_start = 4 as _;
            lk2.l_len = 1 as _;

            fcntl_getlk(*fd, &mut lk2).unwrap();

            assert_eq!(lk2.l_type, lk.l_type);
            assert_eq!(lk2.l_whence, lk.l_whence);
            assert_eq!(lk2.l_start, lk.l_start);
            assert_eq!(lk2.l_len, lk.l_len);
            assert_eq!(lk2.l_pid, getppid());

            exit(0);
        }),
        n => {
            let (_, ws) = waitpid(n, 0).unwrap();
            assert!(WIFEXITED(ws));
            assert_eq!(WEXITSTATUS(ws), 0);
        }
    }
}