uapi 0.2.13

Wrappers for OS APIs on UNIX-like platform
Documentation
use std::{mem, mem::MaybeUninit};
use uapi::*;

#[test]
fn test() {
    let mut buf = [MaybeUninit::uninit(); 1024];
    let hdr = pod_zeroed::<c::cmsghdr>();
    let mut written = 0;

    {
        let mut buf = &mut buf[..];

        written += cmsg_write(&mut buf, hdr, b"hello world").unwrap();
        written += cmsg_write(&mut buf, hdr, b"ayo hol up").unwrap();
    }

    let mut buf = unsafe { buf[..written].slice_assume_init_ref() };

    let (_, _, data1) = cmsg_read(&mut buf).unwrap();
    let (_, _, data2) = cmsg_read(&mut buf).unwrap();

    assert_eq!(data1, b"hello world");
    assert_eq!(data2, b"ayo hol up");
}

#[test]
fn invalid() {
    let mut hdr = pod_zeroed::<c::cmsghdr>();
    hdr.cmsg_len = -200i16 as _;

    assert_eq!(cmsg_read(&mut &[][..]).err().unwrap(), Errno(c::EINVAL));
    assert_eq!(
        cmsg_read(&mut &[0u8; mem::size_of::<c::cmsghdr>()][..])
            .err()
            .unwrap(),
        Errno(c::EINVAL)
    );
    assert_eq!(
        cmsg_write(&mut &mut [][..], hdr, &[0u8]).err().unwrap(),
        Errno(c::EINVAL)
    );

    hdr.cmsg_len = -1i8 as _;
    assert_eq!(
        cmsg_write(&mut &mut [][..], hdr, &[0u8]).err().unwrap(),
        Errno(c::EINVAL)
    );
}