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.
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 "-").
'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;
{
++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
{
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"));
}
}
}
&& (!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)
{
{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}],
# 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}],
{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}],
. "$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}],
. "$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"
. "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}],
. "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}],
{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}],
{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}],