diff options
| -rw-r--r-- | src/exit/exit.c | 8 | ||||
| -rw-r--r-- | src/stdio/__stdio_exit.c | 23 | ||||
| -rw-r--r-- | src/stdio/__toread.c | 8 | ||||
| -rw-r--r-- | src/stdio/__towrite.c | 7 | 
4 files changed, 40 insertions, 6 deletions
| diff --git a/src/exit/exit.c b/src/exit/exit.c index 03c46ca5..e4aeaf15 100644 --- a/src/exit/exit.c +++ b/src/exit/exit.c @@ -9,9 +9,10 @@ static void dummy()  {  } -/* __towrite.c and atexit.c override these */ +/* __toread.c, __towrite.c, and atexit.c override these */  weak_alias(dummy, __funcs_on_exit); -weak_alias(dummy, __fflush_on_exit); +weak_alias(dummy, __flush_on_exit); +weak_alias(dummy, __seek_on_exit);  void exit(int code)  { @@ -23,7 +24,8 @@ void exit(int code)  	__funcs_on_exit();  	if (libc.fini) libc.fini();  	if (libc.ldso_fini) libc.ldso_fini(); -	__fflush_on_exit(); +	__flush_on_exit(); +	__seek_on_exit();  	_Exit(code);  	for(;;); diff --git a/src/stdio/__stdio_exit.c b/src/stdio/__stdio_exit.c new file mode 100644 index 00000000..3f87e7ed --- /dev/null +++ b/src/stdio/__stdio_exit.c @@ -0,0 +1,23 @@ +#include "stdio_impl.h" + +static FILE *const dummy_file = 0; +weak_alias(dummy_file, __stdin_used); +weak_alias(dummy_file, __stdout_used); +weak_alias(dummy_file, __stderr_used); + +static void close_file(FILE *f) +{ +	if (!f) return; +	FLOCK(f); +	if (f->wpos > f->wbase) f->write(f, 0, 0); +	if (f->rpos < f->rend) f->seek(f, f->rpos-f->rend, SEEK_CUR); +} + +void __stdio_exit(void) +{ +	FILE *f; +	OFLLOCK(); +	for (f=libc.ofl_head; f; f=f->next) close_file(f); +	close_file(__stdin_used); +	close_file(__stdout_used); +} diff --git a/src/stdio/__toread.c b/src/stdio/__toread.c index f00cc467..c2ae80fd 100644 --- a/src/stdio/__toread.c +++ b/src/stdio/__toread.c @@ -12,3 +12,11 @@ int __toread(FILE *f)  	f->rpos = f->rend = f->buf;  	return 0;  } + +static const int dummy = 0; +weak_alias(dummy, __towrite_used); + +void __seek_on_exit() +{ +	if (!__towrite_used) __stdio_exit(); +} diff --git a/src/stdio/__towrite.c b/src/stdio/__towrite.c index 4bf96f4d..ba67e0df 100644 --- a/src/stdio/__towrite.c +++ b/src/stdio/__towrite.c @@ -17,8 +17,9 @@ int __towrite(FILE *f)  	return 0;  } -/* Link flush-on-exit code iff any stdio write functions are linked. */ -void __fflush_on_exit() +const int __towrite_used = 1; + +void __flush_on_exit()  { -	fflush(0); +	__stdio_exit();  } | 
