Package: gzip
Version: 1.3.12-6
Followup-For: Bug #506798

The attached patch adds a -T,--timestamp option to override the original
timestamp. It uses as its argument the number of seconds from the epoch.
Examples:

$ ./gzip -c zcat.1 | file -
/dev/stdin: gzip compressed data, was "zcat.1", from Unix, last modified: Thu 
Oct  7 23:46:28 1999, max compression
$ ./gzip -c -T 1234567890 zcat.1 | file -
/dev/stdin: gzip compressed data, was "zcat.1", from Unix, last modified: Fri 
Feb 13 15:31:30 2009, max compression
$ ./gzip -c < zcat.1 | file -
/dev/stdin: gzip compressed data, from Unix, last modified: Thu Oct  7 23:46:28 
1999, max compression
$ ./gzip -c -T 1234567890 < zcat.1 | file -
/dev/stdin: gzip compressed data, from Unix, last modified: Fri Feb 13 15:31:30 
2009, max compression
$ cat zcat.1 | ./gzip -c | file -
/dev/stdin: gzip compressed data, from Unix, last modified: Tue Nov 25 01:18:15 
2008, max compression
$ cat zcat.1 | ./gzip -c -T 1234567890 | file -
/dev/stdin: gzip compressed data, from Unix, last modified: Fri Feb 13 15:31:30 
2009, max compression


In creating this patch, I noticed that the long options structure
contains an entry mapping --no-time to -T, while the rest of gzip
suggests that --no-time (when compiled in) should map to -m.  I fixed
this entry in the long options structure, and added the corresponding
entry for --time.

- Josh Triplett

-- System Information:
Debian Release: lenny/sid
  APT prefers unstable
  APT policy: (500, 'unstable'), (1, 'experimental')
Architecture: amd64 (x86_64)

Kernel: Linux 2.6.27-1-amd64 (SMP w/2 CPU cores)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/bash

Versions of packages gzip depends on:
ii  debianutils                   2.30       Miscellaneous utilities specific t
ii  libc6                         2.7-16     GNU C Library: Shared libraries

gzip recommends no packages.

Versions of packages gzip suggests:
ii  less                          418-1      Pager program similar to more

-- no debconf information
diff -Nurp gzip-1.3.12.override-original-filename/gzip.1 gzip-1.3.12/gzip.1
--- gzip-1.3.12.override-original-filename/gzip.1	2008-11-24 23:49:34.000000000 -0800
+++ gzip-1.3.12/gzip.1	2008-11-25 00:55:14.000000000 -0800
@@ -7,6 +7,7 @@ gzip, gunzip, zcat \- compress or expand
 .RB [ " \-acdfhlLnNrtvV19 " ]
 .RB [ \-F\ original_filename ]
 .RB [ \-S\ suffix ]
+.RB [ \-T\ original_timestamp ]
 [
 .I "name \&..."
 ]
@@ -319,6 +320,11 @@ the .z suffix. This was changed to avoid
 .B \-t --test
 Test. Check the compressed file integrity.
 .TP
+.B \-T original_timestamp   --timestamp original_timestamp
+When compressing, store the specified original_timestamp (specified in seconds
+since the epoch of 1970-01-01 00:00:00 UTC) as the original time stamp in the
+gzip file, overriding the time stamp of the input file if any.
+.TP
 .B \-v --verbose
 Verbose. Display the name and percentage reduction for each file compressed
 or decompressed.
diff -Nurp gzip-1.3.12.override-original-filename/gzip.c gzip-1.3.12/gzip.c
--- gzip-1.3.12.override-original-filename/gzip.c	2008-11-25 00:31:07.000000000 -0800
+++ gzip-1.3.12/gzip.c	2008-11-25 01:13:42.000000000 -0800
@@ -203,6 +203,7 @@ char *orig_name = NULL; /* overriding va
 int last_member;      /* set for .zip and .Z files */
 int part_nb;          /* number of parts in .gz file */
 struct timespec time_stamp; /* original time stamp (modification time) */
+static int override_time = 0; /* override original timestamp */
 off_t ifile_size;      /* input file size, -1 for devices (debug only) */
 char *env;            /* contents of GZIP env variable */
 char **args = NULL;   /* argv pointer if GZIP env variable defined */
@@ -273,6 +274,8 @@ struct option longopts[] =
  /* {"pkzip",      0, 0, 'k'},    force output in pkzip format */
     {"list",       0, 0, 'l'}, /* list .gz file contents */
     {"license",    0, 0, 'L'}, /* display software license */
+    {"no-time",    0, 0, 'm'}, /* don't save or restore the time stamp */
+    {"time",       0, 0, 'M'}, /* save or restore the time stamp */
     {"no-name",    0, 0, 'n'}, /* don't save or restore original name & time */
     {"name",       0, 0, 'N'}, /* save or restore original name & time */
     {"quiet",      0, 0, 'q'}, /* quiet mode */
@@ -280,7 +283,7 @@ struct option longopts[] =
     {"recursive",  0, 0, 'r'}, /* recurse through directories */
     {"suffix",     1, 0, 'S'}, /* use given suffix instead of .gz */
     {"test",       0, 0, 't'}, /* test compressed file integrity */
-    {"no-time",    0, 0, 'T'}, /* don't save or restore the time stamp */
+    {"timestamp",  1, 0, 'T'}, /* override original time stamp */
     {"verbose",    0, 0, 'v'}, /* verbose mode */
     {"version",    0, 0, 'V'}, /* display version number */
     {"fast",       0, 0, '1'}, /* compress faster */
@@ -362,6 +365,7 @@ local void help()
 #endif
  "  -S, --suffix=SUF  use suffix SUF on compressed files",
  "  -t, --test        test compressed file integrity",
+ "  -T, --timestamp=T store T (seconds from the epoch) as original timestamp",
  "  -v, --verbose     verbose mode",
  "  -V, --version     display version number",
  "  -1, --fast        compress faster",
@@ -453,7 +457,7 @@ int main (argc, argv)
     z_suffix = Z_SUFFIX;
     z_len = strlen(z_suffix);
 
-    while ((optc = getopt_long (argc, argv, "ab:cdfF:hH?lLmMnNqrS:tvVZ123456789",
+    while ((optc = getopt_long (argc, argv, "ab:cdfF:hH?lLmMnNqrS:tT:vVZ123456789",
 				longopts, (int *)0)) != -1) {
 	switch (optc) {
         case 'a':
@@ -513,6 +517,17 @@ int main (argc, argv)
 	case 't':
 	    test = decompress = to_stdout = 1;
 	    break;
+	case 'T':
+	    override_time = 1;
+	    time_stamp.tv_sec = atoi(optarg);
+	    for (; *optarg; optarg++)
+	      if (! ('0' <= *optarg && *optarg <= '9'))
+		{
+		  fprintf (stderr, "%s: -T operand is not an integer\n",
+			   program_name);
+		  try_help ();
+		}
+	    break;
 	case 'v':
 	    verbose++; quiet = 0; break;
 	case 'V':
@@ -656,7 +671,7 @@ local void treat_stdin()
       }
     ifile_size = S_ISREG (istat.st_mode) ? istat.st_size : -1;
     time_stamp.tv_nsec = -1;
-    if (!no_time || list)
+    if (!override_time && (!no_time || list))
       time_stamp = get_stat_mtime (&istat);
 
     clear_bufs(); /* clear input and output buffers */
@@ -786,7 +801,7 @@ local void treat_file(iname)
 
     ifile_size = S_ISREG (istat.st_mode) ? istat.st_size : -1;
     time_stamp.tv_nsec = -1;
-    if (!no_time || list)
+    if (!override_time && (!no_time || list))
       time_stamp = get_stat_mtime (&istat);
 
     /* Generate output file name. For -r and (-t or -l), skip files

Reply via email to