]> git.draconx.ca Git - liblbx.git/blobdiff - src/fops.c
liblbx: Implement improved error reporting mechanism.
[liblbx.git] / src / fops.c
index 746455fd14d9f2346790c69c7c62bd94b504c584..e546b1097692f3e0f5b07c9403828772de62f53b 100644 (file)
  *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 #include <stdio.h>
+#include <errno.h>
 
 #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)
@@ -55,7 +64,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;
 }