]> git.ipfire.org Git - thirdparty/coreutils.git/commitdiff
cksum: support transparent emulation of older utils
authorPádraig Brady <P@draigBrady.com>
Sat, 8 Jul 2023 14:14:12 +0000 (15:14 +0100)
committerPádraig Brady <P@draigBrady.com>
Sun, 9 Jul 2023 13:33:14 +0000 (14:33 +0100)
Support -b, --binary, and -t, --text
to allow full emulation of older utilities with:
  exec cksum -a $algo --untagged "$@"
Note this would diverge from OpenBSD's support of cksum -b.

* src/digest.c: Change -b to mean --binary, not --base64 in all cases.
Accept -b and -t in all cases.  Keep --binary and --text undocumented
for cksum.
* tests/cksum/cksum-base64.pl: s/-b/--base64/.
* tests/cksum/cksum-a.sh: Ensure cksum supports -b and -t appropriately.
* NEWS: Mention the change in behavior.

NEWS
src/digest.c
tests/cksum/cksum-a.sh
tests/cksum/cksum-base64.pl

diff --git a/NEWS b/NEWS
index 3c134db52b329cfdf8f7f990397c9a8631b9b048..a3ce05e6328beba393a5af4bfa88599a754b0e99 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -47,6 +47,10 @@ GNU coreutils NEWS                                    -*- outline -*-
   due to -i, or -u.  Instead they only output this information with --debug.
   I.e., 'cp -u -v' etc. will have the same verbosity as before coreutils-9.3.
 
+  'cksum -b' no longer prints base64-encoded checksums.  Rather that
+  short option is reserved to better support emulation of the standalone
+  checksum utilities with cksum.
+
 ** Improvements
 
   cp, mv, and install now avoid copy_file_range on linux kernels before 5.3
index bc8967e5671261e28e6662501b0f3f2b2f073689..4c9c477dd4d3c4e773a42f042c682f869871c739 100644 (file)
@@ -367,6 +367,7 @@ enum
   UNTAG_OPTION,
   DEBUG_PROGRAM_OPTION,
   RAW_OPTION,
+  BASE64_OPTION,
 };
 
 static struct option const long_options[] =
@@ -387,14 +388,13 @@ static struct option const long_options[] =
 
 # if HASH_ALGO_CKSUM
   { "algorithm", required_argument, nullptr, 'a'},
-  { "base64", no_argument, nullptr, 'b' },
+  { "base64", no_argument, nullptr, BASE64_OPTION },
   { "debug", no_argument, nullptr, DEBUG_PROGRAM_OPTION},
   { "raw", no_argument, nullptr, RAW_OPTION},
   { "untagged", no_argument, nullptr, UNTAG_OPTION },
-# else
+# endif
   { "binary", no_argument, nullptr, 'b' },
   { "text", no_argument, nullptr, 't' },
-# endif
 
 #else
   {"sysv", no_argument, nullptr, 's'},
@@ -445,7 +445,7 @@ Print or check %s (%d-bit) checksums.\n\
 \n\
 "), stdout);
         fputs (_("\
-  -b, --base64          emit base64-encoded digests, not hexadecimal\
+      --base64          emit base64-encoded digests, not hexadecimal\
 \n\
 "), stdout);
 #endif
@@ -1074,14 +1074,7 @@ output_file (char const *file, int binary_file, void const *digest,
   if (!tagged)
     {
       putchar (' ');
-
-# if HASH_ALGO_CKSUM
-      /* Simplify output as always in binary mode.  */
-      putchar (' ');
-# else
       putchar (binary_file ? '*' : ' ');
-# endif
-
       print_filename (file, needs_escape);
     }
 
@@ -1344,11 +1337,10 @@ main (int argc, char **argv)
   bool do_check = false;
   int opt;
   bool ok = true;
+  int binary = -1;
 #if HASH_ALGO_CKSUM
-  int binary = 1;
   bool prefix_tag = true;
 #else
-  int binary = -1;
   bool prefix_tag = false;
 #endif
 
@@ -1413,14 +1405,12 @@ main (int argc, char **argv)
         warn = false;
         quiet = false;
         break;
-# if !HASH_ALGO_CKSUM
       case 'b':
         binary = 1;
         break;
       case 't':
         binary = 0;
         break;
-# endif
       case 'w':
         status_only = false;
         warn = true;
@@ -1438,7 +1428,7 @@ main (int argc, char **argv)
         strict = true;
         break;
 # if HASH_ALGO_CKSUM
-      case 'b':
+      case BASE64_OPTION:
         base64_digest = true;
         break;
       case RAW_OPTION:
@@ -1527,7 +1517,11 @@ main (int argc, char **argv)
         However that's invasive enough that it was agreed to
         not support this mode with --tag, as --text use cases
         are adequately supported by the default output format.  */
+#if !HASH_ALGO_CKSUM
      error (0, 0, _("--tag does not support --text mode"));
+#else
+     error (0, 0, _("--text mode is only supported with --untagged"));
+#endif
      usage (EXIT_FAILURE);
    }
 
@@ -1546,14 +1540,12 @@ main (int argc, char **argv)
     }
 #endif
 
-#if !HASH_ALGO_CKSUM
   if (0 <= binary && do_check)
     {
       error (0, 0, _("the --binary and --text options are meaningless when "
                      "verifying checksums"));
       usage (EXIT_FAILURE);
     }
-#endif
 
   if (ignore_missing && !do_check)
     {
index 712c7ff16f23a8d4192e1c79ffe9427ed16e61da..ec93fdd25ac5f94306d2a6e0ae28d5607c99efc3 100755 (executable)
@@ -23,27 +23,32 @@ cat > input_options <<\EOF || framework_failure_
 bsd     sum -r
 sysv    sum -s
 crc     cksum
-md5     md5sum -t
-sha1    sha1sum -t
-sha224  sha224sum -t
-sha256  sha256sum -t
-sha384  sha384sum -t
-sha512  sha512sum -t
-blake2b b2sum -t
+md5     md5sum MODE
+sha1    sha1sum MODE
+sha224  sha224sum MODE
+sha256  sha256sum MODE
+sha384  sha384sum MODE
+sha512  sha512sum MODE
+blake2b b2sum MODE
 EOF
 
-while read algo prog; do
-  $prog /dev/null >> out || continue
-  cksum --untagged --algorithm=$algo /dev/null > out-c || fail=1
+while read algo prog mode; do
+  for cmode in '-b' '-t'; do
+    pmode="$mode"
+    case $pmode in MODE) pmode=$cmode;; esac
 
-  case "$algo" in
-    bsd) ;;
-    sysv) ;;
-    crc) ;;
-    *) cksum --check --algorithm=$algo out-c || fail=1 ;;
-  esac
+    $prog $pmode /dev/null >> out || continue
+    cksum --untagged $cmode --algorithm=$algo /dev/null > out-c || fail=1
 
-  cat out-c >> out-a || framework_failure_
+    case "$algo" in
+      bsd) ;;
+      sysv) ;;
+      crc) ;;
+      *) cksum --check --algorithm=$algo out-c || fail=1 ;;
+    esac
+
+    cat out-c >> out-a || framework_failure_
+  done
 done < input_options
 compare out out-a || fail=1
 
index 4fec7a5d71297ad0e64a54963d419067b702b55a..0c4dd1e2295d90444f56479efd215e574b493fe8 100755 (executable)
@@ -51,9 +51,9 @@ sub fmt ($$) {
 
 my @Tests =
   (
-   # Ensure that each of the above works with -b:
+   # Ensure that each of the above works with --base64:
    (map {my ($h,$v)= @$_; my $o=fmt $h,$v;
-         [$h, "-ba $h", {IN=>{f=>''}}, {OUT=>"$o\n"}]} @pairs),
+         [$h, "--base64 -a $h", {IN=>{f=>''}}, {OUT=>"$o\n"}]} @pairs),
 
    # For each that accepts --check, ensure that works with base64 digests:
    (map {my ($h,$v)= @$_; my $o=fmt $h,$v;