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