bug-coreutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] md5sum: Implemented --pedantic option to be more strict in verif


From: schoenfeld / in-medias-res
Subject: [PATCH] md5sum: Implemented --pedantic option to be more strict in verification mode
Date: Mon, 17 Nov 2008 21:27:03 +0100
User-agent: Mutt/1.5.18 (2008-05-17)

>From 156d7e829da3ab9d895a275c2cd02e52388bcd0d Mon Sep 17 00:00:00 2001
From: Patrick Schoenfeld <address@hidden>
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 <address@hidden>
---

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 address@hidden 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.
 
address@hidden --pedantic
address@hidden --pedantic
address@hidden 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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]