Module Name: src
Committed By: snj
Date: Sun Mar 15 21:15:22 UTC 2015
Modified Files:
src/usr.bin/gzip [netbsd-5-2]: Makefile gzip.1 gzip.c zuncompress.c
Log Message:
Pull up following revision(s) (requested by mrg in ticket #1951):
usr.bin/gzip/Makefile: patch
usr.bin/gzip/gzip.1: revisions 1.20-1.24
usr.bin/gzip/gzip.c: revisions 1.98-1.107
usr.bin/gzip/zuncompress.c: revisions 1.7-1.8
Sync gzip core with HEAD.
To generate a diff of this commit:
cvs rdiff -u -r1.12 -r1.12.2.1 src/usr.bin/gzip/Makefile
cvs rdiff -u -r1.19 -r1.19.2.1 src/usr.bin/gzip/gzip.1
cvs rdiff -u -r1.93.4.3 -r1.93.4.3.6.1 src/usr.bin/gzip/gzip.c
cvs rdiff -u -r1.6.28.1 -r1.6.28.1.2.1 src/usr.bin/gzip/zuncompress.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/usr.bin/gzip/Makefile
diff -u src/usr.bin/gzip/Makefile:1.12 src/usr.bin/gzip/Makefile:1.12.2.1
--- src/usr.bin/gzip/Makefile:1.12 Fri Aug 29 00:02:24 2008
+++ src/usr.bin/gzip/Makefile Sun Mar 15 21:15:21 2015
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.12 2008/08/29 00:02:24 gmcgarry Exp $
+# $NetBSD: Makefile,v 1.12.2.1 2015/03/15 21:15:21 snj Exp $
USE_FORT?= yes # data-driven bugs?
@@ -30,3 +30,6 @@ LINKS+= ${BINDIR}/gzip ${BINDIR}/gunzip
.if (defined(HAVE_GCC) && ${HAVE_GCC} == 4) || defined(HAVE_PCC)
COPTS.gzip.c+= -Wno-pointer-sign
.endif
+
+# NetBSD-5 has no -lzma
+CPPFLAGS+= -DNO_XZ_SUPPORT
Index: src/usr.bin/gzip/gzip.1
diff -u src/usr.bin/gzip/gzip.1:1.19 src/usr.bin/gzip/gzip.1:1.19.2.1
--- src/usr.bin/gzip/gzip.1:1.19 Thu May 29 14:51:27 2008
+++ src/usr.bin/gzip/gzip.1 Sun Mar 15 21:15:21 2015
@@ -1,4 +1,4 @@
-.\" $NetBSD: gzip.1,v 1.19 2008/05/29 14:51:27 mrg Exp $
+.\" $NetBSD: gzip.1,v 1.19.2.1 2015/03/15 21:15:21 snj Exp $
.\"
.\" Copyright (c) 1997, 2003, 2004 Matthew R. Green
.\" All rights reserved.
@@ -24,7 +24,7 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.Dd April 27, 2004
+.Dd January 13, 2015
.Dt GZIP 1
.Os
.Sh NAME
@@ -138,8 +138,8 @@ embedded in the file.
This option causes the stored filename in the input file to be used
as the output file.
.It Fl n , -no-name
-This option stops the filename from being stored in the output
-file.
+This option stops the filename and timestamp from being stored in
+the output file.
.It Fl q , -quiet
With this option, no warnings or errors are printed.
.It Fl r , -recursive
@@ -171,6 +171,7 @@ Options on the command line will overrid
.Sh SEE ALSO
.Xr bzip2 1 ,
.Xr compress 1 ,
+.Xr xz 1 ,
.Xr fts 3 ,
.Xr zlib 3
.Sh HISTORY
@@ -190,9 +191,9 @@ program for
This manual documents
.Nx
.Nm
-version 20040427.
+version 20150113.
.Sh AUTHORS
This implementation of
.Nm
was written by
-.An Matthew R. Green Aq [email protected] .
+.An Matthew R. Green Aq Mt [email protected] .
Index: src/usr.bin/gzip/gzip.c
diff -u src/usr.bin/gzip/gzip.c:1.93.4.3 src/usr.bin/gzip/gzip.c:1.93.4.3.6.1
--- src/usr.bin/gzip/gzip.c:1.93.4.3 Sun Nov 8 22:55:24 2009
+++ src/usr.bin/gzip/gzip.c Sun Mar 15 21:15:22 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: gzip.c,v 1.93.4.3 2009/11/08 22:55:24 snj Exp $ */
+/* $NetBSD: gzip.c,v 1.93.4.3.6.1 2015/03/15 21:15:22 snj Exp $ */
/*
* Copyright (c) 1997, 1998, 2003, 2004, 2006 Matthew R. Green
@@ -30,7 +30,7 @@
#ifndef lint
__COPYRIGHT("@(#) Copyright (c) 1997, 1998, 2003, 2004, 2006\
Matthew R. Green. All rights reserved.");
-__RCSID("$NetBSD: gzip.c,v 1.93.4.3 2009/11/08 22:55:24 snj Exp $");
+__RCSID("$NetBSD: gzip.c,v 1.93.4.3.6.1 2015/03/15 21:15:22 snj Exp $");
#endif /* not lint */
/*
@@ -81,6 +81,9 @@ enum filetype {
#ifndef NO_PACK_SUPPORT
FT_PACK,
#endif
+#ifndef NO_XZ_SUPPORT
+ FT_XZ,
+#endif
FT_LAST,
FT_UNKNOWN
};
@@ -101,6 +104,12 @@ enum filetype {
#define PACK_MAGIC "\037\036"
#endif
+#ifndef NO_XZ_SUPPORT
+#include <lzma.h>
+#define XZ_SUFFIX ".xz"
+#define XZ_MAGIC "\3757zXZ"
+#endif
+
#define GZ_SUFFIX ".gz"
#define BUFLEN (64 * 1024)
@@ -141,6 +150,9 @@ static suffixes_t suffixes[] = {
#ifndef NO_COMPRESS_SUPPORT
SUFFIX(Z_SUFFIX, ""),
#endif
+#ifndef NO_XZ_SUPPORT
+ SUFFIX(XZ_SUFFIX, ""),
+#endif
SUFFIX(GZ_SUFFIX, ""), /* Overwritten by -S "" */
#endif /* SMALL */
#undef SUFFIX
@@ -148,7 +160,7 @@ static suffixes_t suffixes[] = {
#define NUM_SUFFIXES (sizeof suffixes / sizeof suffixes[0])
#define SUFFIX_MAXLEN 30
-static const char gzip_version[] = "NetBSD gzip 20091011";
+static const char gzip_version[] = "NetBSD gzip 20150113";
static int cflag; /* stdout mode */
static int dflag; /* decompress mode */
@@ -157,6 +169,7 @@ static int numflag = 6; /* gzip -1..-9
#ifndef SMALL
static int fflag; /* force mode */
+static int kflag; /* don't delete input files */
static int nflag; /* don't save name/timestamp */
static int Nflag; /* don't restore name/timestamp */
static int qflag; /* quiet mode */
@@ -172,16 +185,17 @@ static int exit_value = 0; /* exit valu
static char *infile; /* name of file coming in */
-static void maybe_err(const char *fmt, ...)
- __attribute__((__format__(__printf__, 1, 2)));
-#if !defined(NO_BZIP2_SUPPORT) || !defined(NO_PACK_SUPPORT)
-static void maybe_errx(const char *fmt, ...)
- __attribute__((__format__(__printf__, 1, 2)));
-#endif
-static void maybe_warn(const char *fmt, ...)
- __attribute__((__format__(__printf__, 1, 2)));
-static void maybe_warnx(const char *fmt, ...)
- __attribute__((__format__(__printf__, 1, 2)));
+/* from -current sys/cdefs.h */
+#define __printflike(fmtarg, firstvararg) \
+ __attribute__((__format__ (__printf__, fmtarg, firstvararg)))
+
+static void maybe_err(const char *fmt, ...) __printflike(1, 2) __dead;
+#if !defined(NO_BZIP2_SUPPORT) || !defined(NO_PACK_SUPPORT) || \
+ !defined(NO_XZ_SUPPORT)
+static void maybe_errx(const char *fmt, ...) __printflike(1, 2) __dead;
+#endif
+static void maybe_warn(const char *fmt, ...) __printflike(1, 2);
+static void maybe_warnx(const char *fmt, ...) __printflike(1, 2);
static enum filetype file_gettype(u_char *);
#ifdef SMALL
#define gz_compress(if, of, sz, fn, tm) gz_compress(if, of, sz)
@@ -196,8 +210,8 @@ static void handle_stdin(void);
static void handle_stdout(void);
static void print_ratio(off_t, off_t, FILE *);
static void print_list(int fd, off_t, const char *, time_t);
-static void usage(void);
-static void display_version(void);
+__dead static void usage(void);
+__dead static void display_version(void);
static const suffixes_t *check_suffix(char *, int);
static ssize_t read_retry(int, void *, size_t);
@@ -226,7 +240,9 @@ static off_t zuncompress(FILE *, FILE *,
static off_t unpack(int, int, char *, size_t, off_t *);
#endif
-int main(int, char *p[]);
+#ifndef NO_XZ_SUPPORT
+static off_t unxz(int, int, char *, size_t, off_t *);
+#endif
#ifdef SMALL
#define getopt_long(a,b,c,d,e) getopt(a,b,c)
@@ -238,6 +254,7 @@ static const struct option longopts[] =
{ "uncompress", no_argument, 0, 'd' },
{ "force", no_argument, 0, 'f' },
{ "help", no_argument, 0, 'h' },
+ { "keep", no_argument, 0, 'k' },
{ "list", no_argument, 0, 'l' },
{ "no-name", no_argument, 0, 'n' },
{ "name", no_argument, 0, 'N' },
@@ -289,9 +306,9 @@ main(int argc, char **argv)
dflag = cflag = 1;
#ifdef SMALL
-#define OPT_LIST "123456789cdhltV"
+#define OPT_LIST "123456789cdhlV"
#else
-#define OPT_LIST "123456789cdfhlNnqrS:tVv"
+#define OPT_LIST "123456789cdfhklNnqrS:tVv"
#endif
while ((ch = getopt_long(argc, argv, OPT_LIST, longopts, NULL)) != -1) {
@@ -318,6 +335,9 @@ main(int argc, char **argv)
case 'f':
fflag = 1;
break;
+ case 'k':
+ kflag = 1;
+ break;
case 'N':
nflag = 0;
Nflag = 1;
@@ -422,7 +442,8 @@ maybe_err(const char *fmt, ...)
exit(2);
}
-#if !defined(NO_BZIP2_SUPPORT) || !defined(NO_PACK_SUPPORT)
+#if !defined(NO_BZIP2_SUPPORT) || !defined(NO_PACK_SUPPORT) || \
+ !defined(NO_XZ_SUPPORT)
/* ... without an errno. */
void
maybe_errx(const char *fmt, ...)
@@ -557,7 +578,7 @@ gz_compress(int in, int out, off_t *gsiz
i++;
#endif
- z.next_out = outbufp + i;
+ z.next_out = (unsigned char *)outbufp + i;
z.avail_out = BUFLEN - i;
error = deflateInit2(&z, numflag, Z_DEFLATED,
@@ -578,7 +599,7 @@ gz_compress(int in, int out, off_t *gsiz
}
out_tot += BUFLEN;
- z.next_out = outbufp;
+ z.next_out = (unsigned char *)outbufp;
z.avail_out = BUFLEN;
}
@@ -594,7 +615,7 @@ gz_compress(int in, int out, off_t *gsiz
crc = crc32(crc, (const Bytef *)inbufp, (unsigned)in_size);
in_tot += in_size;
- z.next_in = inbufp;
+ z.next_in = (unsigned char *)inbufp;
z.avail_in = in_size;
}
@@ -627,7 +648,7 @@ gz_compress(int in, int out, off_t *gsiz
goto out;
}
out_tot += len;
- z.next_out = outbufp;
+ z.next_out = (unsigned char *)outbufp;
z.avail_out = BUFLEN;
if (error == Z_STREAM_END)
@@ -721,9 +742,9 @@ gz_uncompress(int in, int out, char *pre
memset(&z, 0, sizeof z);
z.avail_in = prelen;
- z.next_in = pre;
+ z.next_in = (unsigned char *)pre;
z.avail_out = BUFLEN;
- z.next_out = outbufp;
+ z.next_out = (unsigned char *)outbufp;
z.zalloc = NULL;
z.zfree = NULL;
z.opaque = 0;
@@ -738,7 +759,7 @@ gz_uncompress(int in, int out, char *pre
if (z.avail_in > 0) {
memmove(inbufp, z.next_in, z.avail_in);
}
- z.next_in = inbufp;
+ z.next_in = (unsigned char *)inbufp;
in_size = read(in, z.next_in + z.avail_in,
BUFLEN - z.avail_in);
@@ -886,6 +907,9 @@ gz_uncompress(int in, int out, char *pre
switch (error) {
/* Z_BUF_ERROR goes with Z_FINISH... */
case Z_BUF_ERROR:
+ if (z.avail_out > 0 && !done_reading)
+ continue;
+
case Z_STREAM_END:
case Z_OK:
break;
@@ -930,7 +954,7 @@ gz_uncompress(int in, int out, char *pre
state++;
}
- z.next_out = outbufp;
+ z.next_out = (unsigned char *)outbufp;
z.avail_out = BUFLEN;
break;
@@ -1089,6 +1113,11 @@ file_gettype(u_char *buf)
return FT_PACK;
else
#endif
+#ifndef NO_XZ_SUPPORT
+ if (memcmp(buf, XZ_MAGIC, 4) == 0) /* XXX: We only have 4 bytes */
+ return FT_XZ;
+ else
+#endif
return FT_UNKNOWN;
}
@@ -1127,8 +1156,10 @@ unlink_input(const char *file, const str
{
struct stat nsb;
+ if (kflag)
+ return;
if (stat(file, &nsb) != 0)
- /* Must be gone alrady */
+ /* Must be gone already */
return;
if (nsb.st_dev != sb->st_dev || nsb.st_ino != sb->st_ino)
/* Definitely a different file */
@@ -1284,7 +1315,7 @@ file_uncompress(char *file, char *outfil
#ifndef SMALL
int rv;
time_t timestamp = 0;
- unsigned char name[PATH_MAX + 1];
+ char name[PATH_MAX + 1];
#endif
/* gather the old name info */
@@ -1316,7 +1347,6 @@ file_uncompress(char *file, char *outfil
}
method = file_gettype(header1);
-
#ifndef SMALL
if (fflag == 0 && method == FT_UNKNOWN) {
maybe_warnx("%s: not in gzip format", file);
@@ -1346,15 +1376,24 @@ file_uncompress(char *file, char *outfil
goto lose;
}
if (name[0] != 0) {
+ char *dp, *nf;
+
+ /* strip saved directory name */
+ nf = strrchr(name, '/');
+ if (nf == NULL)
+ nf = name;
+ else
+ nf++;
+
/* preserve original directory name */
- char *dp = strrchr(file, '/');
+ dp = strrchr(file, '/');
if (dp == NULL)
dp = file;
else
dp++;
snprintf(outfile, outsize, "%.*s%.*s",
(int) (dp - file),
- file, (int) rbytes, name);
+ file, (int) rbytes, nf);
}
}
}
@@ -1391,9 +1430,9 @@ file_uncompress(char *file, char *outfil
} else
zfd = STDOUT_FILENO;
+ switch (method) {
#ifndef NO_BZIP2_SUPPORT
- if (method == FT_BZIP2) {
-
+ case FT_BZIP2:
/* XXX */
if (lflag) {
maybe_warnx("no -l with bzip2 files");
@@ -1401,11 +1440,11 @@ file_uncompress(char *file, char *outfil
}
size = unbzip2(fd, zfd, NULL, 0, NULL);
- } else
+ break;
#endif
#ifndef NO_COMPRESS_SUPPORT
- if (method == FT_Z) {
+ case FT_Z: {
FILE *in, *out;
/* XXX */
@@ -1438,30 +1477,42 @@ file_uncompress(char *file, char *outfil
unlink(outfile);
goto lose;
}
- } else
+ break;
+ }
#endif
#ifndef NO_PACK_SUPPORT
- if (method == FT_PACK) {
+ case FT_PACK:
if (lflag) {
maybe_warnx("no -l with packed files");
goto lose;
}
size = unpack(fd, zfd, NULL, 0, NULL);
- } else
+ break;
+#endif
+
+#ifndef NO_XZ_SUPPORT
+ case FT_XZ:
+ if (lflag) {
+ maybe_warnx("no -l with xz files");
+ goto lose;
+ }
+
+ size = unxz(fd, zfd, NULL, 0, NULL);
+ break;
#endif
#ifndef SMALL
- if (method == FT_UNKNOWN) {
+ case FT_UNKNOWN:
if (lflag) {
maybe_warnx("no -l for unknown filetypes");
goto lose;
}
size = cat_fd(NULL, 0, NULL, fd);
- } else
+ break;
#endif
- {
+ default:
if (lflag) {
print_list(fd, isb.st_size, outfile, isb.st_mtime);
close(fd);
@@ -1469,6 +1520,7 @@ file_uncompress(char *file, char *outfil
}
size = gz_uncompress(fd, zfd, NULL, 0, NULL, file);
+ break;
}
if (close(fd) != 0)
@@ -1626,12 +1678,12 @@ handle_stdin(void)
#endif
case FT_GZIP:
usize = gz_uncompress(STDIN_FILENO, STDOUT_FILENO,
- header1, sizeof header1, &gsize, "(stdin)");
+ (char *)header1, sizeof header1, &gsize, "(stdin)");
break;
#ifndef NO_BZIP2_SUPPORT
case FT_BZIP2:
usize = unbzip2(STDIN_FILENO, STDOUT_FILENO,
- header1, sizeof header1, &gsize);
+ (char *)header1, sizeof header1, &gsize);
break;
#endif
#ifndef NO_COMPRESS_SUPPORT
@@ -1641,7 +1693,8 @@ handle_stdin(void)
return;
}
- usize = zuncompress(in, stdout, header1, sizeof header1, &gsize);
+ usize = zuncompress(in, stdout, (char *)header1,
+ sizeof header1, &gsize);
fclose(in);
break;
#endif
@@ -1651,6 +1704,12 @@ handle_stdin(void)
(char *)header1, sizeof header1, &gsize);
break;
#endif
+#ifndef NO_XZ_SUPPORT
+ case FT_XZ:
+ usize = unxz(STDIN_FILENO, STDOUT_FILENO,
+ (char *)header1, sizeof header1, &gsize);
+ break;
+#endif
}
#ifndef SMALL
@@ -1677,7 +1736,7 @@ handle_stdout(void)
return;
}
#endif
- /* If stdin is a file use it's mtime, otherwise use current time */
+ /* If stdin is a file use its mtime, otherwise use current time */
ret = fstat(STDIN_FILENO, &sb);
#ifndef SMALL
@@ -1991,6 +2050,7 @@ usage(void)
" --uncompress\n"
" -f --force force overwriting & compress links\n"
" -h --help display this help\n"
+ " -k --keep don't delete input files during operation\n"
" -l --list list compressed file contents\n"
" -N --name save or restore original file name and time stamp\n"
" -n --no-name don't save original file name or time stamp\n"
@@ -2026,6 +2086,9 @@ display_version(void)
#ifndef NO_PACK_SUPPORT
#include "unpack.c"
#endif
+#ifndef NO_XZ_SUPPORT
+#include "unxz.c"
+#endif
static ssize_t
read_retry(int fd, void *buf, size_t sz)
Index: src/usr.bin/gzip/zuncompress.c
diff -u src/usr.bin/gzip/zuncompress.c:1.6.28.1 src/usr.bin/gzip/zuncompress.c:1.6.28.1.2.1
--- src/usr.bin/gzip/zuncompress.c:1.6.28.1 Fri Aug 19 20:54:24 2011
+++ src/usr.bin/gzip/zuncompress.c Sun Mar 15 21:15:22 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: zuncompress.c,v 1.6.28.1 2011/08/19 20:54:24 riz Exp $ */
+/* $NetBSD: zuncompress.c,v 1.6.28.1.2.1 2015/03/15 21:15:22 snj Exp $ */
/*-
* Copyright (c) 1985, 1986, 1992, 1993
@@ -114,7 +114,7 @@ struct s_zstate {
code_int zs_ent;
code_int zs_hsize_reg;
int zs_hshift;
- } w; /* Write paramenters */
+ } w; /* Write parameters */
struct {
char_type *zs_stackp;
int zs_finchar;
@@ -146,7 +146,7 @@ zuncompress(FILE *in, FILE *out, char *p
compressed_pre = NULL;
while ((bin = fread(buf, 1, sizeof(buf), in)) != 0) {
- if (tflag == 0 && fwrite(buf, 1, bin, out) != bin) {
+ if (tflag == 0 && (off_t)fwrite(buf, 1, bin, out) != bin) {
free(buf);
return -1;
}