gzip, bzip2: add -n flag to suppress modification timestamp

This commit is contained in:
cinap_lenrek 2021-07-21 17:36:02 +00:00
parent 28057f67a0
commit 403149d7de
3 changed files with 37 additions and 14 deletions

View file

@ -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

View file

@ -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 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)

View file

@ -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 @@ 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)