X-Git-Url: https://git.draconx.ca/gitweb/liblbx.git/blobdiff_plain/958926fd7382d2c44828cdc70ca6c27bb281ff0d..594902a517f5a77535a2d7bb903f8e1de358edf6:/src/fops.c?ds=inline
diff --git a/src/fops.c b/src/fops.c
index 834c8b2..e546b10 100644
--- a/src/fops.c
+++ b/src/fops.c
@@ -17,19 +17,28 @@
* 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;
+ }
}
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;
}
@@ -92,6 +101,7 @@ static int pipe_seek(void *handle, long offset, int whence)
return -1;
}
+ clearerr(state->f);
return 0;
}
@@ -115,3 +125,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,
+};