ref: 403149d7de4dbe4cc4b1fd9cb3a164e51dbccc15
parent: 28057f67a04fc9e666cdb698d811c9d26c94f28c
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Wed Jul 21 13:36:02 EDT 2021
gzip, bzip2: add -n flag to suppress modification timestamp
--- 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 @@
.BR ... ]
.PP
.B bzip2
-.RB [ -cvD [ 1-9 ]]
+.RB [ -cvnD [ 1-9 ]]
.RI [ file
.BR ... ]
.PP
@@ -179,6 +179,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.
--- a/sys/src/cmd/bzip2/bzip2.c
+++ b/sys/src/cmd/bzip2/bzip2.c
@@ -3,7 +3,7 @@
#include <bio.h>
#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 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 @@
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 @@
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 @@
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 @@
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)
--- a/sys/src/cmd/gzip/gzip.c
+++ b/sys/src/cmd/gzip/gzip.c
@@ -4,7 +4,7 @@
#include <flate.h>
#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 @@
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 @@
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 @@
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 @@
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 @@
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)