diff --git a/libmaxsi/decl/FILE.h b/libmaxsi/decl/FILE.h index 2e16dad4..13d5ef83 100644 --- a/libmaxsi/decl/FILE.h +++ b/libmaxsi/decl/FILE.h @@ -19,6 +19,7 @@ typedef struct _FILE size_t (*write_func)(const void* ptr, size_t size, size_t nmemb, void* user); int (*seek_func)(void* user, off_t offset, int whence); off_t (*tell_func)(void* user); + void (*seterr_func)(void* user); void (*clearerr_func)(void* user); int (*eof_func)(void* user); int (*error_func)(void* user); diff --git a/libmaxsi/fdio.c b/libmaxsi/fdio.c index 4b22148e..e4888ac0 100644 --- a/libmaxsi/fdio.c +++ b/libmaxsi/fdio.c @@ -87,6 +87,12 @@ static off_t fdio_tell(void* user) return lseek(fdio->fd, 0, SEEK_CUR); } +static void fdio_seterr(void* user) +{ + fdio_t* fdio = (fdio_t*) user; + fdio->flags |= FDIO_ERROR; +} + static void fdio_clearerr(void* user) { fdio_t* fdio = (fdio_t*) user; @@ -143,6 +149,7 @@ int fdio_install(FILE* fp, const char* mode, int fd) fp->write_func = fdio_write; fp->seek_func = fdio_seek; fp->tell_func = fdio_tell; + fp->seterr_func = fdio_seterr; fp->clearerr_func = fdio_clearerr; fp->eof_func = fdio_eof; fp->error_func = fdio_error; diff --git a/libmaxsi/file.c b/libmaxsi/file.c index acb51fa8..a13bc439 100644 --- a/libmaxsi/file.c +++ b/libmaxsi/file.c @@ -104,6 +104,11 @@ int fseek(FILE* fp, long offset, int whence) return fseeko(fp, offset, whence); } +void fseterr(FILE* fp) +{ + if ( fp->seterr_func ) { fp->seterr_func(fp->user); } +} + void clearerr(FILE* fp) { if ( fp->clearerr_func ) { fp->clearerr_func(fp->user); } diff --git a/libmaxsi/include/stdio.h b/libmaxsi/include/stdio.h index 1617c00a..d06afc74 100644 --- a/libmaxsi/include/stdio.h +++ b/libmaxsi/include/stdio.h @@ -159,6 +159,7 @@ extern char* tempnam(const char* dir, const char* pfx); #define fpending __fpending #define flushlbf _flushlbf #define fsetlocking __fsetlocking +void fseterr(FILE* fp); void fregister(FILE* fp); void funregister(FILE* fp); FILE* fnewfile(void);