Index: fusl/src/stdio/fseek.c |
diff --git a/fusl/src/stdio/fseek.c b/fusl/src/stdio/fseek.c |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b160b74edca0db9eeb8599a268a9ffc469d1aeb3 |
--- /dev/null |
+++ b/fusl/src/stdio/fseek.c |
@@ -0,0 +1,43 @@ |
+#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); |
+ |
+LFS64(fseeko); |