X-Git-Url: http://git.draconx.ca/gitweb/liblbx.git/blobdiff_plain/a6ae4dd126e7b2b678e0db31b68bba51311282cc..06a82a827480c9701487b216a20528d160262118:/src/fops.c diff --git a/src/fops.c b/src/fops.c index 2ae6c61..26b392f 100644 --- a/src/fops.c +++ b/src/fops.c @@ -17,19 +17,30 @@ * along with this program. If not, see . */ #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 +66,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; } @@ -66,7 +77,18 @@ static int pipe_seek(void *handle, long offset, int whence) struct lbx_pipe_state *state = handle; long distance; - distance = offset - state->offset; + switch (whence) { + case SEEK_SET: + distance = offset - state->offset; + break; + case SEEK_CUR: + distance = offset; + break; + case SEEK_END: + distance = -1; + break; + } + if (distance < 0) return -1; @@ -81,6 +103,7 @@ static int pipe_seek(void *handle, long offset, int whence) return -1; } + clearerr(state->f); return 0; } @@ -104,3 +127,30 @@ const struct lbx_file_ops lbx_pipe_fops = { .tell = pipe_tell, .eof = pipe_eof, }; + +static size_t lbx_read(void *buf, size_t size, void *handle) +{ + return lbx_file_read(handle, buf, size); +} + +static int lbx_seek(void *handle, long offset, int whence) +{ + return lbx_file_seek(handle, offset, whence); +} + +static long lbx_tell(void *handle) +{ + return lbx_file_tell(handle); +} + +static int lbx_eof(void *handle) +{ + return lbx_file_eof(handle); +} + +const struct lbx_file_ops lbx_arch_fops = { + .read = lbx_read, + .seek = lbx_seek, + .tell = lbx_tell, + .eof = lbx_eof, +};