diff --git a/sys/man/1/gzip b/sys/man/1/gzip index f56a6a246..12288e8bb 100644 --- a/sys/man/1/gzip +++ b/sys/man/1/gzip @@ -3,7 +3,7 @@ gzip, gunzip, bzip2, bunzip2, compress, uncompress, zip, unzip \- compress and expand data .SH SYNOPSIS .B gzip -.RB [ -cvD [ 1-9 ]] +.RB [ -cvnD [ 1-9 ]] .RI [ file .BR ... ] .PP @@ -13,7 +13,7 @@ gzip, gunzip, bzip2, bunzip2, compress, uncompress, zip, unzip \- compress and e .BR ... ] .PP .B bzip2 -.RB [ -cvD [ 1-9 ]] +.RB [ -cvnD [ 1-9 ]] .RI [ file .BR ... ] .PP @@ -180,6 +180,19 @@ Without .BR -t , prints the names of files on standard error as they are compressed or decompressed. .TP +.B -n +The +.I gzip +and +.I bzip2 +file formats include a modification timestamp which is by default set +to the modification time of the files being compressed or the current +time when the source file is read from standard input. +The +.B -n +flag overrides this behaviour and puts a timestamp of zero instead, +making the compressed output deterministic. +.TP .B -D Produce debugging output. .SH SOURCE diff --git a/sys/src/cmd/bzip2/bzip2.c b/sys/src/cmd/bzip2/bzip2.c index 17c2d06da..72630f04f 100644 --- a/sys/src/cmd/bzip2/bzip2.c +++ b/sys/src/cmd/bzip2/bzip2.c @@ -3,7 +3,7 @@ #include #include "bzlib.h" -static int bzipf(char*, int); +static int bzipf(char*, int, int); static int bzip(char*, long, int, Biobuf*); static Biobuf bout; @@ -15,7 +15,7 @@ static int verbose; static void usage(void) { - fprint(2, "usage: bzip2 [-vcD] [-1-9] [file ...]\n"); + fprint(2, "usage: bzip2 [-vcnD] [-1-9] [file ...]\n"); exits("usage"); } @@ -23,9 +23,11 @@ void main(int argc, char **argv) { int i, ok, stdout; + long mtime; level = 6; stdout = 0; + mtime = time(nil); ARGBEGIN{ case 'D': debug++; @@ -36,6 +38,9 @@ main(int argc, char **argv) case 'c': stdout++; break; + case 'n': + mtime = 0; + break; case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': level = ARGC() - '0'; @@ -47,18 +52,18 @@ main(int argc, char **argv) if(argc == 0){ Binit(&bout, 1, OWRITE); - ok = bzip(nil, time(0), 0, &bout); + ok = bzip(nil, mtime, 0, &bout); Bterm(&bout); }else{ ok = 1; for(i = 0; i < argc; i++) - ok &= bzipf(argv[i], stdout); + ok &= bzipf(argv[i], !mtime, stdout); } exits(ok ? nil: "errors"); } static int -bzipf(char *file, int stdout) +bzipf(char *file, int nomtime, int stdout) { Dir *dir; char ofile[128], *f, *s; @@ -110,7 +115,7 @@ bzipf(char *file, int stdout) fprint(2, "compressing %s to %s\n", file, ofile); Binit(&bout, ofd, OWRITE); - ok = bzip(file, dir->mtime, ifd, &bout); + ok = bzip(file, nomtime ? 0 : dir->mtime, ifd, &bout); if(!ok || Bflush(&bout) < 0){ fprint(2, "bzip2: error writing %s: %r\n", ofile); if(!stdout) diff --git a/sys/src/cmd/gzip/gzip.c b/sys/src/cmd/gzip/gzip.c index 2ba8c22c4..b085deda2 100644 --- a/sys/src/cmd/gzip/gzip.c +++ b/sys/src/cmd/gzip/gzip.c @@ -4,7 +4,7 @@ #include #include "gzip.h" -static int gzipf(char*, int); +static int gzipf(char*, int, int); static int gzip(char*, long, int, Biobuf*); static int crcread(void *fd, void *buf, int n); static int gzwrite(void *bout, void *buf, int n); @@ -21,7 +21,7 @@ static int verbose; void usage(void) { - fprint(2, "usage: gzip [-vcD] [-1-9] [file ...]\n"); + fprint(2, "usage: gzip [-vcnD] [-1-9] [file ...]\n"); exits("usage"); } @@ -29,9 +29,11 @@ void main(int argc, char *argv[]) { int i, ok, stdout; + long mtime; level = 6; stdout = 0; + mtime = time(nil); ARGBEGIN{ case 'D': debug++; @@ -42,6 +44,9 @@ main(int argc, char *argv[]) case 'c': stdout = 1; break; + case 'n': + mtime = 0; + break; case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': level = ARGC() - '0'; @@ -58,18 +63,18 @@ main(int argc, char *argv[]) if(argc == 0){ Binit(&bout, 1, OWRITE); - ok = gzip(nil, time(0), 0, &bout); + ok = gzip(nil, mtime, 0, &bout); Bterm(&bout); }else{ ok = 1; for(i = 0; i < argc; i++) - ok &= gzipf(argv[i], stdout); + ok &= gzipf(argv[i], !mtime, stdout); } exits(ok ? nil: "errors"); } static int -gzipf(char *file, int stdout) +gzipf(char *file, int nomtime, int stdout) { Dir *dir; char ofile[256], *f, *s; @@ -120,7 +125,7 @@ gzipf(char *file, int stdout) fprint(2, "compressing %s to %s\n", file, ofile); Binit(&bout, ofd, OWRITE); - ok = gzip(file, dir->mtime, ifd, &bout); + ok = gzip(file, nomtime ? 0 : dir->mtime, ifd, &bout); if(!ok || Bflush(&bout) < 0){ fprint(2, "gzip: error writing %s: %r\n", ofile); if(!stdout)