On 08/07/2023 19:52, Jim Meyering wrote:
On Sat, Jul 8, 2023 at 7:28 AM Pádraig Brady <p...@draigbrady.com> wrote:
It would be nice to be able to support users who want to replace all
the *sum utilities with a script that did:

    exec cksum -a <algo> --untagged "$@"

To that end, it would be good to support all the options of the older utils.
This is a bit awkward with --base64 added in the last few months, as that
also added the short -b option.  However it's only a few months released,
so it's probably not too onerous to change.

The attached makes the change, which I'll augment with NEWS and tests/ upon 
agreement.

Good idea. I agree that the added value outweighs the cost of
divergence with OpenBSD cksum's -b (https://man.openbsd.org/cksum.1)

Oh right. Though all OpenBSD's cksum options are not supported
so we don't have to worry too much about direct compat here.

One nit: the in-comment reference to -b needs to say --base64, too (in
tests/cksum/cksum-base64.pl):

     # Ensure that each of the above works with -b:
     (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),

Latest patch attached.

thanks for the review.

Pádraig
From 4f9543c96b30378fd6fbb275ca1cf3e8401ed9be Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?P=C3=A1draig=20Brady?= <p...@draigbrady.com>
Date: Sat, 8 Jul 2023 15:14:12 +0100
Subject: [PATCH] cksum: support transparent emulation of older utils

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                        |  4 ++++
 src/digest.c                | 28 ++++++++++----------------
 tests/cksum/cksum-a.sh      | 39 +++++++++++++++++++++----------------
 tests/cksum/cksum-base64.pl |  4 ++--
 4 files changed, 38 insertions(+), 37 deletions(-)

diff --git a/NEWS b/NEWS
index 3c134db52..c0b18b667 100644
--- 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' will no longer print 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
diff --git a/src/digest.c b/src/digest.c
index bc8967e56..4c9c477dd 100644
--- a/src/digest.c
+++ b/src/digest.c
@@ -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)
     {
diff --git a/tests/cksum/cksum-a.sh b/tests/cksum/cksum-a.sh
index 712c7ff16..bbc9e220f 100755
--- a/tests/cksum/cksum-a.sh
+++ b/tests/cksum/cksum-a.sh
@@ -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 tmode in '-b' '-t'; do
+    pmode="$mode"
+    printf -- '%s' "$pmode" | grep '<mode>' > /dev/null && pmode="$tmode"
 
-  case "$algo" in
-    bsd) ;;
-    sysv) ;;
-    crc) ;;
-    *) cksum --check --algorithm=$algo out-c || fail=1 ;;
-  esac
+    $prog $pmode /dev/null >> out || continue
+    cksum --untagged $tmode --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
 
diff --git a/tests/cksum/cksum-base64.pl b/tests/cksum/cksum-base64.pl
index 4fec7a5d7..0c4dd1e22 100755
--- a/tests/cksum/cksum-base64.pl
+++ b/tests/cksum/cksum-base64.pl
@@ -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;
-- 
2.41.0

Reply via email to