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 /src | |
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.
Diffstat (limited to 'src')
-rw-r--r-- | src/md5sum.c | 83 |
1 files changed, 49 insertions, 34 deletions
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) { |