(process_file): Don't return early for excluded files
authorJim Meyering <jim@meyering.net>
Thu, 6 Feb 2003 08:14:01 +0000 (08:14 +0000)
committerJim Meyering <jim@meyering.net>
Thu, 6 Feb 2003 08:14:01 +0000 (08:14 +0000)
or for files whose dev/inode we've already seen.

src/du.c

index 9419e0faeeeb1ee323da85e6c387229216012eb7..fbc07b534741a5f4161820a6ab2b813c59f58e10 100644 (file)
--- a/src/du.c
+++ b/src/du.c
@@ -359,16 +359,28 @@ process_file (const char *file, const struct stat *sb, int file_type,
       break;
     }
 
-  if (!opt_count_all
-      && 1 < sb->st_nlink
-      && hash_ins (sb->st_ino, sb->st_dev))
-    return 0;                  /* Have counted this already.  */
+  /* If the file is being excluded or if it has already been counted
+     via a hard link, then don't let it contribute to the sums.  */
+  if ((info->skip = excluded_filename (exclude, file + info->base))
+      || (!opt_count_all
+         && 1 < sb->st_nlink
+         && hash_ins (sb->st_ino, sb->st_dev)))
+    {
+      /* Note that we must not simply return here.
+        We still have to update prev_level and maybe propagate
+        some sums up the hierarchy.  */
+      s = size = 0;
+    }
+  else
+    {
+      s = size = ST_NBLOCKS (*sb);
+    }
 
-  if (excluded_filename (exclude, file + info->base))
+  /* If this is the first (pre-order) encounter with a directory,
+     return right away.  */
+  if (file_type == FTW_DPRE)
     return 0;
 
-  s = size = ST_NBLOCKS (*sb);
-
   if (first_call)
     {
       n_alloc = info->level + 10;