]> git.saurik.com Git - apple/libc.git/blobdiff - stdio/FreeBSD/fclose.c
Libc-1439.100.3.tar.gz
[apple/libc.git] / stdio / FreeBSD / fclose.c
index ad4dae7a531cddbe64843dc856b6290338de9587..25a6cbbf4f561a8cd47b93d3c74587ca7e5dc70b 100644 (file)
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *     This product includes software developed by the University of
- *     California, Berkeley and its contributors.
  * 4. Neither the name of the University nor the names of its contributors
  *    may be used to endorse or promote products derived from this software
  *    without specific prior written permission.
@@ -38,7 +34,7 @@
 static char sccsid[] = "@(#)fclose.c   8.1 (Berkeley) 6/4/93";
 #endif /* LIBC_SCCS and not lint */
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/lib/libc/stdio/fclose.c,v 1.11 2002/03/22 21:53:04 obrien Exp $");
+__FBSDID("$FreeBSD: src/lib/libc/stdio/fclose.c,v 1.12 2007/01/09 00:28:06 imp Exp $");
 
 #include "namespace.h"
 #include <errno.h>
@@ -52,15 +48,27 @@ int
 fclose(FILE *fp)
 {
        int r;
+       int error = 0;
 
+       pthread_once(&__sdidinit, __sinit);
+
+       if (fp == NULL) {
+               errno = EFAULT;
+               return (EOF);
+       }
        if (fp->_flags == 0) {  /* not open! */
                errno = EBADF;
                return (EOF);
        }
        FLOCKFILE(fp);
-       r = fp->_flags & __SWR ? __sflush(fp) : 0;
-       if (fp->_close != NULL && (*fp->_close)(fp->_cookie) < 0)
+       r = __sflush(fp);
+       if (r < 0) {
+               error = errno;
+       }
+       if (fp->_close != NULL && (*fp->_close)(fp->_cookie) < 0) {
                r = EOF;
+               error = errno;
+       }
        if (fp->_flags & __SMBF)
                free((char *)fp->_bf._base);
        if (HASUB(fp))
@@ -69,7 +77,11 @@ fclose(FILE *fp)
                FREELB(fp);
        fp->_file = -1;
        fp->_r = fp->_w = 0;    /* Mess up if reaccessed. */
-       fp->_flags = 0;         /* Release this FILE for reuse. */
        FUNLOCKFILE(fp);
+       __sfprelease(fp);       /* Release this FILE for reuse. */
+       /* Don't clobber errno unnecessarily. */
+       if (error) {
+               errno = error;
+       }
        return (r);
 }