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