Index: fusl/src/stdio/ftell.c |
diff --git a/fusl/src/stdio/ftell.c b/fusl/src/stdio/ftell.c |
new file mode 100644 |
index 0000000000000000000000000000000000000000..bb62897a4c7cc710295fd62aae8bb727b116a4d5 |
--- /dev/null |
+++ b/fusl/src/stdio/ftell.c |
@@ -0,0 +1,37 @@ |
+#include "stdio_impl.h" |
+#include <limits.h> |
+#include <errno.h> |
+ |
+off_t __ftello_unlocked(FILE *f) |
+{ |
+ off_t pos = f->seek(f, 0, |
+ (f->flags & F_APP) && f->wpos > f->wbase |
+ ? SEEK_END : SEEK_CUR); |
+ if (pos < 0) return pos; |
+ |
+ /* Adjust for data in buffer. */ |
+ return pos - (f->rend - f->rpos) + (f->wpos - f->wbase); |
+} |
+ |
+off_t __ftello(FILE *f) |
+{ |
+ off_t pos; |
+ FLOCK(f); |
+ pos = __ftello_unlocked(f); |
+ FUNLOCK(f); |
+ return pos; |
+} |
+ |
+long ftell(FILE *f) |
+{ |
+ off_t pos = __ftello(f); |
+ if (pos > LONG_MAX) { |
+ errno = EOVERFLOW; |
+ return -1; |
+ } |
+ return pos; |
+} |
+ |
+weak_alias(__ftello, ftello); |
+ |
+LFS64(ftello); |