about summary refs log tree commit diff
diff options
context:
space:
mode:
authorTomoaki Kawada <kawada@kmckk.co.jp>2021-12-20 14:20:48 +0900
committerTomoaki Kawada <kawada@kmckk.co.jp>2021-12-21 11:18:35 +0900
commit874514c7b4f58256eb1c9fe4c9903cdb9e09cada (patch)
tree5f2152b1f3fe45b47619f1f10cd18ab8731b7e41
parented7a2068432b62880bca89cd69546682a2e192cd (diff)
downloadrust-874514c7b4f58256eb1c9fe4c9903cdb9e09cada.tar.gz
rust-874514c7b4f58256eb1c9fe4c9903cdb9e09cada.zip
kmc-solid: Add `std::sys::solid::fs::File::read_buf`
Catching up with commit 3b263ceb5cb89b6d53b5a03b47ec447c3a7f7765
-rw-r--r--library/std/src/sys/solid/fs.rs28
1 files changed, 27 insertions, 1 deletions
diff --git a/library/std/src/sys/solid/fs.rs b/library/std/src/sys/solid/fs.rs
index abc60b56fbb..8a0eeff0c4d 100644
--- a/library/std/src/sys/solid/fs.rs
+++ b/library/std/src/sys/solid/fs.rs
@@ -2,7 +2,7 @@ use super::{abi, error};
 use crate::{
     ffi::{CStr, CString, OsStr, OsString},
     fmt,
-    io::{self, IoSlice, IoSliceMut, SeekFrom},
+    io::{self, IoSlice, IoSliceMut, ReadBuf, SeekFrom},
     mem::MaybeUninit,
     os::raw::{c_int, c_short},
     os::solid::ffi::OsStrExt,
@@ -339,6 +339,32 @@ impl File {
         }
     }
 
+    pub fn read_buf(&self, buf: &mut ReadBuf<'_>) -> io::Result<()> {
+        unsafe {
+            let len = buf.remaining();
+            let mut out_num_bytes = MaybeUninit::uninit();
+            error::SolidError::err_if_negative(abi::SOLID_FS_Read(
+                self.fd.raw(),
+                buf.unfilled_mut().as_mut_ptr() as *mut u8,
+                len,
+                out_num_bytes.as_mut_ptr(),
+            ))
+            .map_err(|e| e.as_io_error())?;
+
+            // Safety: `out_num_bytes` is filled by the successful call to
+            // `SOLID_FS_Read`
+            let num_bytes_read = out_num_bytes.assume_init();
+
+            // Safety: `num_bytes_read` bytes were written to the unfilled
+            // portion of the buffer
+            buf.assume_init(num_bytes_read);
+
+            buf.add_filled(num_bytes_read);
+
+            Ok(())
+        }
+    }
+
     pub fn read_vectored(&self, bufs: &mut [IoSliceMut<'_>]) -> io::Result<usize> {
         crate::io::default_read_vectored(|buf| self.read(buf), bufs)
     }