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