* 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)
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;
}
return -1;
}
+ clearerr(state->f);
return 0;
}