]> git.saurik.com Git - apple/libc.git/blobdiff - gen/readdir-fbsd.c
Libc-763.11.tar.gz
[apple/libc.git] / gen / readdir-fbsd.c
index 6cf30d67885907b668c435c99740ea11a266ed50..3875cefa2a987e0bd99c914b03cd03a723990190 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.
@@ -35,7 +31,7 @@
 static char sccsid[] = "@(#)readdir.c  8.3 (Berkeley) 9/29/94";
 #endif /* LIBC_SCCS and not lint */
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/lib/libc/gen/readdir.c,v 1.11 2002/02/26 21:39:32 alfred Exp $");
+__FBSDID("$FreeBSD: src/lib/libc/gen/readdir.c,v 1.15 2008/05/05 14:05:23 kib Exp $");
 
 #include "namespace.h"
 #include <sys/param.h>
@@ -46,15 +42,16 @@ __FBSDID("$FreeBSD: src/lib/libc/gen/readdir.c,v 1.11 2002/02/26 21:39:32 alfred
 #include <unistd.h>
 #include "un-namespace.h"
 
-#include "telldir.h"
 #include "libc_private.h"
+#include "telldir.h"
 
 /*
  * get next entry in a directory.
  */
 struct dirent *
-_readdir_unlocked(dirp)
+_readdir_unlocked(dirp, skip)
        DIR *dirp;
+       int skip;
 {
        struct dirent *dp;
 
@@ -82,7 +79,7 @@ _readdir_unlocked(dirp)
                    dp->d_reclen > dirp->dd_len + 1 - dirp->dd_loc)
                        return (NULL);
                dirp->dd_loc += dp->d_reclen;
-               if (dp->d_ino == 0)
+               if (dp->d_ino == 0 && skip)
                        continue;
                if (dp->d_type == DT_WHT && (dirp->dd_flags & DTF_HIDEW))
                        continue;
@@ -97,12 +94,12 @@ readdir(dirp)
        struct dirent   *dp;
 
        if (__isthreaded) {
-               _pthread_mutex_lock((pthread_mutex_t *)&dirp->dd_lock);
-               dp = _readdir_unlocked(dirp);
-               _pthread_mutex_unlock((pthread_mutex_t *)&dirp->dd_lock);
+               _pthread_mutex_lock(&dirp->dd_lock);
+               dp = _readdir_unlocked(dirp, 1);
+               _pthread_mutex_unlock(&dirp->dd_lock);
        }
        else
-               dp = _readdir_unlocked(dirp);
+               dp = _readdir_unlocked(dirp, 1);
        return (dp);
 }
 
@@ -118,12 +115,12 @@ readdir_r(dirp, entry, result)
        saved_errno = errno;
        errno = 0;
        if (__isthreaded) {
-               _pthread_mutex_lock((pthread_mutex_t *)&dirp->dd_lock);
-               if ((dp = _readdir_unlocked(dirp)) != NULL)
+               _pthread_mutex_lock(&dirp->dd_lock);
+               if ((dp = _readdir_unlocked(dirp, 1)) != NULL)
                        memcpy(entry, dp, _GENERIC_DIRSIZ(dp));
-               _pthread_mutex_unlock((pthread_mutex_t *)&dirp->dd_lock);
+               _pthread_mutex_unlock(&dirp->dd_lock);
        }
-       else if ((dp = _readdir_unlocked(dirp)) != NULL)
+       else if ((dp = _readdir_unlocked(dirp, 1)) != NULL)
                memcpy(entry, dp, _GENERIC_DIRSIZ(dp));
 
        if (errno != 0) {