diff options
Diffstat (limited to 'libio/iofclose.c')
-rw-r--r-- | libio/iofclose.c | 34 |
1 files changed, 22 insertions, 12 deletions
diff --git a/libio/iofclose.c b/libio/iofclose.c index 77c7b50088..79a0543471 100644 --- a/libio/iofclose.c +++ b/libio/iofclose.c @@ -33,21 +33,31 @@ _IO_fclose (fp) { int status; - CHECK_FILE(fp, EOF); - - __libc_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp); - _IO_flockfile (fp); - if (fp->_IO_file_flags & _IO_IS_FILEBUF) - status = _IO_file_close_it (fp); + if (fp == NULL) + { + /* Close all streams. */ + _IO_cleanup (); + status = 0; + } else - status = fp->_flags & _IO_ERR_SEEN ? -1 : 0; - _IO_FINISH (fp); - __libc_cleanup_region_end (1); - if (fp != _IO_stdin && fp != _IO_stdout && fp != _IO_stderr) { - fp->_IO_file_flags = 0; - free(fp); + CHECK_FILE(fp, EOF); + + _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp); + _IO_flockfile (fp); + if (fp->_IO_file_flags & _IO_IS_FILEBUF) + status = _IO_file_close_it (fp); + else + status = fp->_flags & _IO_ERR_SEEN ? -1 : 0; + _IO_FINISH (fp); + _IO_cleanup_region_end (1); + if (fp != _IO_stdin && fp != _IO_stdout && fp != _IO_stderr) + { + fp->_IO_file_flags = 0; + free(fp); + } } + return status; } |