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(())
}