changes for whiteouts and union filesystem
[unix-history] / usr / src / lib / libc / gen / readdir.c
index a3748b7..cab7e54 100644 (file)
@@ -6,7 +6,7 @@
  */
 
 #if defined(LIBC_SCCS) && !defined(lint)
  */
 
 #if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)readdir.c  8.1 (Berkeley) %G%";
+static char sccsid[] = "@(#)readdir.c  8.2 (Berkeley) %G%";
 #endif /* LIBC_SCCS and not lint */
 
 #include <sys/param.h>
 #endif /* LIBC_SCCS and not lint */
 
 #include <sys/param.h>
@@ -22,22 +22,23 @@ readdir(dirp)
        register struct dirent *dp;
 
        for (;;) {
        register struct dirent *dp;
 
        for (;;) {
-               if (dirp->dd_loc == 0) {
+               if (dirp->dd_loc >= dirp->dd_size) {
+                       if (dirp->dd_flags & __DTF_READALL)
+                               return (NULL);
+                       dirp->dd_loc = 0;
+               }
+               if (dirp->dd_loc == 0 && !(dirp->dd_flags & __DTF_READALL)) {
                        dirp->dd_size = getdirentries(dirp->dd_fd,
                            dirp->dd_buf, dirp->dd_len, &dirp->dd_seek);
                        if (dirp->dd_size <= 0)
                        dirp->dd_size = getdirentries(dirp->dd_fd,
                            dirp->dd_buf, dirp->dd_len, &dirp->dd_seek);
                        if (dirp->dd_size <= 0)
-                               return NULL;
-               }
-               if (dirp->dd_loc >= dirp->dd_size) {
-                       dirp->dd_loc = 0;
-                       continue;
+                               return (NULL);
                }
                dp = (struct dirent *)(dirp->dd_buf + dirp->dd_loc);
                if ((int)dp & 03)       /* bogus pointer check */
                }
                dp = (struct dirent *)(dirp->dd_buf + dirp->dd_loc);
                if ((int)dp & 03)       /* bogus pointer check */
-                       return NULL;
+                       return (NULL);
                if (dp->d_reclen <= 0 ||
                    dp->d_reclen > dirp->dd_len + 1 - dirp->dd_loc)
                if (dp->d_reclen <= 0 ||
                    dp->d_reclen > dirp->dd_len + 1 - dirp->dd_loc)
-                       return NULL;
+                       return (NULL);
                dirp->dd_loc += dp->d_reclen;
                if (dp->d_ino == 0)
                        continue;
                dirp->dd_loc += dp->d_reclen;
                if (dp->d_ino == 0)
                        continue;