From 4f9543c96b30378fd6fbb275ca1cf3e8401ed9be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A1draig=20Brady?= 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 +sha1 sha1sum +sha224 sha224sum +sha256 sha256sum +sha384 sha384sum +sha512 sha512sum +blake2b b2sum 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 '' > /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