| #include "stdio_impl.h" |
| |
| int __fseeko_unlocked(FILE* f, off_t off, int whence) { |
| /* Adjust relative offset for unread data in buffer, if any. */ |
| if (whence == SEEK_CUR) |
| 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); |