From: Pádraig Brady Date: Sat, 8 Jul 2023 14:14:12 +0000 (+0100) Subject: cksum: support transparent emulation of older utils X-Git-Tag: v9.4~82 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5e1e0993b50f9828332870829463e975df6abeab;p=thirdparty%2Fcoreutils.git 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. --- diff --git a/NEWS b/NEWS index 3c134db52b..a3ce05e632 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' 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 diff --git a/src/digest.c b/src/digest.c index bc8967e567..4c9c477dd4 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 712c7ff16f..ec93fdd25a 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 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 diff --git a/tests/cksum/cksum-base64.pl b/tests/cksum/cksum-base64.pl index 4fec7a5d71..0c4dd1e229 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;