lx 0.4.0

A no_std crate to use Linux system calls
Documentation
use core::mem::MaybeUninit;

use super::abi::*;
use crate::{
    result_from_value,
    AsRawFd,
    Error,
    EINVAL,
};

#[inline]
pub fn read(fd: &impl AsRawFd, buf: &mut [MaybeUninit<u8>]) -> crate::Result<usize> {
    let ret = unsafe {
        syscall_3(
            0,
            fd.as_raw_fd() as usize,
            buf.as_mut_ptr() as usize,
            buf.len(),
        )
    };
    result_from_value(ret)
}

#[inline]
pub fn read_exact(fd: &impl AsRawFd, buf: &mut [MaybeUninit<u8>]) -> crate::Result<()> {
    let mut n = 0;
    while n < buf.len() {
        let ret = read(fd, &mut buf[n..])?;
        if ret == 0 {
            return Err(Error::from_code(EINVAL));
        }
        n += ret;
    }
    Ok(())
}