xref: /aosp_15_r20/external/musl/src/stdio/fflush.c (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
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