1#include "stdio_impl.h" 2 3int __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) 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 27int __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 36int fseek(FILE *f, long off, int whence) 37{ 38 return __fseeko(f, off, whence); 39} 40 41weak_alias(__fseeko, fseeko); 42 43LFS64(fseeko); 44