/* Copyright (C) 2004 Manuel Novoa III * * GNU Library General Public License (LGPL) version 2 or later. * * Dedicated to Toni. See uClibc/DEDICATION.mjn3 for details. */ #include #ifdef __USE_GNU #include "_stdio.h" /* NOTE: GLIBC difference!!! -- fcloseall * According to the info pages, glibc actually fclose()s all open files. * Apparently, glibc's new version only fflush()s and unbuffers all * writing streams to cope with unordered destruction of c++ static * objects. */ int fcloseall (void) { #ifdef __STDIO_HAS_OPENLIST int retval = 0; FILE *f; __STDIO_OPENLIST_INC_USE; #ifdef __UCLIBC_MJN3_ONLY__ #warning REMINDER: should probably have a get_head() operation #endif __STDIO_THREADLOCK_OPENLIST_ADD; f = _stdio_openlist; __STDIO_THREADUNLOCK_OPENLIST_ADD; while (f) { #ifdef __UCLIBC_MJN3_ONLY__ #warning REMINDER: should probably have a get_next() operation #endif FILE *n = f->__nextopen; __STDIO_AUTO_THREADLOCK_VAR; __STDIO_AUTO_THREADLOCK(f); /* Only call fclose on the stream if it is not already closed. */ if ((f->__modeflags & (__FLAG_READONLY|__FLAG_WRITEONLY)) != (__FLAG_READONLY|__FLAG_WRITEONLY) ) { if (fclose(f)) { retval = EOF; } } __STDIO_AUTO_THREADUNLOCK(f); f = n; } __STDIO_OPENLIST_DEC_USE; return retval; #else #warning Always fails in this configuration because no open file list. return EOF; #endif } #endif