uapi 0.2.6

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

fn readdir_x<F: Fn(&Tempdir) -> Result<Dir>>(f: F) {
    let tmp = Tempdir::new();

    let mut result = HashSet::new();
    result.extend(
        ["a", "b", "c"]
            .iter()
            .map(|v| Bstr::from_str(v).to_ustring()),
    );

    for d in &result {
        create_file(format_ustr!("{}/{}", tmp, d.display()));
    }

    result.insert(".".into_ustr().into_owned());
    result.insert("..".into_ustr().into_owned());

    let mut dir = f(&tmp).unwrap();
    let mut entries = HashSet::new();

    while let Some(entry) = readdir(&mut dir) {
        assert!(entries.insert(entry.unwrap().name().as_ustr().to_ustring()));
    }

    assert_eq!(result, entries);
}

#[test]
fn readdir1() {
    readdir_x(|t| opendir(t));
}

#[test]
fn fdopendir1() {
    readdir_x(|t| {
        let fd = open(t, c::O_RDONLY, 0).unwrap();
        fdopendir(fd)
    });
}

fn next(dir: &mut Dir) -> Ustring {
    readdir(dir).unwrap().unwrap().name().as_ustr().to_ustring()
}

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

    let mut dir = unsafe { Dir::from_ptr(opendir(&tmp).unwrap().unwrap()) };

    let pos = telldir(&mut dir);

    let name1 = next(&mut dir);

    seekdir(&mut dir, pos);

    let name2 = next(&mut dir);
    let name3 = next(&mut dir);

    assert_eq!(name1, name2);
    assert_ne!(name1, name3);
}

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

    create_file(format_ustr!("{}/a", tmp));

    let mut dir = opendir(&tmp).unwrap();

    let name1 = next(&mut dir);
    let name2 = next(&mut dir);

    rewinddir(&mut dir);

    let name3 = next(&mut dir);
    let name4 = next(&mut dir);

    assert_eq!(name1, name3);
    assert_eq!(name2, name4);
}

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

    let fd = open(&tmp, c::O_RDONLY, 0).unwrap();
    let num = *fd;

    let mut dir = fdopendir(fd).unwrap();

    assert_eq!(num, dirfd(&mut dir));
}