>From 156d7e829da3ab9d895a275c2cd02e52388bcd0d Mon Sep 17 00:00:00 2001 From: Patrick Schoenfeld <[EMAIL PROTECTED]> Date: Mon, 17 Nov 2008 20:54:08 +0100 Subject: [PATCH] md5sum: Implemented --pedantic option to be more strict in verification mode
* md5sum: Implemented a --pedantic option in --check mode, which lets md5sum bail out with a non-zero exit code, if one or more improperly formatted line is found. Feature request by Dan Jacobson. (http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=353911) Signed-off-by: Patrick Schoenfeld <[EMAIL PROTECTED]> --- The following patch misses tests. I would like to kindly ask if someone else could add these. However I verified that these works: Create testdata: mkdir -p testdata for i in $(seq 1 3); do echo $i > testdata/$i; done md5sum testdata/*|sed '1s/^./Z/'|md5sum -c --pedantic -w Expected Result: Warning about line 1, exit 1 md5sum testdata/*|sed '2s/^./Z/'|md5sum -c --pedantic -w Expected Result: Warning about line 2, exit 1 md5sum testdata/*|sed 's/^./Z/'|md5sum -c --pedantic -w Expected Result: Warn about all lines, moan that no properly formatted line was found and exit 1. md5sum testdata/*|md5sum -c --pedantic -w Expected Result: All lines OK. Please note that I'm still in process of copyright assignment. Send a mail to [EMAIL PROTECTED] but got no reply yet. NEWS | 4 ++++ doc/coreutils.texi | 6 ++++++ src/md5sum.c | 34 ++++++++++++++++++++++++++++++++-- 3 files changed, 42 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index cbea67c..b0e2345 100644 --- a/NEWS +++ b/NEWS @@ -8,6 +8,10 @@ GNU coreutils NEWS -*- outline -*- stat -f recognizes the Lustre file system type + md5sum now recognizes a new option --pedantic when verifying md5sums in a file + (with --check) to let it return a non-zero exit code if one or more invalid + lines are found + ** Bug fixes seq 9223372036854775807 9223372036854775808 now prints only two numbers diff --git a/doc/coreutils.texi b/doc/coreutils.texi index 935129f..b9b629d 100644 --- a/doc/coreutils.texi +++ b/doc/coreutils.texi @@ -3484,6 +3484,12 @@ When verifying checksums, warn about improperly formatted MD5 checksum lines. This option is useful only if all but a few lines in the checked input are valid. [EMAIL PROTECTED] --pedantic [EMAIL PROTECTED] --pedantic [EMAIL PROTECTED] verifying MD5 checksums +When verifying checksums, fail if one or more improperly formatted MD5 checksum +line is found. + @end table @exitstatus diff --git a/src/md5sum.c b/src/md5sum.c index 969cc71..89ffd49 100644 --- a/src/md5sum.c +++ b/src/md5sum.c @@ -121,12 +121,17 @@ static bool warn = false; /* With --check, suppress the "OK" printed for each verified file. */ static bool quiet = false; +/* With --check, exit with a non-zero return code, if any line is + improperly formatted. */ +static bool pedantic = false; + /* For long options that have no equivalent short option, use a non-character as a pseudo short option, starting with CHAR_MAX + 1. */ enum { STATUS_OPTION = CHAR_MAX + 1, - QUIET_OPTION + QUIET_OPTION, + PEDANTIC_OPTION }; static struct option const long_options[] = @@ -137,6 +142,7 @@ static struct option const long_options[] = { "status", no_argument, NULL, STATUS_OPTION }, { "text", no_argument, NULL, 't' }, { "warn", no_argument, NULL, 'w' }, + { "pedantic", no_argument, NULL, PEDANTIC_OPTION }, { GETOPT_HELP_OPTION_DECL }, { GETOPT_VERSION_OPTION_DECL }, { NULL, 0, NULL, 0 } @@ -184,6 +190,8 @@ The following three options are useful only when verifying checksums:\n\ --quiet don't print OK for each successfully verified file\n\ --status don't output anything, status code shows success\n\ -w, --warn warn about improperly formatted checksum lines\n\ + --pedantic return a non-zero exit code if one or more improperly\n\ + formatted checksume line is found\n\ \n\ "), stdout); fputs (HELP_OPTION_DESCRIPTION, stdout); @@ -428,6 +436,7 @@ digest_check (const char *checkfile_name) { FILE *checkfile_stream; uintmax_t n_properly_formatted_lines = 0; + uintmax_t n_improperly_formatted_lines = 0; uintmax_t n_mismatched_checksums = 0; uintmax_t n_open_or_read_failures = 0; unsigned char bin_buffer_unaligned[DIGEST_BIN_BYTES + DIGEST_ALIGN]; @@ -493,6 +502,8 @@ digest_check (const char *checkfile_name) checkfile_name, line_number, DIGEST_TYPE_STRING); } + + ++n_improperly_formatted_lines; } else { @@ -591,8 +602,17 @@ digest_check (const char *checkfile_name) n_mismatched_checksums, n_computed_checksums); } } - } + if (n_improperly_formatted_lines != 0) + { + if (pedantic) + { + /* Bail out if more then one improperly formatted line is found + and pedantic option is set */ + exit(1); + } + } + } return (n_properly_formatted_lines != 0 && n_mismatched_checksums == 0 && n_open_or_read_failures == 0); @@ -645,6 +665,9 @@ main (int argc, char **argv) warn = false; quiet = true; break; + case PEDANTIC_OPTION: + pedantic = true; + break; case_GETOPT_HELP_CHAR; case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS); default: @@ -682,6 +705,13 @@ main (int argc, char **argv) usage (EXIT_FAILURE); } + if (pedantic & !do_check) + { + error (0, 0, + _("the --pedantic option is meaningful only when verifying checksums")); + usage (EXIT_FAILURE); + } + if (!O_BINARY && binary < 0) binary = 0; -- 1.5.6.5 _______________________________________________ Bug-coreutils mailing list [email protected] http://lists.gnu.org/mailman/listinfo/bug-coreutils
