diff options
Diffstat (limited to 'libio/iofclose.c')
-rw-r--r-- | libio/iofclose.c | 33 |
1 files changed, 12 insertions, 21 deletions
diff --git a/libio/iofclose.c b/libio/iofclose.c index 79a0543471..67fadbed2d 100644 --- a/libio/iofclose.c +++ b/libio/iofclose.c @@ -33,29 +33,20 @@ _IO_fclose (fp) { int status; - if (fp == NULL) - { - /* Close all streams. */ - _IO_cleanup (); - status = 0; - } + 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) { - 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); - } + fp->_IO_file_flags = 0; + free(fp); } return status; |