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