X-Git-Url: https://git.draconx.ca/gitweb/liblbx.git/blobdiff_plain/958926fd7382d2c44828cdc70ca6c27bb281ff0d..HEAD:/src/fops.c diff --git a/src/fops.c b/src/fops.c index 834c8b2..521b50b 100644 --- a/src/fops.c +++ b/src/fops.c @@ -1,7 +1,7 @@ /* * 2ooM: The Master of Orion II Reverse Engineering Project * Default file operations structures for liblbx. - * Copyright (C) 2010 Nick Bowler + * Copyright © 2010, 2014 Nick Bowler * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,25 +16,33 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +#include #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; + } -static long file_tell(void *handle) -{ - return ftell((FILE *)handle); + return 0; } static int file_eof(void *handle) @@ -45,7 +53,6 @@ static int file_eof(void *handle) const struct lbx_file_ops lbx_default_fops = { .read = file_read, .seek = file_seek, - .tell = file_tell, .eof = file_eof, }; @@ -55,7 +62,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 +83,8 @@ static int pipe_seek(void *handle, long offset, int whence) case SEEK_END: distance = -1; break; + default: + assert(0); } if (distance < 0) @@ -92,16 +101,10 @@ static int pipe_seek(void *handle, long offset, int whence) return -1; } + clearerr(state->f); return 0; } -static long pipe_tell(void *handle) -{ - struct lbx_pipe_state *state = handle; - - return state->offset; -} - static int pipe_eof(void *handle) { struct lbx_pipe_state *state = handle; @@ -112,6 +115,26 @@ static int pipe_eof(void *handle) const struct lbx_file_ops lbx_pipe_fops = { .read = pipe_read, .seek = pipe_seek, - .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 int lbx_eof(void *handle) +{ + return lbx_file_eof(handle); +} + +const struct lbx_file_ops lbx_arch_fops = { + .read = lbx_read, + .seek = lbx_seek, + .eof = lbx_eof, +};