Update.
[kopensolaris-gnu/glibc.git] / io / fts.c
index 4c57084..0172af7 100644 (file)
--- a/io/fts.c
+++ b/io/fts.c
  * 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.
@@ -231,6 +227,7 @@ fts_close(sp)
 {
        register FTSENT *freep, *p;
        int saved_errno;
+       int retval = 0;
 
        /*
         * This still works if we haven't read anything -- the dummy structure
@@ -259,15 +256,16 @@ fts_close(sp)
                (void)__close(sp->fts_rfd);
        }
 
-       /* Free up the stream pointer. */
-       free(sp);
-
        /* Set errno and return. */
        if (!ISSET(FTS_NOCHDIR) && saved_errno) {
                __set_errno (saved_errno);
-               return (-1);
+               retval = -1;
        }
-       return (0);
+
+       /* Free up the stream pointer. */
+       free (sp);
+
+       return retval;
 }
 
 /*
@@ -313,12 +311,13 @@ fts_read(sp)
        if (instr == FTS_FOLLOW &&
            (p->fts_info == FTS_SL || p->fts_info == FTS_SLNONE)) {
                p->fts_info = fts_stat(sp, NULL, p, 1);
-               if (p->fts_info == FTS_D && !ISSET(FTS_NOCHDIR))
+               if (p->fts_info == FTS_D && !ISSET(FTS_NOCHDIR)) {
                        if ((p->fts_symfd = __open(".", O_RDONLY, 0)) < 0) {
                                p->fts_errno = errno;
                                p->fts_info = FTS_ERR;
                        } else
                                p->fts_flags |= FTS_SYMFOLLOW;
+               }
                return (p);
        }
 
@@ -401,13 +400,14 @@ next:     tmp = p;
                        goto next;
                if (p->fts_instr == FTS_FOLLOW) {
                        p->fts_info = fts_stat(sp, NULL, p, 1);
-                       if (p->fts_info == FTS_D && !ISSET(FTS_NOCHDIR))
+                       if (p->fts_info == FTS_D && !ISSET(FTS_NOCHDIR)) {
                                if ((p->fts_symfd =
                                    __open(".", O_RDONLY, 0)) < 0) {
                                        p->fts_errno = errno;
                                        p->fts_info = FTS_ERR;
                                } else
                                        p->fts_flags |= FTS_SYMFOLLOW;
+                       }
                        p->fts_instr = FTS_NOINSTR;
                }
 
@@ -641,7 +641,7 @@ fts_build(sp, type)
         * checking FTS_NS on the returned nodes.
         */
        cderrno = 0;
-       if (nlinks || type == BREAD)
+       if (nlinks || type == BREAD) {
                if (FCHDIR(sp, dirfd(dirp))) {
                        if (nlinks && type == BREAD)
                                cur->fts_errno = errno;
@@ -650,7 +650,7 @@ fts_build(sp, type)
                        cderrno = errno;
                } else
                        descend = 1;
-       else
+       else
                descend = 0;
 
        /*
@@ -816,7 +816,7 @@ fts_stat(sp, dp, p, follow)
        /* If user needs stat info, stat buffer already allocated. */
        sbp = ISSET(FTS_NOSTAT) ? &sb : p->fts_statp;
 
-#ifdef DT_WHT
+#if defined DT_WHT && defined S_IFWHT
        /*
         * Whited-out files don't really exist.  However, there's stat(2) file
         * mask for them, so we set it so that programs (i.e., find) don't have