{md5,shaN}sum: make -c EMPTY fail
authorDenys Vlasenko <vda.linux@googlemail.com>
Mon, 11 Jul 2016 17:51:08 +0000 (19:51 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Mon, 11 Jul 2016 17:51:08 +0000 (19:51 +0200)
function                                             old     new   delta
md5_sha1_sum_main                                    466     485     +19

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
coreutils/md5_sha1_sum.c
testsuite/md5sum.tests

index 1a5342e879a736539e43c0d328a24fca02117f00..c0e816ba66776f046376b9323e690c6487004625 100644 (file)
 //usage:     "\n       -w      Warn about improperly formatted checksum lines"
 //usage:       )
 
+//FIXME: GNU coreutils 8.25 has no -s option, it has only these two long opts:
+// --quiet   don't print OK for each successfully verified file
+// --status  don't output anything, status code shows success
+
 #include "libbb.h"
 
 /* This is a NOEXEC applet. Be very careful! */
@@ -174,6 +178,8 @@ int md5_sha1_sum_main(int argc UNUSED_PARAM, char **argv)
        unsigned flags;
 
        if (ENABLE_FEATURE_MD5_SHA1_SUM_CHECK) {
+               /* -s and -w require -c */
+               opt_complementary = "s?c:w?c";
                /* -b "binary", -t "text" are ignored (shaNNNsum compat) */
                flags = getopt32(argv, "scwbt");
                argv += optind;
@@ -185,15 +191,6 @@ int md5_sha1_sum_main(int argc UNUSED_PARAM, char **argv)
        if (!*argv)
                *--argv = (char*)"-";
 
-       if (ENABLE_FEATURE_MD5_SHA1_SUM_CHECK && !(flags & FLAG_CHECK)) {
-               if (flags & FLAG_SILENT) {
-                       bb_error_msg_and_die("-%c is meaningful only with -c", 's');
-               }
-               if (flags & FLAG_WARN) {
-                       bb_error_msg_and_die("-%c is meaningful only with -c", 'w');
-               }
-       }
-
        do {
                if (ENABLE_FEATURE_MD5_SHA1_SUM_CHECK && (flags & FLAG_CHECK)) {
                        FILE *pre_computed_stream;
@@ -244,6 +241,14 @@ int md5_sha1_sum_main(int argc UNUSED_PARAM, char **argv)
                                bb_error_msg("WARNING: %d of %d computed checksums did NOT match",
                                                count_failed, count_total);
                        }
+                       if (count_total == 0) {
+                               return_value = EXIT_FAILURE;
+                               /*
+                                * md5sum from GNU coreutils 8.25 says:
+                                * md5sum: <FILE>: no properly formatted MD5 checksum lines found
+                                */
+                               bb_error_msg("%s: no checksum lines found", *argv);
+                       }
                        fclose_if_not_stdin(pre_computed_stream);
                } else {
                        uint8_t *hash_value = hash_file(*argv);
index 6c75b6d1c1e1d5a5d1cf48a379cd8277dfe5d083..cca26dc64221b7e41123db9118ebccf629db25ae 100755 (executable)
@@ -23,6 +23,8 @@ test -f "$bindir/.config" && . "$bindir/.config"
 test x"$CONFIG_FEATURE_FANCY_HEAD" != x"y" \
 && { echo "SKIPPED: $sum"; exit 0; }
 
+FAILCOUNT=0
+
 text="The quick brown fox jumps over the lazy dog"
 text=`yes "$text" | head -c 9999`
 
@@ -33,11 +35,21 @@ while test $n -le 999; do
        n=$(($n+1))
 done | "$sum"
 )`
-
-if test x"$result" = x"$expected  -"; then
+if test x"$result" != x"$expected  -"; then
+       echo "FAIL: $sum (r:$result exp:$expected)"
+       : $((FAILCOUNT++))
+else
        echo "PASS: $sum"
-       exit 0
 fi
 
-echo "FAIL: $sum (r:$result exp:$expected)"
-exit 1
+# GNU compat: -c EMPTY must fail (exitcode 1)!
+>EMPTY
+if "$sum" -c EMPTY 2>/dev/null; then
+       echo "FAIL: $sum -c EMPTY"
+       : $((FAILCOUNT++))
+else
+       echo "PASS: $sum -c EMPTY"
+fi
+rm EMPTY
+
+exit $FAILCOUNT