1*c9945492SAndroid Build Coastguard Worker #include "stdio_impl.h"
2*c9945492SAndroid Build Coastguard Worker
3*c9945492SAndroid Build Coastguard Worker /* stdout.c will override this if linked */
4*c9945492SAndroid Build Coastguard Worker static FILE *volatile dummy = 0;
5*c9945492SAndroid Build Coastguard Worker weak_alias(dummy, __stdout_used);
6*c9945492SAndroid Build Coastguard Worker weak_alias(dummy, __stderr_used);
7*c9945492SAndroid Build Coastguard Worker
fflush(FILE * f)8*c9945492SAndroid Build Coastguard Worker int fflush(FILE *f)
9*c9945492SAndroid Build Coastguard Worker {
10*c9945492SAndroid Build Coastguard Worker if (!f) {
11*c9945492SAndroid Build Coastguard Worker int r = 0;
12*c9945492SAndroid Build Coastguard Worker if (__stdout_used) r |= fflush(__stdout_used);
13*c9945492SAndroid Build Coastguard Worker if (__stderr_used) r |= fflush(__stderr_used);
14*c9945492SAndroid Build Coastguard Worker
15*c9945492SAndroid Build Coastguard Worker for (f=*__ofl_lock(); f; f=f->next) {
16*c9945492SAndroid Build Coastguard Worker FLOCK(f);
17*c9945492SAndroid Build Coastguard Worker if (f->wpos != f->wbase) r |= fflush(f);
18*c9945492SAndroid Build Coastguard Worker FUNLOCK(f);
19*c9945492SAndroid Build Coastguard Worker }
20*c9945492SAndroid Build Coastguard Worker __ofl_unlock();
21*c9945492SAndroid Build Coastguard Worker
22*c9945492SAndroid Build Coastguard Worker return r;
23*c9945492SAndroid Build Coastguard Worker }
24*c9945492SAndroid Build Coastguard Worker
25*c9945492SAndroid Build Coastguard Worker FLOCK(f);
26*c9945492SAndroid Build Coastguard Worker
27*c9945492SAndroid Build Coastguard Worker /* If writing, flush output */
28*c9945492SAndroid Build Coastguard Worker if (f->wpos != f->wbase) {
29*c9945492SAndroid Build Coastguard Worker f->write(f, 0, 0);
30*c9945492SAndroid Build Coastguard Worker if (!f->wpos) {
31*c9945492SAndroid Build Coastguard Worker FUNLOCK(f);
32*c9945492SAndroid Build Coastguard Worker return EOF;
33*c9945492SAndroid Build Coastguard Worker }
34*c9945492SAndroid Build Coastguard Worker }
35*c9945492SAndroid Build Coastguard Worker
36*c9945492SAndroid Build Coastguard Worker /* If reading, sync position, per POSIX */
37*c9945492SAndroid Build Coastguard Worker if (f->rpos != f->rend) f->seek(f, f->rpos-f->rend, SEEK_CUR);
38*c9945492SAndroid Build Coastguard Worker
39*c9945492SAndroid Build Coastguard Worker /* Clear read and write modes */
40*c9945492SAndroid Build Coastguard Worker f->wpos = f->wbase = f->wend = 0;
41*c9945492SAndroid Build Coastguard Worker f->rpos = f->rend = 0;
42*c9945492SAndroid Build Coastguard Worker
43*c9945492SAndroid Build Coastguard Worker FUNLOCK(f);
44*c9945492SAndroid Build Coastguard Worker return 0;
45*c9945492SAndroid Build Coastguard Worker }
46*c9945492SAndroid Build Coastguard Worker
47*c9945492SAndroid Build Coastguard Worker weak_alias(fflush, fflush_unlocked);
48