]> 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 e38bbbf696da9970a20b7f206ba9e2642b9d0176..25a6cbbf4f561a8cd47b93d3c74587ca7e5dc70b 100644 (file)
@@ -48,6 +48,7 @@ int
 fclose(FILE *fp)
 {
        int r;
 fclose(FILE *fp)
 {
        int r;
+       int error = 0;
 
        pthread_once(&__sdidinit, __sinit);
 
 
        pthread_once(&__sdidinit, __sinit);
 
@@ -60,9 +61,14 @@ fclose(FILE *fp)
                return (EOF);
        }
        FLOCKFILE(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;
                r = EOF;
+               error = errno;
+       }
        if (fp->_flags & __SMBF)
                free((char *)fp->_bf._base);
        if (HASUB(fp))
        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. */
        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);
 }
        return (r);
 }