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 +#include #if STDC_HEADERS || defined _LIBC # include @@ -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 . */ +/* Modified by Richard Kettlewell */ #ifdef HAVE_CONFIG_H # include @@ -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) {