Implement read_buf for Hermit · rust-lang/rust@c5fc193 (original) (raw)

Original file line number Diff line number Diff line change
@@ -2,7 +2,7 @@
2 2
3 3 use super::hermit_abi;
4 4 use crate::cmp;
5 -use crate::io::{self, IoSlice, IoSliceMut, Read, SeekFrom};
5 +use crate::io::{self, BorrowedCursor, IoSlice, IoSliceMut, Read, SeekFrom};
6 6 use crate::os::hermit::io::{AsFd, AsRawFd, BorrowedFd, FromRawFd, IntoRawFd, OwnedFd, RawFd};
7 7 use crate::sys::{cvt, unsupported};
8 8 use crate::sys_common::{AsInner, FromInner, IntoInner};
@@ -23,6 +23,21 @@ impl FileDesc {
23 23 Ok(result as usize)
24 24 }
25 25
26 +pub fn read_buf(&self, mut buf: BorrowedCursor<'_>) -> io::Result<()> {
27 +// SAFETY: The `read` syscall does not read from the buffer, so it is
28 +// safe to use `&mut [MaybeUninit]`.
29 +let result = cvt(unsafe {
30 + hermit_abi::read(
31 +self.fd.as_raw_fd(),
32 + buf.as_mut().as_mut_ptr() as *mut u8,
33 + buf.capacity(),
34 +)
35 +})?;
36 +// SAFETY: Exactly `result` bytes have been filled.
37 +unsafe { buf.advance_unchecked(result as usize) };
38 +Ok(())
39 +}
40 +
26 41 pub fn read_vectored(&self, bufs: &mut [IoSliceMut<'_>]) -> io::Result<usize> {
27 42 let ret = cvt(unsafe {
28 43 hermit_abi::readv(