diff options
author | Vladimir Azarov <avm@intermediate-node.net> | 2024-10-01 15:47:05 +0200 |
---|---|---|
committer | Vladimir Azarov <avm@intermediate-node.net> | 2024-10-01 15:47:05 +0200 |
commit | 4abab5ad6c8465a7528ccdd5f49367da05f78bbd (patch) | |
tree | ebf009bf1376a5a223a915bc27cbbd791a1316bc /src/stdio/__stdio_exit.c |
Initial version
Diffstat (limited to 'src/stdio/__stdio_exit.c')
-rw-r--r-- | src/stdio/__stdio_exit.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/src/stdio/__stdio_exit.c b/src/stdio/__stdio_exit.c new file mode 100644 index 0000000..a5e42c6 --- /dev/null +++ b/src/stdio/__stdio_exit.c @@ -0,0 +1,25 @@ +#include "stdio_impl.h" + +static FILE *volatile 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; + FFINALLOCK(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; + for (f=*__ofl_lock(); f; f=f->next) close_file(f); + close_file(__stdin_used); + close_file(__stdout_used); + close_file(__stderr_used); +} + +weak_alias(__stdio_exit, __stdio_exit_needed); |