1 #include "stdio_impl.h" 2 #include <limits.h> 3 #include <errno.h> 4 __ftello_unlocked(FILE * f)5off_t __ftello_unlocked(FILE *f) 6 { 7 off_t pos = f->seek(f, 0, 8 (f->flags & F_APP) && f->wpos != f->wbase 9 ? SEEK_END : SEEK_CUR); 10 if (pos < 0) return pos; 11 12 /* Adjust for data in buffer. */ 13 if (f->rend) 14 pos += f->rpos - f->rend; 15 else if (f->wbase) 16 pos += f->wpos - f->wbase; 17 return pos; 18 } 19 __ftello(FILE * f)20off_t __ftello(FILE *f) 21 { 22 off_t pos; 23 FLOCK(f); 24 pos = __ftello_unlocked(f); 25 FUNLOCK(f); 26 return pos; 27 } 28 ftell(FILE * f)29long ftell(FILE *f) 30 { 31 off_t pos = __ftello(f); 32 if (pos > LONG_MAX) { 33 errno = EOVERFLOW; 34 return -1; 35 } 36 return pos; 37 } 38 39 weak_alias(__ftello, ftello); 40 41 weak_alias(ftello, ftello64); 42