diff options
Diffstat (limited to 'libc-top-half/musl/src/stdio/fseek.c')
-rw-r--r-- | libc-top-half/musl/src/stdio/fseek.c | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/libc-top-half/musl/src/stdio/fseek.c b/libc-top-half/musl/src/stdio/fseek.c new file mode 100644 index 0000000..c07f7e9 --- /dev/null +++ b/libc-top-half/musl/src/stdio/fseek.c @@ -0,0 +1,50 @@ +#include "stdio_impl.h" +#include <errno.h> + +int __fseeko_unlocked(FILE *f, off_t off, int whence) +{ + /* Fail immediately for invalid whence argument. */ + if (whence != SEEK_CUR && whence != SEEK_SET && whence != SEEK_END) { + errno = EINVAL; + return -1; + } + + /* Adjust relative offset for unread data in buffer, if any. */ + if (whence == SEEK_CUR && f->rend) off -= f->rend - f->rpos; + + /* Flush write buffer, and report error on failure. */ + if (f->wpos != f->wbase) { + f->write(f, 0, 0); + if (!f->wpos) return -1; + } + + /* Leave writing mode */ + f->wpos = f->wbase = f->wend = 0; + + /* Perform the underlying seek. */ + if (f->seek(f, off, whence) < 0) return -1; + + /* If seek succeeded, file is seekable and we discard read buffer. */ + f->rpos = f->rend = 0; + f->flags &= ~F_EOF; + + return 0; +} + +int __fseeko(FILE *f, off_t off, int whence) +{ + int result; + FLOCK(f); + result = __fseeko_unlocked(f, off, whence); + FUNLOCK(f); + return result; +} + +int fseek(FILE *f, long off, int whence) +{ + return __fseeko(f, off, whence); +} + +weak_alias(__fseeko, fseeko); + +weak_alias(fseeko, fseeko64); |