X-Git-Url: https://git.draconx.ca/gitweb/liblbx.git/blobdiff_plain/6ddd77d5bb60d875253f2427d279ac6caacdce68..bd5f6b55320b6889827908762197642b484ea28d:/src/fops.c diff --git a/src/fops.c b/src/fops.c index 746455f..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) @@ -96,13 +105,6 @@ static int pipe_seek(void *handle, long offset, int whence) 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; @@ -113,7 +115,6 @@ 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, }; @@ -127,11 +128,6 @@ 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); @@ -140,6 +136,5 @@ static int lbx_eof(void *handle) const struct lbx_file_ops lbx_arch_fops = { .read = lbx_read, .seek = lbx_seek, - .tell = lbx_tell, .eof = lbx_eof, };