@@ -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( |