From 23fe526c555e894916b1a17df2f5fc1a44a16d23 Mon Sep 17 00:00:00 2001 From: jD91mZM2 <me@krake.one> Date: Sun, 14 Oct 2018 08:24:21 +0200 Subject: [PATCH] Fix feof and ferror --- src/header/stdio/mod.rs | 33 ++++++++++++++++++++++++++++----- tests/stdio/fgets.c | 4 ++++ 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/src/header/stdio/mod.rs b/src/header/stdio/mod.rs index 23bec419..3b3de751 100644 --- a/src/header/stdio/mod.rs +++ b/src/header/stdio/mod.rs @@ -93,7 +93,17 @@ impl Read for FILE { impl BufRead for FILE { fn fill_buf(&mut self) -> io::Result<&[u8]> { if self.read_pos == self.read_size { - self.read_size = self.file.read(&mut self.read_buf)?; + self.read_size = match self.file.read(&mut self.read_buf) { + Ok(0) => { + self.flags |= F_EOF; + 0 + }, + Ok(n) => n, + Err(err) => { + self.flags |= F_ERR; + return Err(err); + } + }; self.read_pos = 0; } Ok(&self.read_buf[self.read_pos..self.read_size]) @@ -104,10 +114,22 @@ impl BufRead for FILE { } impl Write for FILE { fn write(&mut self, buf: &[u8]) -> io::Result<usize> { - self.writer.write(buf) + match self.writer.write(buf) { + Ok(n) => Ok(n), + Err(err) => { + self.flags |= F_ERR; + Err(err) + } + } } fn flush(&mut self) -> io::Result<()> { - self.writer.flush() + match self.writer.flush() { + Ok(()) => Ok(()), + Err(err) => { + self.flags |= F_ERR; + Err(err) + } + } } } impl WriteFmt for FILE { @@ -152,7 +174,8 @@ impl<'a> Drop for LockGuard<'a> { /// Clears EOF and ERR indicators on a stream #[no_mangle] -pub extern "C" fn clearerr(stream: &mut FILE) { +pub extern "C" fn clearerr(stream: *mut FILE) { + let mut stream = unsafe { &mut *stream }.lock(); stream.flags &= !(F_EOF | F_ERR); } @@ -465,7 +488,7 @@ pub extern "C" fn fseeko(stream: *mut FILE, mut off: off_t, whence: c_int) -> c_ return err as c_int; } - stream.flags &= !F_EOF; + stream.flags &= !(F_EOF | F_ERR); stream.read_pos = 0; stream.read_size = 0; stream.unget = None; diff --git a/tests/stdio/fgets.c b/tests/stdio/fgets.c index 34877e90..c89e491a 100644 --- a/tests/stdio/fgets.c +++ b/tests/stdio/fgets.c @@ -10,6 +10,10 @@ int main() { fputs(line, stdout); } else { puts("EOF"); + if (!feof(f)) { + puts("feof() not updated!"); + return -1; + } break; } } -- GitLab