OLD | NEW |
(Empty) | |
| 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) 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 LFS64(fseeko); |
OLD | NEW |