rc = fops->read(buf, want, f->lbx->f);
f->offset += rc;
- if (want < n || (rc < want && fops->eof(f->lbx->f)))
+ if (rc < want) {
+ if (fops->eof(f->lbx->f))
+ lbx_error_raise(LBX_EEOF);
+ } else if (rc < n) {
f->eof = 1;
+ }
+
return rc;
}
unsigned char buf[1024];
rc = lbx_file_read(f, buf, sizeof buf);
- if (rc == 0) {
- if (lbx_file_eof(f))
- ret = 0;
- break;
- }
-
- if (fwrite(buf, rc, 1, of) != 1) {
- tool_err(0, "%s: fwrite", stat->name);
- break;
+ if (rc > 0) {
+ /* Write out any data we got. */
+ if (fwrite(buf, rc, 1, of) != 1) {
+ tool_err(0, "%s: fwrite", stat->name);
+ break;
+ }
}
+ /* Now test for read errors */
if (rc < sizeof buf) {
- if (lbx_file_eof(f))
+ if (!lbx_file_eof(f))
+ tool_err(-1, "error reading archive: %s", lbx_errmsg());
+ else
ret = 0;
break;
}