Dear textutils maintainer(s),

It would be useful for md5sum to have options to include date and
permission information in the generated hash.

This would allow (for example) convenient detection of files that are
identical not just in content but in these other ways as well.

The diff below, against textutils 2.0, is one way to do it.

ttfn/rjk

diff -x stamp-vti -x textutils.info -x version.texi -x cat-id-tbl.c -x textutils.pot 
-ruN textutils-2.0.orig/doc/textutils.texi textutils-2.0/doc/textutils.texi
--- textutils-2.0.orig/doc/textutils.texi       Sat Jul 31 10:03:30 1999
+++ textutils-2.0/doc/textutils.texi    Thu Apr 26 10:39:17 2001
@@ -2046,8 +2046,25 @@
 This option is useful only if all but a few lines in the checked input
 are valid.
 
+@item -p
+@itemx --permissions
+@opindex -p
+@opindex --permissions
+Include ownership and permission information in the hash.
+
+@item -m
+@itemx --mtime
+@opindex -m
+@opindex --mtime
+Include the last modified date in the hash.
+
 @end table
 
+Note that hashes produced using different combinations of the
+@samp{--permissions} and/or @samp{--mtime} options are not comparable.
+Also hashes produced on different systems using either of these options
+may not be usefully comparable, due to differences in the way different
+systems represent the information.
 
 @node Operating on sorted files
 @chapter Operating on sorted files
diff -x stamp-vti -x textutils.info -x version.texi -x cat-id-tbl.c -x textutils.pot 
-ruN textutils-2.0.orig/lib/md5.c textutils-2.0/lib/md5.c
--- textutils-2.0.orig/lib/md5.c        Mon Jun 23 12:40:37 1997
+++ textutils-2.0/lib/md5.c     Thu Apr 26 10:40:22 2001
@@ -25,6 +25,7 @@
 #endif
 
 #include <sys/types.h>
+#include <sys/stat.h>
 
 #if STDC_HEADERS || defined _LIBC
 # include <stdlib.h>
@@ -127,9 +128,10 @@
    resulting message digest number will be written into the 16 bytes
    beginning at RESBLOCK.  */
 int
-md5_stream (stream, resblock)
+md5_stream (stream, resblock, flags)
      FILE *stream;
      void *resblock;
+     enum md5_stream_flags flags;
 {
   /* Important: BLOCKSIZE must be a multiple of 64.  */
 #define BLOCKSIZE 4096
@@ -173,6 +175,21 @@
   /* Add the last bytes if necessary.  */
   if (sum > 0)
     md5_process_bytes (buffer, sum, &ctx);
+
+  /* Add in any additional information relevant */
+  if (flags) {
+    struct stat stat_buf;
+
+    if (fstat (fileno (stream), &stat_buf) < 0)
+      return 1;
+    if (flags & md5_stream_include_mtime)
+      md5_process_bytes (&stat_buf.st_mtime, sizeof stat_buf.st_mtime, &ctx);
+    if (flags & md5_stream_include_permissions) {
+      md5_process_bytes (&stat_buf.st_mode, sizeof stat_buf.st_mode, &ctx);
+      md5_process_bytes (&stat_buf.st_uid, sizeof stat_buf.st_uid, &ctx);
+      md5_process_bytes (&stat_buf.st_gid, sizeof stat_buf.st_gid, &ctx);
+    }
+  }
 
   /* Construct result in desired memory.  */
   md5_finish_ctx (&ctx, resblock);
diff -x stamp-vti -x textutils.info -x version.texi -x cat-id-tbl.c -x textutils.pot 
-ruN textutils-2.0.orig/lib/md5.h textutils-2.0/lib/md5.h
--- textutils-2.0.orig/lib/md5.h        Mon Jun 23 12:40:37 1997
+++ textutils-2.0/lib/md5.h     Thu Apr 26 10:40:34 2001
@@ -90,6 +90,12 @@
   char buffer[128];
 };
 
+/* Flag argument to md5_stream.  */
+enum md5_stream_flags {
+  md5_stream_include_permissions = 1,
+  md5_stream_include_mtime = 2,
+};
+
 /*
  * The following three functions are build up the low level used in
  * the functions `md5_stream' and `md5_buffer'.
@@ -134,8 +140,10 @@
 
 /* Compute MD5 message digest for bytes read from STREAM.  The
    resulting message digest number will be written into the 16 bytes
-   beginning at RESBLOCK.  */
-extern int md5_stream __P ((FILE *stream, void *resblock));
+   beginning at RESBLOCK.  The FLAGS argument determines what
+   additional information (if any) to include in the hash.  */
+extern int md5_stream __P ((FILE *stream, void *resblock,
+                           enum md5_stream_flags flags));
 
 /* Compute MD5 message digest for LEN bytes beginning at BUFFER.  The
    result is always in little endian byte order, so that a byte-wise
diff -x stamp-vti -x textutils.info -x version.texi -x cat-id-tbl.c -x textutils.pot 
-ruN textutils-2.0.orig/man/md5sum.1 textutils-2.0/man/md5sum.1
--- textutils-2.0.orig/man/md5sum.1     Fri Aug  6 20:24:08 1999
+++ textutils-2.0/man/md5sum.1  Thu Apr 26 10:55:19 2001
@@ -1,5 +1,5 @@
 .\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.012.
-.TH MD5SUM "1" "August 1999" "GNU textutils 2.0" FSF
+.TH MD5SUM "1" "April 2001" "GNU textutils 2.0" FSF
 .SH NAME
 md5sum \- compute and check MD5 message digest
 .SH SYNOPSIS
@@ -23,6 +23,12 @@
 .TP
 \fB\-t\fR, \fB\-\-text\fR
 read files in text mode (default)
+.TP
+\fB\-m\fR, \fB\-\-mtime\fR
+include last modified date in hash
+.TP
+\fB\-p\fR, \fB\-\-permissions\fR
+include permission information in hash
 .SS "The following two options are useful only when verifying checksums:"
 .TP
 \fB\-\-status\fR
diff -x stamp-vti -x textutils.info -x version.texi -x cat-id-tbl.c -x textutils.pot 
-ruN textutils-2.0.orig/src/md5sum.c textutils-2.0/src/md5sum.c
--- textutils-2.0.orig/src/md5sum.c     Mon May  3 18:55:37 1999
+++ textutils-2.0/src/md5sum.c  Thu Apr 26 10:52:22 2001
@@ -17,6 +17,7 @@
    Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 /* Written by Ulrich Drepper <[EMAIL PROTECTED]>.  */
+/* Modified by Richard Kettlewell <[EMAIL PROTECTED]> */
 
 #ifdef HAVE_CONFIG_H
 # include <config.h>
@@ -88,6 +89,8 @@
   { "string", required_argument, 0, 1 },
   { "text", no_argument, 0, 't' },
   { "warn", no_argument, 0, 'w' },
+  { "mtime", no_argument, 0, 'm' },
+  { "permissions", no_argument, 0, 'p' },
   { GETOPT_HELP_OPTION_DECL },
   { GETOPT_VERSION_OPTION_DECL },
   { NULL, 0, NULL, 0 }
@@ -110,6 +113,8 @@
   -b, --binary            read files in binary mode (default on DOS/Windows)\n\
   -c, --check             check MD5 sums against given list\n\
   -t, --text              read files in text mode (default)\n\
+  -m, --mtime             include last modified date in hash\n\
+  -p, --permissions       include permission information in hash\n\
 \n\
 The following two options are useful only when verifying checksums:\n\
       --status            don't output anything, status code shows success\n\
@@ -236,7 +241,8 @@
    to indicate success.  */
 
 static int
-md5_file (const char *filename, int binary, unsigned char *md5_result)
+md5_file (const char *filename, int binary, unsigned char *md5_result,
+         enum md5_stream_flags streamflags)
 {
   FILE *fp;
   int err;
@@ -266,7 +272,7 @@
        }
     }
 
-  err = md5_stream (fp, md5_result);
+  err = md5_stream (fp, md5_result, streamflags);
   if (err)
     {
       error (0, errno, "%s", filename);
@@ -285,7 +291,7 @@
 }
 
 static int
-md5_check (const char *checkfile_name)
+md5_check (const char *checkfile_name, enum md5_stream_flags streamflags)
 {
   FILE *checkfile_stream;
   int n_properly_formated_lines = 0;
@@ -357,7 +363,7 @@
 
          ++n_properly_formated_lines;
 
-         fail = md5_file (filename, binary, md5buffer);
+         fail = md5_file (filename, binary, md5buffer, streamflags);
 
          if (fail)
            {
@@ -456,6 +462,7 @@
   size_t n_strings = 0;
   size_t err = 0;
   int file_type_specified = 0;
+  enum md5_stream_flags streamflags = 0;
 
 #if O_BINARY
   /* Binary is default on MSDOS, so the actual file contents
@@ -472,7 +479,7 @@
   bindtextdomain (PACKAGE, LOCALEDIR);
   textdomain (PACKAGE);
 
-  while ((opt = getopt_long (argc, argv, "bctw", long_options, NULL)) != -1)
+  while ((opt = getopt_long (argc, argv, "bctwmp", long_options, NULL)) != -1)
     switch (opt)
       {
       case 0:                  /* long option */
@@ -506,6 +513,12 @@
        status_only = 0;
        warn = 1;
        break;
+      case 'm':
+       streamflags |= md5_stream_include_mtime;
+       break;
+      case 'p':
+       streamflags |= md5_stream_include_permissions;
+       break;
       case_GETOPT_HELP_CHAR;
       case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
       default:
@@ -569,7 +582,7 @@
          usage (EXIT_FAILURE);
        }
 
-      err = md5_check ((optind == argc) ? "-" : argv[optind]);
+      err = md5_check ((optind == argc) ? "-" : argv[optind], streamflags);
     }
   else
     {
@@ -581,7 +594,7 @@
          int fail;
          char *file = argv[optind];
 
-         fail = md5_file (file, binary, md5buffer);
+         fail = md5_file (file, binary, md5buffer, streamflags);
          err |= fail;
          if (!fail)
            {


_______________________________________________
Bug-textutils mailing list
[EMAIL PROTECTED]
http://mail.gnu.org/mailman/listinfo/bug-textutils

Reply via email to