| #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. */ |
| if (f->rend) |
| pos += f->rpos - f->rend; |
| else if (f->wbase) |
| pos += f->wpos - f->wbase; |
| return pos; |
| } |
| |
| 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); |
| |
| weak_alias(ftello, ftello64); |