Date: Wed, 04 Jul 2001 19:08:15 +0900 From: "Akinori MUSHA" <knu@iDaemons.org> To: obrien@FreeBSD.org Cc: audit@FreeBSD.org Subject: a patch to add bunzip2'ing functionality to gzip(1) Message-ID: <8666d9dn1s.wl@archon.local.idaemons.org>
next in thread | raw e-mail | index | archive | help
Hi,
Here is a patch to add bunzip2'ing functionality to our gzip(1), which
I obtained from NetBSD. Now that bzip2 is in the base, why don't we
make gzip(1) grok how to handle .bz2 files? :)
--
/
/__ __ Akinori.org / MUSHA.org
/ ) ) ) ) / FreeBSD.org / Ruby-lang.org
Akinori MUSHA aka / (_ / ( (__( @ iDaemons.org / and.or.jp
"Freeze this moment a little bit longer, make each impression
a little bit stronger.. Experience slips away -- Time stand still"
M share/mk/bsd.libnames.mk
M gnu/usr.bin/gzip/Makefile
M gnu/usr.bin/gzip/gzip.1
M gnu/usr.bin/gzip/gzip.c
M gnu/usr.bin/gzip/gzip.h
A gnu/usr.bin/gzip/unbzip2.c
Index: share/mk/bsd.libnames.mk
===================================================================
RCS file: /home/ncvs/src/share/mk/bsd.libnames.mk,v
retrieving revision 1.43
diff -u -r1.43 bsd.libnames.mk
--- share/mk/bsd.libnames.mk 2001/06/07 08:31:30 1.43
+++ share/mk/bsd.libnames.mk 2001/07/04 09:55:42
@@ -10,6 +10,7 @@
LIBALIAS?= ${DESTDIR}${LIBDIR}/libalias.a
LIBASN1?= ${DESTDIR}${LIBDIR}/libasn1.a # XXX in secure dist, not base
LIBATM?= ${DESTDIR}${LIBDIR}/libatm.a
+LIBBZ2?= ${DESTDIR}${LIBDIR}/libbz2.a
LIBC?= ${DESTDIR}${LIBDIR}/libc.a
LIBC_PIC?= ${DESTDIR}${LIBDIR}/libc_pic.a
LIBC_R?= ${DESTDIR}${LIBDIR}/libc_r.a
Index: gnu/usr.bin/gzip/Makefile
===================================================================
RCS file: /home/ncvs/src/gnu/usr.bin/gzip/Makefile,v
retrieving revision 1.23
diff -u -r1.23 Makefile
--- gnu/usr.bin/gzip/Makefile 2001/04/07 11:21:17 1.23
+++ gnu/usr.bin/gzip/Makefile 2001/07/04 09:38:56
@@ -3,7 +3,7 @@
PROG= gzip
SRCS= gzip.c zip.c deflate.c trees.c bits.c unzip.c inflate.c util.c \
- crypt.c lzw.c unlzw.c unlzh.c unpack.c getopt.c
+ crypt.c lzw.c unbzip2.c unlzw.c unlzh.c unpack.c getopt.c
CFLAGS+=-DSTDC_HEADERS=1 -DHAVE_UNISTD_H=1 -DDIRENT=1
.if ${MACHINE_ARCH} == "i386"
SRCS+= match.S
@@ -13,6 +13,9 @@
MAN= gzexe.1 gzip.1 zdiff.1 zforce.1 zmore.1 znew.1
NOSHARED?=yes
+
+LDADD+= -lbz2
+DPADD+= ${LIBBZ2}
LINKS+= ${BINDIR}/gzip ${BINDIR}/gunzip
LINKS+= ${BINDIR}/gzip ${BINDIR}/gzcat
Index: gnu/usr.bin/gzip/gzip.1
===================================================================
RCS file: /home/ncvs/src/gnu/usr.bin/gzip/gzip.1,v
retrieving revision 1.7
diff -u -r1.7 gzip.1
--- gnu/usr.bin/gzip/gzip.1 1999/09/20 09:15:15 1.7
+++ gnu/usr.bin/gzip/gzip.1 2001/07/04 09:42:11
@@ -98,11 +98,11 @@
.PP
.I gunzip
can currently decompress files created by
-.I gzip, zip, compress, compress -H
+.I gzip, bzip2, zip, compress, compress -H
or
.I pack.
The detection of the input format is automatic. When using
-the first two formats,
+the first three formats,
.I gunzip
checks a 32 bit CRC. For
.I pack, gunzip
@@ -369,7 +369,8 @@
On Vax/VMS, the name of the environment variable is GZIP_OPT, to
avoid a conflict with the symbol set for invocation of the program.
.SH "SEE ALSO"
-znew(1), zcmp(1), zmore(1), zforce(1), gzexe(1), compress(1)
+znew(1), zcmp(1), zmore(1), zforce(1), gzexe(1), zip(1), unzip(1),
+bzip2(1), compress(1), pack(1)
.SH "DIAGNOSTICS"
Exit status is normally 0;
if an error occurs, exit status is 1. If a warning occurs, exit status is 2.
Index: gnu/usr.bin/gzip/gzip.c
===================================================================
RCS file: /home/ncvs/src/gnu/usr.bin/gzip/gzip.c,v
retrieving revision 1.10
diff -u -r1.10 gzip.c
--- gnu/usr.bin/gzip/gzip.c 1999/08/27 23:35:50 1.10
+++ gnu/usr.bin/gzip/gzip.c 2001/07/04 09:44:43
@@ -957,7 +957,7 @@
int nlen, slen;
char suffix[MAX_SUFFIX+3]; /* last chars of name, forced to lower case */
static char *known_suffixes[] =
- {z_suffix, ".gz", ".z", ".taz", ".tgz", "-gz", "-z", "_z",
+ {z_suffix, ".gz", ".z", ".taz", ".tgz", "-gz", "-z", "_z", ".bz2",
#ifdef MAX_EXT_CHARS
"z",
#endif
@@ -1291,6 +1291,14 @@
/* check_zipfile may get ofname from the local header */
last_member = 1;
+ } else if (memcmp(magic, BZIP2_MAGIC, 2) == 0 && inptr == 2
+ && memcmp((char*)inbuf, BZIP2_MAGIC, 3) == 0
+ && (inbuf[3] >= '0' && inbuf[3] <= '9')) {
+ inptr = 0;
+ work = unbzip2;
+ method = BZIP2ED;
+ last_member = 1;
+
} else if (memcmp(magic, PACK_MAGIC, 2) == 0) {
work = unpack;
method = PACKED;
@@ -1340,7 +1348,8 @@
"compr", /* 1 */
"pack ", /* 2 */
"lzh ", /* 3 */
- "", "", "", "", /* 4 to 7 reserved */
+ "", "", "", /* 4 to 6 reserved */
+ "bzip2",
"defla"}; /* 8 */
char *date;
Index: gnu/usr.bin/gzip/gzip.h
===================================================================
RCS file: /home/ncvs/src/gnu/usr.bin/gzip/gzip.h,v
retrieving revision 1.3
diff -u -r1.3 gzip.h
--- gnu/usr.bin/gzip/gzip.h 1995/05/30 05:00:35 1.3
+++ gnu/usr.bin/gzip/gzip.h 2001/07/04 09:46:26
@@ -55,7 +55,8 @@
#define COMPRESSED 1
#define PACKED 2
#define LZHED 3
-/* methods 4 to 7 reserved */
+/* methods 4 to 6 reserved */
+#define BZIP2ED 7
#define DEFLATED 8
#define MAX_METHODS 9
extern int method; /* compression method */
@@ -157,6 +158,7 @@
#define OLD_GZIP_MAGIC "\037\236" /* Magic header for gzip 0.5 = freeze 1.x */
#define LZH_MAGIC "\037\240" /* Magic header for SCO LZH Compress files*/
#define PKZIP_MAGIC "\120\113\003\004" /* Magic header for pkzip files */
+#define BZIP2_MAGIC "\102\132\150" /* Magic header for bzip2 files */
/* gzip flag byte */
#define ASCII_FLAG 0x01 /* bit 0 set: file probably ascii text */
@@ -271,6 +273,9 @@
/* in unlzh.c */
extern int unlzh OF((int in, int out));
+
+ /* in unbzip2.c */
+extern int unbzip2 OF((int in, int out));
/* in gzip.c */
RETSIGTYPE abort_gzip OF((void));
Index: gnu/usr.bin/gzip/unbzip2.c
===================================================================
RCS file: unbzip2.c
diff -N unbzip2.c
--- /dev/null Wed Jul 4 18:55:00 2001
+++ unbzip2.c Wed Jul 4 18:35:50 2001
@@ -0,0 +1,84 @@
+/* unbzip2.c -- decompress files in bzip2 format.
+ */
+
+#ifdef RCSID
+/* static char rcsid[] = "$Id: unbzip2.c,v 1.4 2001/06/03 13:43:01 simonb Exp $"; */
+static char rcsid[] = "$FreeBSD$";
+#endif
+
+#define BZ_NO_STDIO
+#include <bzlib.h>
+#include <stddef.h>
+
+#include "gzip.h"
+
+
+/* ============================================================================
+ * Bunzip2 in to out.
+ */
+int unbzip2(in, out)
+ int in, out; /* input and output file descriptors */
+{
+ int n, ret, end_of_file;
+ bz_stream bzs;
+
+ bzs.bzalloc = NULL;
+ bzs.bzfree = NULL;
+ bzs.opaque = NULL;
+
+ end_of_file = 0;
+ if (BZ2_bzDecompressInit(&bzs, 0, 0) != BZ_OK)
+ return(ERROR);
+
+ /* Use up the remainder of "inbuf" that's been read in already */
+ bzs.next_in = inbuf;
+ bzs.avail_in = insize;
+
+ while (1) {
+ if (bzs.avail_in == 0 && !end_of_file) {
+ n = read(in, inbuf, INBUFSIZ);
+ if (n < 0)
+ read_error();
+ if (n == 0)
+ end_of_file = 1;
+ bzs.next_in = inbuf;
+ bzs.avail_in = n;
+ }
+
+ bzs.next_out = outbuf;
+ bzs.avail_out = OUTBUFSIZ;
+ ret = BZ2_bzDecompress(&bzs);
+
+ if (ret == BZ_STREAM_END) {
+ if (!test) {
+ n = write(out, outbuf, OUTBUFSIZ - bzs.avail_out);
+ if (n < 0)
+ write_error();
+ bytes_out += n;
+ }
+ break;
+ }
+ else if (ret == BZ_OK) {
+ if (end_of_file)
+ read_error();
+ if (!test)
+ n = write(out, outbuf, OUTBUFSIZ - bzs.avail_out);
+ bytes_out += n;
+ }
+ else {
+ switch (ret) {
+ case BZ_DATA_ERROR:
+ error("bzip2 data integrity error");
+ case BZ_DATA_ERROR_MAGIC:
+ error("bzip2 magic number error");
+ case BZ_MEM_ERROR:
+ error("bzip2 out of memory");
+ }
+ }
+ }
+
+ if (BZ2_bzDecompressEnd(&bzs) != BZ_OK)
+ return(ERROR);
+
+ return(OK);
+}
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-audit" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?8666d9dn1s.wl>
