aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKostya Shishkov <kostya.shishkov@gmail.com>2020-09-30 19:06:00 +0200
committerKostya Shishkov <kostya.shishkov@gmail.com>2020-09-30 19:06:00 +0200
commit6c0356da10eef6e02cee247d334f8515dd2952cb (patch)
treebd746389981ea2a0f551367cfd5bda9c655ad352
parentac818eac7671fa8ddfea5aa4fb86fc0b5ab82d2e (diff)
downloadnihav-6c0356da10eef6e02cee247d334f8515dd2952cb.tar.gz
core/io: fix reading behaviour with e.g. BufReader
-rw-r--r--nihav-core/src/io/byteio.rs24
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)
}