Implement read_buf for Hermit
This commit is contained in:
parent
90384941aa
commit
c5fc1931a0
3 changed files with 18 additions and 6 deletions
|
@ -396,7 +396,7 @@ impl File {
|
|||
}
|
||||
|
||||
pub fn read_buf(&self, cursor: BorrowedCursor<'_>) -> io::Result<()> {
|
||||
crate::io::default_read_buf(|buf| self.read(buf), cursor)
|
||||
self.0.read_buf(cursor)
|
||||
}
|
||||
|
||||
pub fn write(&self, buf: &[u8]) -> io::Result<usize> {
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
use super::hermit_abi;
|
||||
use crate::cmp;
|
||||
use crate::io::{self, IoSlice, IoSliceMut, Read, SeekFrom};
|
||||
use crate::io::{self, BorrowedCursor, IoSlice, IoSliceMut, Read, SeekFrom};
|
||||
use crate::os::hermit::io::{AsFd, AsRawFd, BorrowedFd, FromRawFd, IntoRawFd, OwnedFd, RawFd};
|
||||
use crate::sys::{cvt, unsupported};
|
||||
use crate::sys_common::{AsInner, FromInner, IntoInner};
|
||||
|
@ -23,6 +23,21 @@ impl FileDesc {
|
|||
Ok(result as usize)
|
||||
}
|
||||
|
||||
pub fn read_buf(&self, mut buf: BorrowedCursor<'_>) -> io::Result<()> {
|
||||
// SAFETY: The `read` syscall does not read from the buffer, so it is
|
||||
// safe to use `&mut [MaybeUninit<u8>]`.
|
||||
let result = cvt(unsafe {
|
||||
hermit_abi::read(
|
||||
self.fd.as_raw_fd(),
|
||||
buf.as_mut().as_mut_ptr() as *mut u8,
|
||||
buf.capacity(),
|
||||
)
|
||||
})?;
|
||||
// SAFETY: Exactly `result` bytes have been filled.
|
||||
unsafe { buf.advance_unchecked(result as usize) };
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn read_vectored(&self, bufs: &mut [IoSliceMut<'_>]) -> io::Result<usize> {
|
||||
let ret = cvt(unsafe {
|
||||
hermit_abi::readv(
|
||||
|
|
|
@ -3,9 +3,7 @@ use hermit_abi::{EBADF, STDERR_FILENO, STDIN_FILENO, STDOUT_FILENO};
|
|||
#[cfg(target_family = "unix")]
|
||||
use libc::{EBADF, STDERR_FILENO, STDIN_FILENO, STDOUT_FILENO};
|
||||
|
||||
#[cfg(target_family = "unix")]
|
||||
use crate::io::BorrowedCursor;
|
||||
use crate::io::{self, IoSlice, IoSliceMut};
|
||||
use crate::io::{self, BorrowedCursor, IoSlice, IoSliceMut};
|
||||
use crate::mem::ManuallyDrop;
|
||||
#[cfg(target_os = "hermit")]
|
||||
use crate::os::hermit::io::FromRawFd;
|
||||
|
@ -28,7 +26,6 @@ impl io::Read for Stdin {
|
|||
unsafe { ManuallyDrop::new(FileDesc::from_raw_fd(STDIN_FILENO)).read(buf) }
|
||||
}
|
||||
|
||||
#[cfg(not(target_os = "hermit"))]
|
||||
fn read_buf(&mut self, buf: BorrowedCursor<'_>) -> io::Result<()> {
|
||||
unsafe { ManuallyDrop::new(FileDesc::from_raw_fd(STDIN_FILENO)).read_buf(buf) }
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue