impliment -z (gzip) in pax and tar, and -Z (compress) in tar.
This commit is contained in:
parent
a77bcc1072
commit
7f64ea0365
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: ar_io.c,v 1.4 1995/03/21 09:07:04 cgd Exp $ */
|
/* $NetBSD: ar_io.c,v 1.5 1996/03/26 23:54:13 mrg Exp $ */
|
||||||
|
|
||||||
/*-
|
/*-
|
||||||
* Copyright (c) 1992 Keith Muller.
|
* Copyright (c) 1992 Keith Muller.
|
||||||
@ -41,7 +41,7 @@
|
|||||||
#if 0
|
#if 0
|
||||||
static char sccsid[] = "@(#)ar_io.c 8.2 (Berkeley) 4/18/94";
|
static char sccsid[] = "@(#)ar_io.c 8.2 (Berkeley) 4/18/94";
|
||||||
#else
|
#else
|
||||||
static char rcsid[] = "$NetBSD: ar_io.c,v 1.4 1995/03/21 09:07:04 cgd Exp $";
|
static char rcsid[] = "$NetBSD: ar_io.c,v 1.5 1996/03/26 23:54:13 mrg Exp $";
|
||||||
#endif
|
#endif
|
||||||
#endif /* not lint */
|
#endif /* not lint */
|
||||||
|
|
||||||
@ -84,9 +84,11 @@ static int invld_rec; /* tape has out of spec record size */
|
|||||||
static int wr_trail = 1; /* trailer was rewritten in append */
|
static int wr_trail = 1; /* trailer was rewritten in append */
|
||||||
static int can_unlnk = 0; /* do we unlink null archives? */
|
static int can_unlnk = 0; /* do we unlink null archives? */
|
||||||
char *arcname; /* printable name of archive */
|
char *arcname; /* printable name of archive */
|
||||||
|
char *gzip_program; /* name of gzip program */
|
||||||
|
|
||||||
static int get_phys __P((void));
|
static int get_phys __P((void));
|
||||||
extern sigset_t s_mask;
|
extern sigset_t s_mask;
|
||||||
|
static void ar_start_gzip __P((int));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ar_open()
|
* ar_open()
|
||||||
@ -126,6 +128,8 @@ ar_open(name)
|
|||||||
arcname = STDN;
|
arcname = STDN;
|
||||||
} else if ((arfd = open(name, EXT_MODE, DMOD)) < 0)
|
} else if ((arfd = open(name, EXT_MODE, DMOD)) < 0)
|
||||||
syswarn(0, errno, "Failed open to read on %s", name);
|
syswarn(0, errno, "Failed open to read on %s", name);
|
||||||
|
if (zflag)
|
||||||
|
ar_start_gzip(arfd);
|
||||||
break;
|
break;
|
||||||
case ARCHIVE:
|
case ARCHIVE:
|
||||||
if (name == NULL) {
|
if (name == NULL) {
|
||||||
@ -135,8 +139,12 @@ ar_open(name)
|
|||||||
syswarn(0, errno, "Failed open to write on %s", name);
|
syswarn(0, errno, "Failed open to write on %s", name);
|
||||||
else
|
else
|
||||||
can_unlnk = 1;
|
can_unlnk = 1;
|
||||||
|
if (zflag)
|
||||||
|
ar_start_gzip(arfd);
|
||||||
break;
|
break;
|
||||||
case APPND:
|
case APPND:
|
||||||
|
if (zflag)
|
||||||
|
err(1, "can not gzip while appending");
|
||||||
if (name == NULL) {
|
if (name == NULL) {
|
||||||
arfd = STDOUT_FILENO;
|
arfd = STDOUT_FILENO;
|
||||||
arcname = STDO;
|
arcname = STDO;
|
||||||
@ -1292,3 +1300,65 @@ ar_next()
|
|||||||
}
|
}
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ar_start_gzip()
|
||||||
|
* starts the gzip compression/decompression process as a child, using magic
|
||||||
|
* to keep the fd the same in the calling function (parent).
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
#ifdef __STDC__
|
||||||
|
ar_start_gzip(int fd)
|
||||||
|
#else
|
||||||
|
ar_start_gzip(fd)
|
||||||
|
int fd;
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
pid_t pid;
|
||||||
|
int fds[2];
|
||||||
|
char *gzip_flags;
|
||||||
|
|
||||||
|
if (pipe(fds) < 0)
|
||||||
|
err(1, "could not pipe");
|
||||||
|
pid = fork();
|
||||||
|
if (pid < 0)
|
||||||
|
err(1, "could not fork");
|
||||||
|
|
||||||
|
/* parent */
|
||||||
|
if (pid) {
|
||||||
|
switch (act) {
|
||||||
|
case ARCHIVE:
|
||||||
|
dup2(fds[1], fd);
|
||||||
|
break;
|
||||||
|
case LIST:
|
||||||
|
case EXTRACT:
|
||||||
|
dup2(fds[0], fd);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
errx(1, "ar_start_gzip: impossible");
|
||||||
|
}
|
||||||
|
close(fds[0]);
|
||||||
|
close(fds[1]);
|
||||||
|
} else {
|
||||||
|
switch (act) {
|
||||||
|
case ARCHIVE:
|
||||||
|
dup2(fds[0], STDIN_FILENO);
|
||||||
|
dup2(fd, STDOUT_FILENO);
|
||||||
|
gzip_flags = "-c";
|
||||||
|
break;
|
||||||
|
case LIST:
|
||||||
|
case EXTRACT:
|
||||||
|
dup2(fds[1], STDOUT_FILENO);
|
||||||
|
dup2(fd, STDIN_FILENO);
|
||||||
|
gzip_flags = "-dc";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
errx(1, "ar_start_gzip: impossible");
|
||||||
|
}
|
||||||
|
close(fds[0]);
|
||||||
|
close(fds[1]);
|
||||||
|
if (execlp(gzip_program, gzip_program, gzip_flags, NULL) < 0)
|
||||||
|
err(1, "could not exec");
|
||||||
|
/* NOTREACHED */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: extern.h,v 1.4 1995/03/21 09:07:16 cgd Exp $ */
|
/* $NetBSD: extern.h,v 1.5 1996/03/26 23:54:16 mrg Exp $ */
|
||||||
|
|
||||||
/*-
|
/*-
|
||||||
* Copyright (c) 1992 Keith Muller.
|
* Copyright (c) 1992 Keith Muller.
|
||||||
@ -49,6 +49,7 @@
|
|||||||
* ar_io.c
|
* ar_io.c
|
||||||
*/
|
*/
|
||||||
extern char *arcname;
|
extern char *arcname;
|
||||||
|
extern char *gzip_program;
|
||||||
int ar_open __P((char *));
|
int ar_open __P((char *));
|
||||||
void ar_close __P((void));
|
void ar_close __P((void));
|
||||||
void ar_drain __P((void));
|
void ar_drain __P((void));
|
||||||
@ -215,6 +216,7 @@ extern int nflag;
|
|||||||
extern int tflag;
|
extern int tflag;
|
||||||
extern int uflag;
|
extern int uflag;
|
||||||
extern int vflag;
|
extern int vflag;
|
||||||
|
extern int zflag;
|
||||||
extern int Dflag;
|
extern int Dflag;
|
||||||
extern int Hflag;
|
extern int Hflag;
|
||||||
extern int Lflag;
|
extern int Lflag;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: options.c,v 1.5 1995/03/21 09:07:30 cgd Exp $ */
|
/* $NetBSD: options.c,v 1.6 1996/03/26 23:54:18 mrg Exp $ */
|
||||||
|
|
||||||
/*-
|
/*-
|
||||||
* Copyright (c) 1992 Keith Muller.
|
* Copyright (c) 1992 Keith Muller.
|
||||||
@ -41,7 +41,7 @@
|
|||||||
#if 0
|
#if 0
|
||||||
static char sccsid[] = "@(#)options.c 8.2 (Berkeley) 4/18/94";
|
static char sccsid[] = "@(#)options.c 8.2 (Berkeley) 4/18/94";
|
||||||
#else
|
#else
|
||||||
static char rcsid[] = "$NetBSD: options.c,v 1.5 1995/03/21 09:07:30 cgd Exp $";
|
static char rcsid[] = "$NetBSD: options.c,v 1.6 1996/03/26 23:54:18 mrg Exp $";
|
||||||
#endif
|
#endif
|
||||||
#endif /* not lint */
|
#endif /* not lint */
|
||||||
|
|
||||||
@ -83,6 +83,9 @@ static void cpio_options __P((register int, register char **));
|
|||||||
static void cpio_usage __P((void));
|
static void cpio_usage __P((void));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define GZIP_CMD "gzip" /* command to run as gzip */
|
||||||
|
#define COMPRESS_CMD "compress" /* command to run as compress */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Format specific routine table - MUST BE IN SORTED ORDER BY NAME
|
* Format specific routine table - MUST BE IN SORTED ORDER BY NAME
|
||||||
* (see pax.h for description of each function)
|
* (see pax.h for description of each function)
|
||||||
@ -199,7 +202,7 @@ pax_options(argc, argv)
|
|||||||
/*
|
/*
|
||||||
* process option flags
|
* process option flags
|
||||||
*/
|
*/
|
||||||
while ((c=getopt(argc,argv,"ab:cdf:iklno:p:rs:tuvwx:B:DE:G:HLPT:U:XYZ"))
|
while ((c=getopt(argc,argv,"ab:cdf:iklno:p:rs:tuvwx:zB:DE:G:HLPT:U:XYZ"))
|
||||||
!= EOF) {
|
!= EOF) {
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case 'a':
|
case 'a':
|
||||||
@ -383,6 +386,13 @@ pax_options(argc, argv)
|
|||||||
(void)fputs("\n\n", stderr);
|
(void)fputs("\n\n", stderr);
|
||||||
pax_usage();
|
pax_usage();
|
||||||
break;
|
break;
|
||||||
|
case 'z':
|
||||||
|
/*
|
||||||
|
* use gzip. Non standard option.
|
||||||
|
*/
|
||||||
|
zflag = 1;
|
||||||
|
gzip_program = GZIP_CMD;
|
||||||
|
break;
|
||||||
case 'B':
|
case 'B':
|
||||||
/*
|
/*
|
||||||
* non-standard option on number of bytes written on a
|
* non-standard option on number of bytes written on a
|
||||||
@ -594,7 +604,7 @@ tar_options(argc, argv)
|
|||||||
/*
|
/*
|
||||||
* process option flags
|
* process option flags
|
||||||
*/
|
*/
|
||||||
while ((c = getoldopt(argc, argv, "b:cef:moprutvwxBHLPX014578"))
|
while ((c = getoldopt(argc, argv, "b:cef:moprutvwxzBHLPXZ014578"))
|
||||||
!= EOF) {
|
!= EOF) {
|
||||||
switch(c) {
|
switch(c) {
|
||||||
case 'b':
|
case 'b':
|
||||||
@ -684,6 +694,13 @@ tar_options(argc, argv)
|
|||||||
*/
|
*/
|
||||||
act = EXTRACT;
|
act = EXTRACT;
|
||||||
break;
|
break;
|
||||||
|
case 'z':
|
||||||
|
/*
|
||||||
|
* use gzip. Non standard option.
|
||||||
|
*/
|
||||||
|
zflag = 1;
|
||||||
|
gzip_program = GZIP_CMD;
|
||||||
|
break;
|
||||||
case 'B':
|
case 'B':
|
||||||
/*
|
/*
|
||||||
* Nothing to do here, this is pax default
|
* Nothing to do here, this is pax default
|
||||||
@ -713,6 +730,13 @@ tar_options(argc, argv)
|
|||||||
*/
|
*/
|
||||||
Xflag = 1;
|
Xflag = 1;
|
||||||
break;
|
break;
|
||||||
|
case 'Z':
|
||||||
|
/*
|
||||||
|
* use compress.
|
||||||
|
*/
|
||||||
|
zflag = 1;
|
||||||
|
gzip_program = COMPRESS_CMD;
|
||||||
|
break;
|
||||||
case '0':
|
case '0':
|
||||||
arcname = DEV_0;
|
arcname = DEV_0;
|
||||||
break;
|
break;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: pax.c,v 1.4 1995/03/21 09:07:39 cgd Exp $ */
|
/* $NetBSD: pax.c,v 1.5 1996/03/26 23:54:20 mrg Exp $ */
|
||||||
|
|
||||||
/*-
|
/*-
|
||||||
* Copyright (c) 1992 Keith Muller.
|
* Copyright (c) 1992 Keith Muller.
|
||||||
@ -47,7 +47,7 @@ static char copyright[] =
|
|||||||
#if 0
|
#if 0
|
||||||
static char sccsid[] = "@(#)pax.c 8.2 (Berkeley) 4/18/94";
|
static char sccsid[] = "@(#)pax.c 8.2 (Berkeley) 4/18/94";
|
||||||
#else
|
#else
|
||||||
static char rcsid[] = "$NetBSD: pax.c,v 1.4 1995/03/21 09:07:39 cgd Exp $";
|
static char rcsid[] = "$NetBSD: pax.c,v 1.5 1996/03/26 23:54:20 mrg Exp $";
|
||||||
#endif
|
#endif
|
||||||
#endif /* not lint */
|
#endif /* not lint */
|
||||||
|
|
||||||
@ -83,6 +83,7 @@ int nflag; /* select first archive member match */
|
|||||||
int tflag; /* restore access time after read */
|
int tflag; /* restore access time after read */
|
||||||
int uflag; /* ignore older modification time files */
|
int uflag; /* ignore older modification time files */
|
||||||
int vflag; /* produce verbose output */
|
int vflag; /* produce verbose output */
|
||||||
|
int zflag; /* use gzip */
|
||||||
int Dflag; /* same as uflag except inode change time */
|
int Dflag; /* same as uflag except inode change time */
|
||||||
int Hflag; /* follow command line symlinks (write only) */
|
int Hflag; /* follow command line symlinks (write only) */
|
||||||
int Lflag; /* follow symlinks when writing */
|
int Lflag; /* follow symlinks when writing */
|
||||||
|
Loading…
Reference in New Issue
Block a user