md5: Improve compatibility with coreutils and format fix

The previous changes that added support for the coreutils -c option
modified the output generated by passing -r to match that of the
coreutils versions. The difference is that coreutils separates the
hash from the file name by two blanks "  " (or a blank followed by
an asterisk " *" with the -b option denoting).

While most scripts or users will not notice the difference, it might
be considered a violation of POLA and this commit reverts the change
for the non-sum programs. These will print a single blank " " as the
separator, as they die before the previous commit.

In order to still generate output that is identical to that of the
coreutils programs, this commit generates the "  " or " *" separator
used by them for the -sum versions, depending on the presence of the
-b option.

MFC after:	3 days
This commit is contained in:
Stefan Eßer 2021-06-29 09:01:13 +02:00
parent 26a357245f
commit b33d1898c1
2 changed files with 25 additions and 10 deletions

View File

@ -1,5 +1,5 @@
.\" $FreeBSD$
.Dd June 24, 2021
.Dd June 29, 2021
.Dt MD5 1
.Os
.Sh NAME
@ -77,9 +77,11 @@ The hexadecimal checksum of each file listed on the command line is printed
after the options are processed.
.Bl -tag -width indent
.It Fl b
Ignored for compatibility with the coreutils
Make the
.Nm -sum
programs.
programs separate hash and digest with a blank followed by an asterisk instead
of by 2 blank characters for full compatibility with the output generated by the
coreutils versions of these programs.
.It Fl c Ar string
If the program was called with a name that does not end in
.Nm sum ,
@ -88,13 +90,13 @@ compare the digest of the file against this string.
.It Fl c Ar file
If the program was called with a name that does end in
.Nm sum ,
the file passed as argument must contain digest lines generated by the same digest algorithm
with or without the
the file passed as argument must contain digest lines generated by the same
digest algorithm with or without the
.Fl r
option
.Pq i.e. in either classical BSD format or in GNU coreutils format .
A line with file name followed by
.Dq :
A line with the file name followed by a colon
.Dq ":"
and either OK or FAILED is written for each well-formed line in the digest file.
If applicable, the number of failed comparisons and the number of lines that were
skipped since they were not well-formed are printed at the end.
@ -157,8 +159,13 @@ $ echo -n Hello | md5
Calculate the checksum of multiple files reversing the output:
.Bd -literal -offset indent
$ md5 -r /boot/loader.conf /etc/rc.conf
ada5f60f23af88ff95b8091d6d67bef6 /boot/loader.conf
d80bf36c332dc0fdc479366ec3fa44cd /etc/rc.conf
ada5f60f23af88ff95b8091d6d67bef6 /boot/loader.conf
d80bf36c332dc0fdc479366ec3fa44cd /etc/rc.conf
.Pd
The
.Nm -sum
variants put 2 blank characters between hash and file name for full compatibilty
with the coreutils versions of these commands.
.Ed
.Pp
Write the digest for

View File

@ -54,6 +54,7 @@ __FBSDID("$FreeBSD$");
#define TEST_BLOCK_COUNT 100000
#define MDTESTCOUNT 8
static int bflag;
static int cflag;
static int pflag;
static int qflag;
@ -301,6 +302,7 @@ main(int argc, char *argv[])
while ((ch = getopt(argc, argv, "bc:pqrs:tx")) != -1)
switch (ch) {
case 'b':
bflag = 1;
break;
case 'c':
cflag = 1;
@ -436,7 +438,13 @@ MDOutput(const Algorithm_t *alg, char *p, char *argv[])
printf("%s\n", p);
} else {
if (rflag)
printf("%s %s", p, *argv);
if (gnu_emu)
if (bflag)
printf("%s *%s", p, *argv);
else
printf("%s %s", p, *argv);
else
printf("%s %s", p, *argv);
else
printf("%s (%s) = %s", alg->name, *argv, p);
if (checkAgainst) {