diff --git a/ChangeLog b/ChangeLog index 5225e2981..3321ef093 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,21 @@ +2006-08-15 Paul Eggert + + * NEWS: Mention that df exits with nonzero status if it generates + no output. This change was in 6.0 but inadvertently unmentioned. + * src/df.c (file_systems_processed): Renamed from n_valid_args, and now + a boolean. + (show_dev): Don't set it until we actually output something. + Print the header if this is the first output. + (main): Don't print a header, as that is now show_dev's job. + * tests/misc/Makefile.am (TESTS): Add df. + * tests/misc/df: New file. + +2006-08-15 Eric Blake + + * src/stat.c (USE_STATVFS): Define to 0 if f_type is needed, but + statvfs.f_type not present. See + . + 2006-08-15 Paul Eggert * src/dd.c (print_stats): Don't substitute "1" for number, as this diff --git a/NEWS b/NEWS index fc9043157..766dfb978 100644 --- a/NEWS +++ b/NEWS @@ -59,10 +59,16 @@ GNU coreutils NEWS -*- outline -*- date: a command like date -d '2006-04-23 21 days ago' would print the wrong date in some time zones. (see the test for an example) - df now considers "none" and "proc" file systems to be dummies and - therefore does not normally display them. Also, inaccessible file - systems (which can be caused by shadowed mount points or by chrooted - bind mounts) are now dummies, too. + df changes: + + df now considers "none" and "proc" file systems to be dummies and + therefore does not normally display them. Also, inaccessible file + systems (which can be caused by shadowed mount points or by + chrooted bind mounts) are now dummies, too. + + df now fails if it generates no output, so you can inspect the + exit status of a command like "df -t ext3 -t reiserfs DIR" to test + whether DIR is on a file system of type "ext3" or "reiserfs". expr no longer complains about leading ^ in a regular expression (the anchor is ignored), or about regular expressions like A** (the diff --git a/doc/ChangeLog b/doc/ChangeLog index 6cdf3743f..85be546a2 100644 --- a/doc/ChangeLog +++ b/doc/ChangeLog @@ -1,3 +1,8 @@ +2006-08-15 Paul Eggert + + * coreutils.texi (df invocation): df exits nonzero if it outpus + nothing. + 2006-08-09 Paul Eggert * coreutils.texi (dd invocation): Warn about oflag=append without diff --git a/doc/coreutils.texi b/doc/coreutils.texi index bf4d32f37..12215c3c1 100644 --- a/doc/coreutils.texi +++ b/doc/coreutils.texi @@ -9426,6 +9426,10 @@ Ignored; for compatibility with System V versions of @command{df}. @end table @exitstatus +Failure includes the case where no output is generated, so you can +inspect the exit status of a command like @samp{df -t ext3 -t reiserfs +@var{dir}} to test whether @var{dir} is on a file system of type +@samp{ext3} or @samp{reiserfs}. @node du invocation diff --git a/src/df.c b/src/df.c index 45fcad854..7cbc5229a 100644 --- a/src/df.c +++ b/src/df.c @@ -68,8 +68,8 @@ static uintmax_t output_block_size; /* If true, use the POSIX output format. */ static bool posix_format; -/* Count the number of valid arguments. */ -static unsigned int n_valid_args; +/* True if a file system has been processed for output. */ +static bool file_systems_processed; /* If true, invoke the `sync' system call before getting any usage data. Using this option can make df very slow, especially with many or very @@ -295,8 +295,6 @@ show_dev (char const *disk, char const *mount_point, if (!selected_fstype (fstype) || excluded_fstype (fstype)) return; - ++n_valid_args; - /* If MOUNT_POINT is NULL, then the file system is not mounted, and this program reports on the file system that the special file is on. It would be better to report on the unmounted file system, @@ -314,6 +312,12 @@ show_dev (char const *disk, char const *mount_point, if (fsu.fsu_blocks == 0 && !show_all_fs && !show_listed_fs) return; + if (! file_systems_processed) + { + file_systems_processed = true; + print_header (); + } + if (! disk) disk = "-"; /* unknown */ if (! fstype) @@ -786,6 +790,7 @@ main (int argc, char **argv) &output_block_size); print_type = false; + file_systems_processed = false; posix_format = false; exit_status = EXIT_SUCCESS; @@ -928,20 +933,14 @@ main (int argc, char **argv) /* Display explicitly requested empty file systems. */ show_listed_fs = true; - if (n_valid_args > 0) - print_header (); - for (i = optind; i < argc; ++i) if (argv[i]) show_entry (argv[i], &stats[i - optind]); } else - { - print_header (); - show_all_entries (); - } + show_all_entries (); - if (n_valid_args == 0) + if (! file_systems_processed) error (EXIT_FAILURE, 0, _("no file systems processed")); exit (exit_status); diff --git a/tests/misc/Makefile.am b/tests/misc/Makefile.am index 60d5745da..5c01b43b4 100644 --- a/tests/misc/Makefile.am +++ b/tests/misc/Makefile.am @@ -27,6 +27,7 @@ TESTS = \ csplit \ date \ date-sec \ + df \ dirname \ expand \ false-status \ diff --git a/tests/misc/df b/tests/misc/df new file mode 100755 index 000000000..b1efe61ab --- /dev/null +++ b/tests/misc/df @@ -0,0 +1,17 @@ +#!/bin/sh +# Ensure that "df ." outputs a header. + +if test "$VERBOSE" = yes; then + set -x + df --version +fi + +case `df .` in +*' +'*) + fail=0;; +*) + fail=1;; +esac + +(exit $fail); exit $fail