summaryrefslogtreecommitdiff
path: root/src/md5sum.c
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 /src/md5sum.c
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.
Diffstat (limited to 'src/md5sum.c')
-rw-r--r--src/md5sum.c83
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)
{