summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPádraig Brady <P@draigBrady.com>2015-11-01 18:48:22 +0000
committerPádraig Brady <P@draigBrady.com>2015-11-04 02:03:43 +0000
commit646902b30dee04b9454fdcaa8a30fd89fc0514ca (patch)
tree50241e5b349a1de2a7094d8ffcd900de0458c655
parentab40a941a07d80326aaa051e3c94c88b800cbd7d (diff)
downloadcoreutils-646902b30dee04b9454fdcaa8a30fd89fc0514ca.tar.xz
md5sum: ensure a single status line per file
* src/md5sum.c: Use the same file name escaping method used when generating and checking checksums. I.E. ensure a single line per file by starting the line with '\' for any file name containing '\n' and replacing those with "\\n". * NEWS: Move the item from changes in behavior to improvements, since this is no longer a backwards incompat change when processing stdout status messages. * tests/misc/md5sum.pl: Remove quotes from expected status output. * tests/misc/sha1sum.pl: Likewise.
-rw-r--r--NEWS7
-rw-r--r--src/md5sum.c83
-rwxr-xr-xtests/misc/md5sum.pl16
-rwxr-xr-xtests/misc/sha1sum.pl4
4 files changed, 63 insertions, 47 deletions
diff --git a/NEWS b/NEWS
index 349577f30..30603e62e 100644
--- a/NEWS
+++ b/NEWS
@@ -26,14 +26,15 @@ GNU coreutils NEWS -*- outline -*-
df now prefers sources towards the root of a device when
eliding duplicate bind mounted entries.
- md5sum now quotes all printed file names to avoid confusing error messages.
- This also affects sha1sum, sha224sum, sha256sum, sha384sum and sha512sum.
-
** Improvements
All utilities now quote user supplied arguments in error strings,
which avoids confusing error messages in the presence of '\r' chars etc.
+ md5sum now ensures a single line per file for status on standard output,
+ by using a '\' at the start of the line, and replacing any newlines with '\n'.
+ This also affects sha1sum, sha224sum, sha256sum, sha384sum and sha512sum.
+
dircolors now supports globbing of TERM entries in its database.
For example "TERM *256color*" is now supported.
diff --git a/src/md5sum.c b/src/md5sum.c
index 564b75392..16163cc9e 100644
--- a/src/md5sum.c
+++ b/src/md5sum.c
@@ -417,6 +417,37 @@ hex_digits (unsigned char const *s)
return *s == '\0';
}
+/* If ESCAPE is true, then translate each NEWLINE byte to the string, "\\n",
+ and each backslash to "\\\\". */
+static void
+print_filename (char const *file, bool escape)
+{
+ if (! escape)
+ {
+ fputs (file, stdout);
+ return;
+ }
+
+ while (*file)
+ {
+ switch (*file)
+ {
+ case '\n':
+ fputs ("\\n", stdout);
+ break;
+
+ case '\\':
+ fputs ("\\\\", stdout);
+ break;
+
+ default:
+ putchar (*file);
+ break;
+ }
+ file++;
+ }
+}
+
/* An interface to the function, DIGEST_STREAM.
Operate on FILENAME (it may be "-").
@@ -561,6 +592,9 @@ digest_check (const char *checkfile_name)
'8', '9', 'a', 'b',
'c', 'd', 'e', 'f' };
bool ok;
+ /* Only escape in the edge case producing multiple lines,
+ to ease automatic processing of status output. */
+ bool needs_escape = ! status_only && strchr (filename, '\n');
++n_properly_formatted_lines;
@@ -570,7 +604,12 @@ digest_check (const char *checkfile_name)
{
++n_open_or_read_failures;
if (!status_only)
- printf (_("%s: FAILED open or read\n"), quote (filename));
+ {
+ if (needs_escape)
+ putchar ('\\');
+ print_filename (filename, needs_escape);
+ printf (": %s\n", _("FAILED open or read"));
+ }
}
else
{
@@ -591,10 +630,17 @@ digest_check (const char *checkfile_name)
if (!status_only)
{
+ if (cnt != digest_bin_bytes || ! quiet)
+ {
+ if (needs_escape)
+ putchar ('\\');
+ print_filename (filename, needs_escape);
+ }
+
if (cnt != digest_bin_bytes)
- printf ("%s: %s\n", quote (filename), _("FAILED"));
+ printf (": %s\n", _("FAILED"));
else if (!quiet)
- printf ("%s: %s\n", quote (filename), _("OK"));
+ printf (": %s\n", _("OK"));
}
}
}
@@ -657,37 +703,6 @@ digest_check (const char *checkfile_name)
&& (!strict || n_improperly_formatted_lines == 0));
}
-/* If ESCAPE is true, then translate each NEWLINE byte to the string, "\\n",
- and each backslash to "\\\\". */
-static void
-print_filename (char const *file, bool escape)
-{
- if (! escape)
- {
- fputs (file, stdout);
- return;
- }
-
- while (*file)
- {
- switch (*file)
- {
- case '\n':
- fputs ("\\n", stdout);
- break;
-
- case '\\':
- fputs ("\\\\", stdout);
- break;
-
- default:
- putchar (*file);
- break;
- }
- file++;
- }
-}
-
int
main (int argc, char **argv)
{
diff --git a/tests/misc/md5sum.pl b/tests/misc/md5sum.pl
index d29a4efa7..c99658213 100755
--- a/tests/misc/md5sum.pl
+++ b/tests/misc/md5sum.pl
@@ -44,12 +44,12 @@ my @Tests =
{OUT=>"\\$degenerate .\\\\foo\n"}],
['check-1', '--check', {AUX=> {f=> ''}},
{IN=> {'f.md5' => "$degenerate f\n"}},
- {OUT=>"'f': OK\n"}],
+ {OUT=>"f: OK\n"}],
# Same as above, but with an added empty line, to provoke --strict.
['ck-strict-1', '--check --strict', {AUX=> {f=> ''}},
{IN=> {'f.md5' => "$degenerate f\n\n"}},
- {OUT=>"'f': OK\n"},
+ {OUT=>"f: OK\n"},
{ERR=>"md5sum: "
. "WARNING: 1 line is improperly formatted\n"},
{EXIT=> 1}],
@@ -58,7 +58,7 @@ my @Tests =
# lines are processed in spite of the preceding invalid input line.
['ck-strict-2', '--check --strict', {AUX=> {f=> ''}},
{IN=> {'in.md5' => "\n$degenerate f\n"}},
- {OUT=>"'f': OK\n"},
+ {OUT=>"f: OK\n"},
{ERR=>"md5sum: "
. "WARNING: 1 line is improperly formatted\n"},
{EXIT=> 1}],
@@ -69,7 +69,7 @@ my @Tests =
{OUT=>""}],
['check-quiet2', '--check', '--quiet',
{IN=>{'f.md5' => "$degenerate f\n"}},
- {AUX=> {f=> 'foo'}}, {OUT=>"'f': FAILED\n"},
+ {AUX=> {f=> 'foo'}}, {OUT=>"f: FAILED\n"},
{ERR=>"md5sum: WARNING: 1 computed"
. " checksum did NOT match\n"},
{EXIT=> 1}],
@@ -80,7 +80,7 @@ my @Tests =
. "$degenerate f\n"
. "invalid\n" }},
{AUX=> {f=> 'foo'}},
- {OUT=>"'f': FAILED\n'f': FAILED\n"},
+ {OUT=>"f: FAILED\nf: FAILED\n"},
{ERR=>"md5sum: WARNING: 1 line is improperly formatted\n"
. "md5sum: WARNING: 2 computed checksums did NOT match\n"},
{EXIT=> 1}],
@@ -91,7 +91,7 @@ my @Tests =
. "$degenerate f\n"
. "invalid\n" }},
{AUX=> {f=> 'foo'}},
- {OUT=>"'f': FAILED\n'f': FAILED\n"},
+ {OUT=>"f: FAILED\nf: FAILED\n"},
{ERR=>"md5sum: 'f.md5': 3: "
. "improperly formatted MD5 checksum line\n"
. "md5sum: WARNING: 1 line is improperly formatted\n"
@@ -106,7 +106,7 @@ my @Tests =
. "MD5 checksum lines found\n"},
{EXIT=> 1}],
['check-bsd2', '--check', {IN=> {'f.md5' => "MD5 (f) = $degenerate\n"}},
- {AUX=> {f=> ''}}, {OUT=>"'f': OK\n"}],
+ {AUX=> {f=> ''}}, {OUT=>"f: OK\n"}],
['check-bsd3', '--check', '--status',
{IN=> {'f.md5' => "MD5 (f) = $degenerate\n"}},
{AUX=> {f=> 'bar'}}, {EXIT=> 1}],
@@ -116,7 +116,7 @@ my @Tests =
. "MD5 checksum lines found\n"},
{EXIT=> 1}],
['check-openssl2', '--check', {IN=> {'f.md5' => "MD5(f)= $degenerate\n"}},
- {AUX=> {f=> ''}}, {OUT=>"'f': OK\n"}],
+ {AUX=> {f=> ''}}, {OUT=>"f: OK\n"}],
['check-openssl3', '--check', '--status',
{IN=> {'f.md5' => "MD5(f)= $degenerate\n"}},
{AUX=> {f=> 'bar'}}, {EXIT=> 1}],
diff --git a/tests/misc/sha1sum.pl b/tests/misc/sha1sum.pl
index 0c22e7a18..b58a7f4a1 100755
--- a/tests/misc/sha1sum.pl
+++ b/tests/misc/sha1sum.pl
@@ -58,7 +58,7 @@ my @Tests =
{EXIT=> 1}],
['check-bsd2', '--check',
{IN=> {'f.sha1' => "SHA1 (f) = $sha_degenerate\n"}},
- {AUX=> {f=> ''}}, {OUT=>"'f': OK\n"}],
+ {AUX=> {f=> ''}}, {OUT=>"f: OK\n"}],
['check-bsd3', '--check', '--status',
{IN=> {'f.sha1' => "SHA1 (f) = $sha_degenerate\n"}},
{AUX=> {f=> 'bar'}}, {EXIT=> 1}],
@@ -70,7 +70,7 @@ my @Tests =
{EXIT=> 1}],
['check-openssl2', '--check',
{IN=> {'f.sha1' => "SHA1(f)= $sha_degenerate\n"}},
- {AUX=> {f=> ''}}, {OUT=>"'f': OK\n"}],
+ {AUX=> {f=> ''}}, {OUT=>"f: OK\n"}],
['check-openssl3', '--check', '--status',
{IN=> {'f.sha1' => "SHA1(f)= $sha_degenerate\n"}},
{AUX=> {f=> 'bar'}}, {EXIT=> 1}],