]> git.saurik.com Git - apple/libc.git/blobdiff - stdio/FreeBSD/fclose.c
Libc-1439.40.11.tar.gz
[apple/libc.git] / stdio / FreeBSD / fclose.c
index 5a6183cae63bb731a05a7082c4c7eb8e6f8a042f..25a6cbbf4f561a8cd47b93d3c74587ca7e5dc70b 100644 (file)
@@ -48,6 +48,7 @@ int
 fclose(FILE *fp)
 {
        int r;
+       int error = 0;
 
        pthread_once(&__sdidinit, __sinit);
 
@@ -61,8 +62,13 @@ fclose(FILE *fp)
        }
        FLOCKFILE(fp);
        r = __sflush(fp);
-       if (fp->_close != NULL && (*fp->_close)(fp->_cookie) < 0)
+       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))
@@ -73,5 +79,9 @@ fclose(FILE *fp)
        fp->_r = fp->_w = 0;    /* Mess up if reaccessed. */
        FUNLOCKFILE(fp);
        __sfprelease(fp);       /* Release this FILE for reuse. */
+       /* Don't clobber errno unnecessarily. */
+       if (error) {
+               errno = error;
+       }
        return (r);
 }