summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--NEWS3
-rw-r--r--src/du.c7
-rwxr-xr-xtests/du/inacc-dir11
4 files changed, 22 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 416864316..4d19371b1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,12 @@
2007-07-31 Jim Meyering <jim@meyering.net>
+ du: print size (probably incomplete) of each inaccessible directory
+ * src/du.c (process_file): Print what we know of the size of a
+ directory even when it is inaccessible. What we print is just the
+ size of the directory itself, not counting any of its contents.
+ * tests/du/inacc-dir: Test for this.
+ * NEWS: Mention this change.
+
Add a test for du not counting size of inaccessible directories.
* tests/du/inacc-dir: New file. Test for fts.c bug fixed yesterday.
* tests/du/Makefile.am (TESTS): Add inacc-dir.
diff --git a/NEWS b/NEWS
index 5c06c25cf..83d06b753 100644
--- a/NEWS
+++ b/NEWS
@@ -83,6 +83,9 @@ GNU coreutils NEWS -*- outline -*-
du -s now includes the size of any stat'able-but-inaccessible directory
in the total size.
+ du (without -s) prints whatever it knows of the size of an inaccessible
+ directory. Before, du would print nothing for such a directory.
+
ls -x DIR would sometimes output the wrong string in place of the
first entry. [introduced in coreutils-6.8]
diff --git a/src/du.c b/src/du.c
index 57678d93e..f9bd2e364 100644
--- a/src/du.c
+++ b/src/du.c
@@ -596,14 +596,9 @@ process_file (FTS *fts, FTSENT *ent)
duinfo_add (&dulvl[level].ent, &dui);
/* Even if this directory is unreadable or we can't chdir into it,
- do let its size contribute to the total, ... */
+ do let its size contribute to the total. */
duinfo_add (&tot_dui, &dui);
- /* ... but don't print out a total for it, since without the size(s)
- of any potential entries, it could be very misleading. */
- if (ent->fts_info == FTS_DNR)
- return ok;
-
/* If we're not counting an entry, e.g., because it's a hard link
to a file we've already counted (and --count-links), then don't
print a line for it. */
diff --git a/tests/du/inacc-dir b/tests/du/inacc-dir
index 3bfbdefe9..add929347 100755
--- a/tests/du/inacc-dir
+++ b/tests/du/inacc-dir
@@ -45,4 +45,15 @@ du -s a > out 2> /dev/null && fail=1
cmp out exp || fail=1
test $fail = 1 && diff out exp 2> /dev/null
+# Same as above, but don't use -s, so we print
+# an entry for the unreadable "sub", too.
+chmod 700 a/sub || fail=1
+du -k a > exp || fail=1
+chmod 0 a/sub || fail=1
+# Expect failure, ignore diagnostics.
+du -k a > out 2> /dev/null && fail=1
+
+cmp out exp || fail=1
+test $fail = 1 && diff out exp 2> /dev/null
+
(exit $fail); exit $fail