X-Git-Url: http://git.draconx.ca/gitweb/liblbx.git/blobdiff_plain/690f160e36849a41199023c5addd54afd00f01fd..2caeb2fc3c40ecae99f65b791864381fde3015dc:/src/fops.c diff --git a/src/fops.c b/src/fops.c index 2a3db82..5ae349f 100644 --- a/src/fops.c +++ b/src/fops.c @@ -17,19 +17,31 @@ * along with this program. If not, see . */ #include +#include +#include #include "misc.h" +#include "error.h" #include "lbx.h" /* Default I/O operations for ordinary files. */ static size_t file_read(void *buf, size_t size, void *handle) { - return fread(buf, 1, size, (FILE *)handle); + size_t rc = fread(buf, 1, size, (FILE *)handle); + + if (rc < size && ferror((FILE *)handle)) + lbx_error_raise(-errno); + return rc; } static int file_seek(void *handle, long offset, int whence) { - return fseek((FILE *)handle, offset, whence); + if (fseek((FILE *)handle, offset, whence) == -1) { + lbx_error_raise(-errno); + return -1; + } + + return 0; } static long file_tell(void *handle) @@ -55,7 +67,7 @@ static size_t pipe_read(void *buf, size_t size, void *handle) struct lbx_pipe_state *state = handle; size_t rc; - rc = fread(buf, 1, size, state->f); + rc = file_read(buf, size, state->f); state->offset += rc; return rc; } @@ -76,6 +88,8 @@ static int pipe_seek(void *handle, long offset, int whence) case SEEK_END: distance = -1; break; + default: + assert(0); } if (distance < 0) @@ -92,6 +106,7 @@ static int pipe_seek(void *handle, long offset, int whence) return -1; } + clearerr(state->f); return 0; }