diff options
author | Kostya Shishkov <kostya.shishkov@gmail.com> | 2020-09-30 19:06:00 +0200 |
---|---|---|
committer | Kostya Shishkov <kostya.shishkov@gmail.com> | 2020-09-30 19:06:00 +0200 |
commit | 6c0356da10eef6e02cee247d334f8515dd2952cb (patch) | |
tree | bd746389981ea2a0f551367cfd5bda9c655ad352 | |
parent | ac818eac7671fa8ddfea5aa4fb86fc0b5ab82d2e (diff) | |
download | nihav-6c0356da10eef6e02cee247d334f8515dd2952cb.tar.gz |
core/io: fix reading behaviour with e.g. BufReader
-rw-r--r-- | nihav-core/src/io/byteio.rs | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/nihav-core/src/io/byteio.rs b/nihav-core/src/io/byteio.rs index adbb636..7b5f220 100644 --- a/nihav-core/src/io/byteio.rs +++ b/nihav-core/src/io/byteio.rs @@ -564,18 +564,30 @@ impl<T: Read+Seek> ByteIO for FileReader<T> { } fn read_buf(&mut self, buf: &mut [u8]) -> ByteIOResult<usize> { - let ret = self.file.read(buf); - if ret.is_err() { return Err(ByteIOError::ReadError); } - let sz = ret.unwrap(); - if sz < buf.len() { self.eof = true; return Err(ByteIOError::EOF); } - Ok(sz) + match self.file.read_exact(buf) { + Ok(()) => Ok(buf.len()), + Err(err) => { + if err.kind() == std::io::ErrorKind::UnexpectedEof { + self.eof = true; + Err(ByteIOError::EOF) + } else { + Err(ByteIOError::ReadError) + } + }, + } } fn read_buf_some(&mut self, buf: &mut [u8]) -> ByteIOResult<usize> { let ret = self.file.read(buf); if ret.is_err() { return Err(ByteIOError::ReadError); } let sz = ret.unwrap(); - if sz < buf.len() { self.eof = true; } + if sz < buf.len() { + if let Err(_err) = self.file.read(&mut buf[sz..][..1]) { + self.eof = true; + } else { + return Ok(sz + 1); + } + } Ok(sz) } |