xref: /aosp_15_r20/external/musl/src/stdio/fseek.c (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
1*c9945492SAndroid Build Coastguard Worker #include "stdio_impl.h"
2*c9945492SAndroid Build Coastguard Worker #include <errno.h>
3*c9945492SAndroid Build Coastguard Worker 
__fseeko_unlocked(FILE * f,off_t off,int whence)4*c9945492SAndroid Build Coastguard Worker int __fseeko_unlocked(FILE *f, off_t off, int whence)
5*c9945492SAndroid Build Coastguard Worker {
6*c9945492SAndroid Build Coastguard Worker 	/* Fail immediately for invalid whence argument. */
7*c9945492SAndroid Build Coastguard Worker 	if (whence != SEEK_CUR && whence != SEEK_SET && whence != SEEK_END) {
8*c9945492SAndroid Build Coastguard Worker 		errno = EINVAL;
9*c9945492SAndroid Build Coastguard Worker 		return -1;
10*c9945492SAndroid Build Coastguard Worker 	}
11*c9945492SAndroid Build Coastguard Worker 
12*c9945492SAndroid Build Coastguard Worker 	/* Adjust relative offset for unread data in buffer, if any. */
13*c9945492SAndroid Build Coastguard Worker 	if (whence == SEEK_CUR && f->rend) off -= f->rend - f->rpos;
14*c9945492SAndroid Build Coastguard Worker 
15*c9945492SAndroid Build Coastguard Worker 	/* Flush write buffer, and report error on failure. */
16*c9945492SAndroid Build Coastguard Worker 	if (f->wpos != f->wbase) {
17*c9945492SAndroid Build Coastguard Worker 		f->write(f, 0, 0);
18*c9945492SAndroid Build Coastguard Worker 		if (!f->wpos) return -1;
19*c9945492SAndroid Build Coastguard Worker 	}
20*c9945492SAndroid Build Coastguard Worker 
21*c9945492SAndroid Build Coastguard Worker 	/* Leave writing mode */
22*c9945492SAndroid Build Coastguard Worker 	f->wpos = f->wbase = f->wend = 0;
23*c9945492SAndroid Build Coastguard Worker 
24*c9945492SAndroid Build Coastguard Worker 	/* Perform the underlying seek. */
25*c9945492SAndroid Build Coastguard Worker 	if (f->seek(f, off, whence) < 0) return -1;
26*c9945492SAndroid Build Coastguard Worker 
27*c9945492SAndroid Build Coastguard Worker 	/* If seek succeeded, file is seekable and we discard read buffer. */
28*c9945492SAndroid Build Coastguard Worker 	f->rpos = f->rend = 0;
29*c9945492SAndroid Build Coastguard Worker 	f->flags &= ~F_EOF;
30*c9945492SAndroid Build Coastguard Worker 
31*c9945492SAndroid Build Coastguard Worker 	return 0;
32*c9945492SAndroid Build Coastguard Worker }
33*c9945492SAndroid Build Coastguard Worker 
__fseeko(FILE * f,off_t off,int whence)34*c9945492SAndroid Build Coastguard Worker int __fseeko(FILE *f, off_t off, int whence)
35*c9945492SAndroid Build Coastguard Worker {
36*c9945492SAndroid Build Coastguard Worker 	int result;
37*c9945492SAndroid Build Coastguard Worker 	FLOCK(f);
38*c9945492SAndroid Build Coastguard Worker 	result = __fseeko_unlocked(f, off, whence);
39*c9945492SAndroid Build Coastguard Worker 	FUNLOCK(f);
40*c9945492SAndroid Build Coastguard Worker 	return result;
41*c9945492SAndroid Build Coastguard Worker }
42*c9945492SAndroid Build Coastguard Worker 
fseek(FILE * f,long off,int whence)43*c9945492SAndroid Build Coastguard Worker int fseek(FILE *f, long off, int whence)
44*c9945492SAndroid Build Coastguard Worker {
45*c9945492SAndroid Build Coastguard Worker 	return __fseeko(f, off, whence);
46*c9945492SAndroid Build Coastguard Worker }
47*c9945492SAndroid Build Coastguard Worker 
48*c9945492SAndroid Build Coastguard Worker weak_alias(__fseeko, fseeko);
49