diff options
author | Pádraig Brady <P@draigBrady.com> | 2015-11-01 18:48:22 +0000 |
---|---|---|
committer | Pádraig Brady <P@draigBrady.com> | 2015-11-04 02:03:43 +0000 |
commit | 646902b30dee04b9454fdcaa8a30fd89fc0514ca (patch) | |
tree | 50241e5b349a1de2a7094d8ffcd900de0458c655 | |
parent | ab40a941a07d80326aaa051e3c94c88b800cbd7d (diff) | |
download | coreutils-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-- | NEWS | 7 | ||||
-rw-r--r-- | src/md5sum.c | 83 | ||||
-rwxr-xr-x | tests/misc/md5sum.pl | 16 | ||||
-rwxr-xr-x | tests/misc/sha1sum.pl | 4 |
4 files changed, 63 insertions, 47 deletions
@@ -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}], |