| /* Copyright (C) 2004       Manuel Novoa III    <mjn3@codepoet.org> | 
 |  * | 
 |  * GNU Library General Public License (LGPL) version 2 or later. | 
 |  * | 
 |  * Dedicated to Toni.  See uClibc/DEDICATION.mjn3 for details. | 
 |  */ | 
 |  | 
 | #include <features.h> | 
 |  | 
 | #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 |