]> 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 91df68a9044f6d112d771bdf10b24f16ae5d51d9..25a6cbbf4f561a8cd47b93d3c74587ca7e5dc70b 100644 (file)
@@ -48,9 +48,9 @@ int
 fclose(FILE *fp)
 {
        int r;
+       int error = 0;
 
-       if (!__sdidinit)
-               __sinit();
+       pthread_once(&__sdidinit, __sinit);
 
        if (fp == NULL) {
                errno = EFAULT;
@@ -61,9 +61,14 @@ fclose(FILE *fp)
                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))
@@ -72,7 +77,11 @@ fclose(FILE *fp)
                FREELB(fp);
        fp->_file = -1;
        fp->_r = fp->_w = 0;    /* Mess up if reaccessed. */
-       __sfprelease(fp);       /* 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);
 }