github.com/afumu/libc@v0.0.6/musl/src/stdio/fseek.c (about) 1 #include "stdio_impl.h" 2 3 int __fseeko_unlocked(FILE *f, off_t off, int whence) 4 { 5 /* Adjust relative offset for unread data in buffer, if any. */ 6 if (whence == SEEK_CUR && f->rend) off -= f->rend - f->rpos; 7 8 /* Flush write buffer, and report error on failure. */ 9 if (f->wpos != f->wbase) { 10 f->write(f, 0, 0); 11 if (!f->wpos) return -1; 12 } 13 14 /* Leave writing mode */ 15 f->wpos = f->wbase = f->wend = 0; 16 17 /* Perform the underlying seek. */ 18 if (f->seek(f, off, whence) < 0) return -1; 19 20 /* If seek succeeded, file is seekable and we discard read buffer. */ 21 f->rpos = f->rend = 0; 22 f->flags &= ~F_EOF; 23 24 return 0; 25 } 26 27 int __fseeko(FILE *f, off_t off, int whence) 28 { 29 int result; 30 FLOCK(f); 31 result = __fseeko_unlocked(f, off, whence); 32 FUNLOCK(f); 33 return result; 34 } 35 36 int fseek(FILE *f, long off, int whence) 37 { 38 return __fseeko(f, off, whence); 39 } 40 41 weak_alias(__fseeko, fseeko); 42 43 weak_alias(fseeko, fseeko64);