From dfa3845c339e843247a3f4757acce0d3ff2cec34 Mon Sep 17 00:00:00 2001
From: jD91mZM2 <me@krake.one>
Date: Tue, 2 Oct 2018 18:47:06 +0200
Subject: [PATCH] Make fread/fwrite retry their respective operations

---
 src/header/stdio/mod.rs | 20 ++++++++++++++------
 1 file changed, 14 insertions(+), 6 deletions(-)

diff --git a/src/header/stdio/mod.rs b/src/header/stdio/mod.rs
index bf145326f..23bec4193 100644
--- a/src/header/stdio/mod.rs
+++ b/src/header/stdio/mod.rs
@@ -387,10 +387,14 @@ pub extern "C" fn fread(ptr: *mut c_void, size: size_t, count: size_t, stream: *
         ptr as *mut u8,
         size as usize * count as usize
     ) };
-    match stream.read(buf) {
-        Ok(bytes) => (bytes as usize / size as usize) as size_t,
-        Err(_) => 0
+    let mut read = 0;
+    while read < buf.len() {
+        match stream.read(&mut buf[read..]) {
+            Ok(0) | Err(_) => break,
+            Ok(n) => read += n
+        }
     }
+    (read / size as usize) as size_t
 }
 
 #[no_mangle]
@@ -512,10 +516,14 @@ pub extern "C" fn fwrite(ptr: *const c_void, size: usize, count: usize, stream:
         ptr as *mut u8,
         size as usize * count as usize
     ) };
-    match stream.write(buf) {
-        Ok(bytes) => (bytes as usize / size as usize) as size_t,
-        Err(_) => 0
+    let mut written = 0;
+    while written < buf.len() {
+        match stream.write(&mut buf[written..]) {
+            Ok(0) | Err(_) => break,
+            Ok(n) => written += n
+        }
     }
+    (written / size as usize) as size_t
 }
 
 /// Get a single char from a stream
-- 
GitLab