bin/pax: Synchronize on NetBSD-current (30/03/2021 16:09 UTC)
This commit is contained in:
parent
c0826206ed
commit
58e9e7462b
|
|
@ -1,4 +1,4 @@
|
|||
# $NetBSD: Makefile,v 1.39 2010/04/23 19:41:02 joerg Exp $
|
||||
# $NetBSD: Makefile,v 1.41 2019/10/13 07:28:04 mrg Exp $
|
||||
# @(#)Makefile 8.1 (Berkeley) 5/31/93
|
||||
|
||||
.include <bsd.own.mk>
|
||||
|
|
@ -23,7 +23,7 @@ LDADD+= -lutil
|
|||
.endif
|
||||
.endif
|
||||
|
||||
MAN= pax.1 tar.1 cpio.1
|
||||
MAN= pax.1
|
||||
|
||||
.if defined(HOSTPROG)
|
||||
CPPFLAGS+= -DHOSTPROG
|
||||
|
|
@ -35,12 +35,14 @@ CPPFLAGS+= -DHAVE_SYS_MTIO_H
|
|||
.if ${MKBSDTAR} == "no"
|
||||
LINKS+= ${BINDIR}/pax ${BINDIR}/tar
|
||||
SYMLINKS+=${BINDIR}/tar /usr/bin/tar
|
||||
MAN+=tar.1
|
||||
.if defined(__MINIX)
|
||||
SYMLINKS+=${BINDIR}/tar /usr/bin/bsdtar
|
||||
.endif
|
||||
|
||||
LINKS+= ${BINDIR}/pax ${BINDIR}/cpio
|
||||
SYMLINKS+=${BINDIR}/cpio /usr/bin/cpio
|
||||
MAN+=cpio.1
|
||||
.endif
|
||||
.endif # } ! HOSTPROG
|
||||
|
||||
|
|
@ -57,4 +59,6 @@ CPPFLAGS+= -DHOSTPROG
|
|||
MLINKS+= pax.1 bsdtar.1
|
||||
.endif # defined(__MINIX)
|
||||
|
||||
COPTS.tar.c+= ${GCC_NO_STRINGOP_TRUNCATION}
|
||||
|
||||
.include <bsd.prog.mk>
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: ar_io.c,v 1.56 2015/03/09 23:38:08 sevan Exp $ */
|
||||
/* $NetBSD: ar_io.c,v 1.59 2019/02/04 04:36:41 mrg Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1992 Keith Muller.
|
||||
|
|
@ -42,27 +42,27 @@
|
|||
#if 0
|
||||
static char sccsid[] = "@(#)ar_io.c 8.2 (Berkeley) 4/18/94";
|
||||
#else
|
||||
__RCSID("$NetBSD: ar_io.c,v 1.56 2015/03/09 23:38:08 sevan Exp $");
|
||||
__RCSID("$NetBSD: ar_io.c,v 1.59 2019/02/04 04:36:41 mrg Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/ioctl.h>
|
||||
#ifdef HAVE_SYS_MTIO_H
|
||||
#include <sys/mtio.h>
|
||||
#endif
|
||||
#include <sys/stat.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/wait.h>
|
||||
#include <signal.h>
|
||||
#include <string.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
#ifdef SUPPORT_RMT
|
||||
#define __RMTLIB_PRIVATE
|
||||
#include <rmt.h>
|
||||
|
|
@ -1631,8 +1631,7 @@ void
|
|||
ar_summary(int n)
|
||||
{
|
||||
time_t secs;
|
||||
int len;
|
||||
char buf[BUFSIZ];
|
||||
char buf[4096];
|
||||
char tbuf[MAXPATHLEN/4]; /* XXX silly size! */
|
||||
char s1buf[MAXPATHLEN/8]; /* XXX very silly size! */
|
||||
char s2buf[MAXPATHLEN/8]; /* XXX very silly size! */
|
||||
|
|
@ -1657,33 +1656,32 @@ ar_summary(int n)
|
|||
* could have written anything yet.
|
||||
*/
|
||||
if (frmt == NULL && act != COPY) {
|
||||
len = snprintf(buf, sizeof(buf),
|
||||
snprintf(buf, sizeof(buf),
|
||||
"unknown format, %s skipped in %s\n",
|
||||
sizefmt(s1buf, sizeof(s1buf), rdcnt),
|
||||
timefmt(tbuf, sizeof(tbuf), rdcnt, secs, "bytes"));
|
||||
if (n == 0)
|
||||
(void)fprintf(outf, "%s: %s", argv0, buf);
|
||||
else
|
||||
(void)write(STDERR_FILENO, buf, len);
|
||||
(void)write(STDERR_FILENO, buf, strlen(buf));
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (n != 0 && *archd.name) {
|
||||
len = snprintf(buf, sizeof(buf), "Working on `%s' (%s)\n",
|
||||
snprintf(buf, sizeof(buf), "Working on `%s' (%s)\n",
|
||||
archd.name, sizefmt(s1buf, sizeof(s1buf), archd.sb.st_size));
|
||||
(void)write(STDERR_FILENO, buf, len);
|
||||
len = 0;
|
||||
(void)write(STDERR_FILENO, buf, strlen(buf));
|
||||
}
|
||||
|
||||
|
||||
if (act == COPY) {
|
||||
len = snprintf(buf, sizeof(buf),
|
||||
snprintf(buf, sizeof(buf),
|
||||
"%lu files in %s\n",
|
||||
(unsigned long)flcnt,
|
||||
timefmt(tbuf, sizeof(tbuf), flcnt, secs, "files"));
|
||||
} else {
|
||||
len = snprintf(buf, sizeof(buf),
|
||||
snprintf(buf, sizeof(buf),
|
||||
"%s vol %d, %lu files, %s read, %s written in %s\n",
|
||||
frmt->name, arvol-1, (unsigned long)flcnt,
|
||||
sizefmt(s1buf, sizeof(s1buf), rdcnt),
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: buf_subs.c,v 1.28 2007/04/29 20:23:34 msaitoh Exp $ */
|
||||
/* $NetBSD: buf_subs.c,v 1.29 2018/03/19 03:11:39 msaitoh Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1992 Keith Muller.
|
||||
|
|
@ -42,7 +42,7 @@
|
|||
#if 0
|
||||
static char sccsid[] = "@(#)buf_subs.c 8.2 (Berkeley) 4/18/94";
|
||||
#else
|
||||
__RCSID("$NetBSD: buf_subs.c,v 1.28 2007/04/29 20:23:34 msaitoh Exp $");
|
||||
__RCSID("$NetBSD: buf_subs.c,v 1.29 2018/03/19 03:11:39 msaitoh Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
|
|
@ -493,7 +493,7 @@ wr_rdbuf(char *out, int outcnt)
|
|||
int cnt;
|
||||
|
||||
/*
|
||||
* while there is data to copy copy into the write buffer. when the
|
||||
* while there is data to copy into the write buffer. when the
|
||||
* write buffer fills, flush it to the archive and continue
|
||||
*/
|
||||
while (outcnt > 0) {
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
.\" $NetBSD: cpio.1,v 1.14 2015/12/19 18:48:33 wiz Exp $
|
||||
.\" $NetBSD: cpio.1,v 1.15 2017/07/03 21:33:23 wiz Exp $
|
||||
.\"
|
||||
.\" Copyright (c) 1997 SigmaSoft, Th. Lockert
|
||||
.\" All rights reserved.
|
||||
|
|
@ -39,8 +39,8 @@
|
|||
.Op Fl F Ar archive
|
||||
.Op Fl H Ar format
|
||||
.Op Fl O Ar archive
|
||||
.Ar "\*[Lt] name-list"
|
||||
.Op Ar "\*[Gt] archive"
|
||||
.Ar "< name-list"
|
||||
.Op Ar "> archive"
|
||||
.Nm cpio
|
||||
.Fl i
|
||||
.Op Fl 6BbcdfmrSstuvZz
|
||||
|
|
@ -50,12 +50,12 @@
|
|||
.Op Fl H Ar format
|
||||
.Op Fl I Ar archive
|
||||
.Op Ar "pattern ..."
|
||||
.Op Ar "\*[Lt] archive"
|
||||
.Op Ar "< archive"
|
||||
.Nm cpio
|
||||
.Fl p
|
||||
.Op Fl adLlmuv
|
||||
.Ar destination-directory
|
||||
.Ar "\*[Lt] name-list"
|
||||
.Ar "< name-list"
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
.Nm
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: dumptar.c,v 1.2 2008/04/28 20:22:51 martin Exp $ */
|
||||
/* $NetBSD: dumptar.c,v 1.3 2016/05/30 17:34:35 dholland Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 2004 The NetBSD Foundation, Inc.
|
||||
|
|
@ -30,8 +30,12 @@
|
|||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <err.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include <err.h>
|
||||
#include <assert.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/mman.h>
|
||||
|
||||
|
|
@ -39,20 +43,25 @@
|
|||
|
||||
#define ussum(a) 1
|
||||
|
||||
/*
|
||||
* Ensure null termination.
|
||||
*/
|
||||
static char *
|
||||
buf(const char *p, size_t s)
|
||||
{
|
||||
static char buf[1024];
|
||||
(void)snprintf(buf, sizeof(buf), "%s", p);
|
||||
|
||||
assert(s < sizeof(buf));
|
||||
memcpy(buf, p, s);
|
||||
buf[s] = '\0';
|
||||
return buf;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
intarg(const char *p, size_t s)
|
||||
{
|
||||
char *ep, *b = buf(p, s);
|
||||
int r = (int)strtol(p, &ep, 8);
|
||||
int r = (int)strtol(b, &ep, 8);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: extern.h,v 1.59 2012/08/09 08:09:21 christos Exp $ */
|
||||
/* $NetBSD: extern.h,v 1.60 2020/04/03 16:13:32 joerg Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1992 Keith Muller.
|
||||
|
|
@ -204,9 +204,8 @@ void options(int, char **);
|
|||
OPLIST * opt_next(void);
|
||||
int bad_opt(void);
|
||||
int mkpath(char *);
|
||||
char *chdname;
|
||||
#if !HAVE_NBTOOL_CONFIG_H
|
||||
int do_chroot;
|
||||
extern int do_chroot;
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: file_subs.c,v 1.63 2013/07/29 17:46:36 christos Exp $ */
|
||||
/* $NetBSD: file_subs.c,v 1.64 2019/03/20 03:13:39 gutteridge Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1992 Keith Muller.
|
||||
|
|
@ -42,7 +42,7 @@
|
|||
#if 0
|
||||
static char sccsid[] = "@(#)file_subs.c 8.1 (Berkeley) 5/31/93";
|
||||
#else
|
||||
__RCSID("$NetBSD: file_subs.c,v 1.63 2013/07/29 17:46:36 christos Exp $");
|
||||
__RCSID("$NetBSD: file_subs.c,v 1.64 2019/03/20 03:13:39 gutteridge Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
|
|
@ -913,7 +913,7 @@ set_chflags(char *fnm, u_int32_t flags)
|
|||
* actual storage is quite small (the files are sparse). The problem is
|
||||
* the holes read as all zeros so are probably stored on the archive that
|
||||
* way (there is no way to determine if the file block is really a hole,
|
||||
* we only know that a file block of all zero's can be a hole).
|
||||
* we only know that a file block of all zeros can be a hole).
|
||||
* At this writing, no major archive format knows how to archive files
|
||||
* with holes. However, on extraction (or during copy, -rw) we have to
|
||||
* deal with these files. Without detecting the holes, the files can
|
||||
|
|
@ -986,7 +986,7 @@ file_write(int fd, char *str, int cnt, int *rem, int *isempt, int sz,
|
|||
if (*isempt) {
|
||||
/*
|
||||
* have not written to this block yet, so we keep
|
||||
* looking for zero's
|
||||
* looking for zeros
|
||||
*/
|
||||
pt = st;
|
||||
end = st + wcnt;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: gen_subs.c,v 1.36 2012/08/09 08:09:21 christos Exp $ */
|
||||
/* $NetBSD: gen_subs.c,v 1.37 2018/11/30 00:53:11 christos Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1992 Keith Muller.
|
||||
|
|
@ -42,7 +42,7 @@
|
|||
#if 0
|
||||
static char sccsid[] = "@(#)gen_subs.c 8.1 (Berkeley) 5/31/93";
|
||||
#else
|
||||
__RCSID("$NetBSD: gen_subs.c,v 1.36 2012/08/09 08:09:21 christos Exp $");
|
||||
__RCSID("$NetBSD: gen_subs.c,v 1.37 2018/11/30 00:53:11 christos Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
|
|
@ -306,12 +306,10 @@ u32_asc(uintmax_t val, char *str, int len, int base)
|
|||
|
||||
/*
|
||||
* asc_umax()
|
||||
* convert hex/octal character string into a uintmax. We do
|
||||
* not have to to check for overflow! (the headers in all supported
|
||||
* formats are not large enough to create an overflow).
|
||||
* convert hex/octal/base-256 value into a uintmax.
|
||||
* NOTE: strings passed to us are NOT TERMINATED.
|
||||
* Return:
|
||||
* uintmax_t value
|
||||
* uintmax_t value; UINTMAX_MAX for overflow/negative
|
||||
*/
|
||||
|
||||
uintmax_t
|
||||
|
|
@ -322,6 +320,30 @@ asc_umax(char *str, int len, int base)
|
|||
|
||||
stop = str + len;
|
||||
|
||||
/*
|
||||
* if the highest bit of first byte is set, it's base-256 encoded
|
||||
* (base-256 is basically (n-1)-bit big endian signed
|
||||
*/
|
||||
if (str < stop && (*str & 0x80)) {
|
||||
/*
|
||||
* uintmax_t can't be negative, so fail on negative numbers
|
||||
*/
|
||||
if (*str & 0x40)
|
||||
return UINTMAX_MAX;
|
||||
|
||||
tval = *str++ & 0x3f;
|
||||
while (str < stop) {
|
||||
/*
|
||||
* check for overflow
|
||||
*/
|
||||
if (tval > (UINTMAX_MAX/256))
|
||||
return UINTMAX_MAX;
|
||||
tval = (tval << 8) | ((*str++) & 0xFF);
|
||||
}
|
||||
|
||||
return tval;
|
||||
}
|
||||
|
||||
/*
|
||||
* skip over leading blanks and zeros
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: options.c,v 1.116 2015/04/11 15:41:33 christos Exp $ */
|
||||
/* $NetBSD: options.c,v 1.119 2020/04/03 16:13:32 joerg Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1992 Keith Muller.
|
||||
|
|
@ -42,7 +42,7 @@
|
|||
#if 0
|
||||
static char sccsid[] = "@(#)options.c 8.2 (Berkeley) 4/18/94";
|
||||
#else
|
||||
__RCSID("$NetBSD: options.c,v 1.116 2015/04/11 15:41:33 christos Exp $");
|
||||
__RCSID("$NetBSD: options.c,v 1.119 2020/04/03 16:13:32 joerg Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
|
|
@ -64,6 +64,7 @@ __RCSID("$NetBSD: options.c,v 1.116 2015/04/11 15:41:33 christos Exp $");
|
|||
#include <unistd.h>
|
||||
#include <inttypes.h>
|
||||
#include <paths.h>
|
||||
#include <util.h>
|
||||
#include "pax.h"
|
||||
#include "options.h"
|
||||
#include "cpio.h"
|
||||
|
|
@ -73,9 +74,15 @@ __RCSID("$NetBSD: options.c,v 1.116 2015/04/11 15:41:33 christos Exp $");
|
|||
#include "mtree.h"
|
||||
#endif /* SMALL */
|
||||
|
||||
char *chdname;
|
||||
#if !HAVE_NBTOOL_CONFIG_H
|
||||
int do_chroot;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Routines which handle command line options
|
||||
*/
|
||||
struct stat tst; /* Timestamp to set if non-0 */
|
||||
|
||||
static int nopids; /* tar mode: suppress "pids" for -p option */
|
||||
static char flgch[] = FLGCH; /* list of all possible flags (pax) */
|
||||
|
|
@ -88,6 +95,9 @@ static void printflg(unsigned int);
|
|||
static int c_frmt(const void *, const void *);
|
||||
static off_t str_offt(char *);
|
||||
static char *get_line(FILE *fp);
|
||||
#ifndef SMALL
|
||||
static int set_tstamp(const char *, struct stat *);
|
||||
#endif
|
||||
static void pax_options(int, char **);
|
||||
__dead static void pax_usage(void);
|
||||
static void tar_options(int, char **);
|
||||
|
|
@ -129,8 +139,9 @@ static int get_line_error;
|
|||
#define OPT_SPARSE 16
|
||||
#define OPT_XZ 17
|
||||
#define OPT_GNU 18
|
||||
#define OPT_TIMESTAMP 19
|
||||
#if !HAVE_NBTOOL_CONFIG_H
|
||||
#define OPT_CHROOT 19
|
||||
#define OPT_CHROOT 20
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
|
@ -251,6 +262,8 @@ struct option pax_longopts[] = {
|
|||
OPT_XZ },
|
||||
{ "gnu", no_argument, 0,
|
||||
OPT_GNU },
|
||||
{ "timestamp", required_argument, 0,
|
||||
OPT_TIMESTAMP },
|
||||
{ 0, 0, 0,
|
||||
0 },
|
||||
};
|
||||
|
|
@ -661,6 +674,14 @@ pax_options(int argc, char **argv)
|
|||
case OPT_GNU:
|
||||
is_gnutar = 1;
|
||||
break;
|
||||
#ifndef SMALL
|
||||
case OPT_TIMESTAMP:
|
||||
if (set_tstamp(optarg, &tst) == -1) {
|
||||
tty_warn(1, "Invalid timestamp `%s'", optarg);
|
||||
tar_usage();
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
case '?':
|
||||
default:
|
||||
pax_usage();
|
||||
|
|
@ -803,6 +824,8 @@ struct option tar_longopts[] = {
|
|||
{ "chroot", no_argument, 0,
|
||||
OPT_CHROOT },
|
||||
#endif
|
||||
{ "timestamp", required_argument, 0,
|
||||
OPT_TIMESTAMP },
|
||||
#if 0 /* Not implemented */
|
||||
{ "catenate", no_argument, 0, 'A' }, /* F */
|
||||
{ "concatenate", no_argument, 0, 'A' }, /* F */
|
||||
|
|
@ -1143,6 +1166,14 @@ tar_options(int argc, char **argv)
|
|||
case OPT_CHROOT:
|
||||
do_chroot = 1;
|
||||
break;
|
||||
#endif
|
||||
#ifndef SMALL
|
||||
case OPT_TIMESTAMP:
|
||||
if (set_tstamp(optarg, &tst) == -1) {
|
||||
tty_warn(1, "Invalid timestamp `%s'", optarg);
|
||||
tar_usage();
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
tar_usage();
|
||||
|
|
@ -2083,6 +2114,43 @@ get_line(FILE *f)
|
|||
return temp;
|
||||
}
|
||||
|
||||
#ifndef SMALL
|
||||
/*
|
||||
* set_tstamp()
|
||||
* Use a specific timestamp for all individual files created in the
|
||||
* archive
|
||||
*/
|
||||
static int
|
||||
set_tstamp(const char *b, struct stat *st)
|
||||
{
|
||||
time_t when;
|
||||
char *eb;
|
||||
long long l;
|
||||
|
||||
if (stat(b, st) != -1)
|
||||
return 0;
|
||||
|
||||
#ifndef HAVE_NBTOOL_CONFIG_H
|
||||
errno = 0;
|
||||
if ((when = parsedate(b, NULL, NULL)) == -1 && errno != 0)
|
||||
#endif
|
||||
{
|
||||
errno = 0;
|
||||
l = strtoll(b, &eb, 0);
|
||||
if (b == eb || *eb || errno)
|
||||
return -1;
|
||||
when = (time_t)l;
|
||||
}
|
||||
|
||||
st->st_ino = 1;
|
||||
#if HAVE_STRUCT_STAT_BIRTHTIME
|
||||
st->st_birthtime =
|
||||
#endif
|
||||
st->st_mtime = st->st_ctime = st->st_atime = when;
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* no_op()
|
||||
* for those option functions where the archive format has nothing to do.
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: pat_rep.c,v 1.29 2009/04/07 19:52:35 perry Exp $ */
|
||||
/* $NetBSD: pat_rep.c,v 1.31 2019/03/20 02:50:50 gutteridge Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1992 Keith Muller.
|
||||
|
|
@ -42,7 +42,7 @@
|
|||
#if 0
|
||||
static char sccsid[] = "@(#)pat_rep.c 8.2 (Berkeley) 4/18/94";
|
||||
#else
|
||||
__RCSID("$NetBSD: pat_rep.c,v 1.29 2009/04/07 19:52:35 perry Exp $");
|
||||
__RCSID("$NetBSD: pat_rep.c,v 1.31 2019/03/20 02:50:50 gutteridge Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
|
|
@ -85,12 +85,13 @@ static int resub(regex_t *, regmatch_t *, char *, char *, char *, char *);
|
|||
* parses the -s replacement string; compiles the regular expression
|
||||
* and stores the compiled value and its replacement string together in
|
||||
* replacement string list. Input to this function is of the form:
|
||||
* /old/new/pg
|
||||
* /old/new/gps
|
||||
* The first char in the string specifies the delimiter used by this
|
||||
* replacement string. "Old" is a regular expression in "ed" format which
|
||||
* is compiled by regcomp() and is applied to filenames. "new" is the
|
||||
* substitution string; p and g are options flags for printing and global
|
||||
* replacement (over the single filename)
|
||||
* substitution string; g, p, and s are options flags for global
|
||||
* replacement (over the single filename), printing, and preventing
|
||||
* substitutions on symbolic link destinations.
|
||||
* Return:
|
||||
* 0 if a proper replacement string and regular expression was added to
|
||||
* the list of replacement patterns; -1 otherwise.
|
||||
|
|
@ -895,7 +896,7 @@ fix_path( char *or_name, int *or_len, char *dir_name, int dir_len)
|
|||
* namelen the size of the name buffer.
|
||||
* nlen is the length of this name (and is modified to hold the length of
|
||||
* the final string).
|
||||
* prnt is a flag that says whether to print the final result.
|
||||
* flags contains various options to control behavior.
|
||||
* Return:
|
||||
* 0 if substitution was successful, 1 if we are to skip the file (the name
|
||||
* ended up empty)
|
||||
|
|
@ -924,7 +925,7 @@ rep_name(char *name, size_t namelen, int *nlen, int flags)
|
|||
* (the user already saw that substitution go by)
|
||||
*/
|
||||
pt = rephead;
|
||||
(void)strcpy(buf1, name);
|
||||
(void)strlcpy(buf1, name, sizeof(buf1));
|
||||
inpt = buf1;
|
||||
outpt = nname;
|
||||
endpt = outpt + PAXPATHLEN;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
.\" $NetBSD: pax.1,v 1.63 2013/11/14 07:45:05 wiz Exp $
|
||||
.\" $NetBSD: pax.1,v 1.71 2019/03/19 00:36:14 gutteridge Exp $
|
||||
.\"
|
||||
.\" Copyright (c) 1992 Keith Muller.
|
||||
.\" Copyright (c) 1992, 1993
|
||||
|
|
@ -33,7 +33,7 @@
|
|||
.\"
|
||||
.\" @(#)pax.1 8.4 (Berkeley) 4/18/94
|
||||
.\"
|
||||
.Dd November 13, 2013
|
||||
.Dd March 19, 2019
|
||||
.Dt PAX 1
|
||||
.Os
|
||||
.Sh NAME
|
||||
|
|
@ -572,20 +572,21 @@ using the syntax of the
|
|||
.Xr ed 1
|
||||
utility regular expressions.
|
||||
The format of these regular expressions are:
|
||||
.Dl /old/new/[gp]
|
||||
.Dl /old/new/[gps]
|
||||
As in
|
||||
.Xr ed 1 ,
|
||||
.Cm old
|
||||
is a basic regular expression and
|
||||
.Cm new
|
||||
can contain an ampersand (\*[Am]), \en (where n is a digit) back-references,
|
||||
can contain an ampersand (&), \en (where n is a digit) back-references,
|
||||
or subexpression matching.
|
||||
The
|
||||
.Cm old
|
||||
string may also contain
|
||||
.Aq Dv newline
|
||||
characters.
|
||||
Any non-null character can be used as a delimiter (/ is shown here).
|
||||
Any non-null character except a backslash (\\) can be used as a delimiter
|
||||
(/ is shown here).
|
||||
Multiple
|
||||
.Fl s
|
||||
expressions can be specified.
|
||||
|
|
@ -604,9 +605,14 @@ The optional trailing
|
|||
will cause the final result of a successful substitution to be written to
|
||||
.Dv standard error
|
||||
in the following format:
|
||||
.Dl Ao "original pathname" Ac \*[Gt]\*[Gt] Ao "new pathname" Ac
|
||||
.Dl Ao "original pathname" Ac >> Ao "new pathname" Ac
|
||||
File or archive member names that substitute to the empty string
|
||||
are not selected and will be skipped.
|
||||
The substitutions are applied by default to the destination hard and symbolic
|
||||
links.
|
||||
The optional trailing
|
||||
.Cm s
|
||||
prevents the substitutions from being performed on symbolic link destinations.
|
||||
.It Fl t
|
||||
Reset the access times of any file or directory read or accessed by
|
||||
.Nm
|
||||
|
|
@ -742,6 +748,19 @@ Typical archive format restrictions include (but are not limited to):
|
|||
file pathname length, file size, link pathname length and the type of the file.
|
||||
.It Fl Fl gnu
|
||||
Recognize GNU tar extensions.
|
||||
.It Fl Fl timestamp Ar timestamp
|
||||
Store all modification times in the archive with the
|
||||
.Ar timestamp
|
||||
given instead of the actual modification time of the individual archive member
|
||||
so that repeatable builds are possible.
|
||||
The
|
||||
.Ar timestamp
|
||||
can be a
|
||||
.Pa pathname ,
|
||||
where the timestamps are derived from that file, a parseable date for
|
||||
.Xr parsedate 3
|
||||
(this option is not yet available in the tools build), or an integer value
|
||||
interpreted as the number of seconds from the Epoch.
|
||||
.It Fl Fl xz
|
||||
Use
|
||||
.Xr xz 1
|
||||
|
|
@ -958,11 +977,11 @@ Time comparisons using both file times is useful when
|
|||
is used to create a time based incremental archive (only files that were
|
||||
changed during a specified time range will be archived).
|
||||
.Pp
|
||||
A time range is made up of six different fields and each field must contain two
|
||||
digits.
|
||||
A time range is made up of seven different fields and each field must contain
|
||||
two digits.
|
||||
The format is:
|
||||
.Dl [[[[[cc]yy]mm]dd]hh]mm[\&.ss]
|
||||
Where
|
||||
where
|
||||
.Cm cc
|
||||
is the first two digits of the year (the century),
|
||||
.Cm yy
|
||||
|
|
@ -1277,7 +1296,15 @@ and
|
|||
operations are extensions to the
|
||||
.Tn POSIX
|
||||
standard.
|
||||
.Sh HISTORY
|
||||
A
|
||||
.Nm
|
||||
utility appeared in
|
||||
.Bx 4.4 .
|
||||
.Sh AUTHORS
|
||||
Keith Muller at the University of California, San Diego.
|
||||
Luke Mewburn implemented
|
||||
.An -nosplit
|
||||
.An Keith Muller
|
||||
at the University of California, San Diego.
|
||||
.An Luke Mewburn
|
||||
implemented
|
||||
.Fl M .
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: pax.c,v 1.47 2011/08/29 14:47:48 joerg Exp $ */
|
||||
/* $NetBSD: pax.c,v 1.49 2019/04/24 17:27:08 cheusov Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1992 Keith Muller.
|
||||
|
|
@ -44,23 +44,23 @@ __COPYRIGHT("@(#) Copyright (c) 1992, 1993\
|
|||
#if 0
|
||||
static char sccsid[] = "@(#)pax.c 8.2 (Berkeley) 4/18/94";
|
||||
#else
|
||||
__RCSID("$NetBSD: pax.c,v 1.47 2011/08/29 14:47:48 joerg Exp $");
|
||||
__RCSID("$NetBSD: pax.c,v 1.49 2019/04/24 17:27:08 cheusov Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/resource.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/resource.h>
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <paths.h>
|
||||
#include <signal.h>
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <paths.h>
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
#include <util.h>
|
||||
#include "pax.h"
|
||||
#include "extern.h"
|
||||
|
|
@ -453,28 +453,28 @@ gen_init(void)
|
|||
|
||||
if ((sigaction(SIGHUP, &n_hand, &o_hand) < 0) &&
|
||||
(o_hand.sa_handler == SIG_IGN) &&
|
||||
(sigaction(SIGHUP, &o_hand, &o_hand) < 0))
|
||||
(sigaction(SIGHUP, &o_hand, NULL) < 0))
|
||||
goto out;
|
||||
|
||||
if ((sigaction(SIGTERM, &n_hand, &o_hand) < 0) &&
|
||||
(o_hand.sa_handler == SIG_IGN) &&
|
||||
(sigaction(SIGTERM, &o_hand, &o_hand) < 0))
|
||||
(sigaction(SIGTERM, &o_hand, NULL) < 0))
|
||||
goto out;
|
||||
|
||||
if ((sigaction(SIGINT, &n_hand, &o_hand) < 0) &&
|
||||
(o_hand.sa_handler == SIG_IGN) &&
|
||||
(sigaction(SIGINT, &o_hand, &o_hand) < 0))
|
||||
(sigaction(SIGINT, &o_hand, NULL) < 0))
|
||||
goto out;
|
||||
|
||||
if ((sigaction(SIGQUIT, &n_hand, &o_hand) < 0) &&
|
||||
(o_hand.sa_handler == SIG_IGN) &&
|
||||
(sigaction(SIGQUIT, &o_hand, &o_hand) < 0))
|
||||
(sigaction(SIGQUIT, &o_hand, NULL) < 0))
|
||||
goto out;
|
||||
|
||||
#ifdef SIGXCPU
|
||||
if ((sigaction(SIGXCPU, &n_hand, &o_hand) < 0) &&
|
||||
(o_hand.sa_handler == SIG_IGN) &&
|
||||
(sigaction(SIGXCPU, &o_hand, &o_hand) < 0))
|
||||
(sigaction(SIGXCPU, &o_hand, NULL) < 0))
|
||||
goto out;
|
||||
#endif
|
||||
n_hand.sa_handler = SIG_IGN;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
.\" $NetBSD: tar.1,v 1.35 2015/04/11 16:22:07 wiz Exp $
|
||||
.\" $NetBSD: tar.1,v 1.39 2019/03/19 10:14:46 wiz Exp $
|
||||
.\"
|
||||
.\" Copyright (c) 1996 SigmaSoft, Th. Lockert
|
||||
.\" All rights reserved.
|
||||
|
|
@ -25,7 +25,7 @@
|
|||
.\"
|
||||
.\" OpenBSD: tar.1,v 1.28 2000/11/09 23:58:56 aaron Exp
|
||||
.\"
|
||||
.Dd April 11, 2015
|
||||
.Dd March 19, 2019
|
||||
.Dt TAR 1
|
||||
.Os
|
||||
.Sh NAME
|
||||
|
|
@ -107,10 +107,10 @@ then the archive will be processed using
|
|||
.It Fl h , Fl Fl dereference
|
||||
Follow symbolic links as if they were normal files
|
||||
or directories.
|
||||
.It Fl J, Fl Fl xz
|
||||
.It Fl J , Fl Fl xz
|
||||
Compress/decompress archive using
|
||||
.Xr xz 1 .
|
||||
.It Fl j, Fl Fl bzip2, Fl Fl bunzip2
|
||||
.It Fl j , Fl Fl bzip2 , Fl Fl bunzip2
|
||||
Use
|
||||
.Xr bzip2 1
|
||||
for compression of the archive.
|
||||
|
|
@ -170,14 +170,15 @@ As in
|
|||
.Cm old
|
||||
is a basic regular expression and
|
||||
.Cm new
|
||||
can contain an ampersand (\*[Am]), \en (where n is a digit) back-references,
|
||||
can contain an ampersand (&), \en (where n is a digit) back-references,
|
||||
or subexpression matching.
|
||||
The
|
||||
.Cm old
|
||||
string may also contain
|
||||
.Aq Dv newline
|
||||
characters.
|
||||
Any non-null character can be used as a delimiter (/ is shown here).
|
||||
Any non-null character except a backslash (\\) can be used as a delimiter
|
||||
(/ is shown here).
|
||||
Multiple
|
||||
.Fl s
|
||||
expressions can be specified.
|
||||
|
|
@ -196,7 +197,7 @@ The optional trailing
|
|||
will cause the final result of a successful substitution to be written to
|
||||
.Dv standard error
|
||||
in the following format:
|
||||
.Dl \*[Lt]original pathname\*[Gt] \*[Gt]\*[Gt] \*[Lt]new pathname\*[Gt]
|
||||
.Dl Ao "original pathname" Ac >> Ao "new pathname" Ac
|
||||
File or archive member names that substitute to the empty string
|
||||
are not selected and will be skipped.
|
||||
The substitutions are applied by default to the destination hard and symbolic
|
||||
|
|
@ -297,6 +298,19 @@ can be processed.
|
|||
Cause files of type directory being copied or archived, or archive members of
|
||||
type directory being extracted, to match only the directory file or archive
|
||||
member and not the file hierarchy rooted at the directory.
|
||||
.It Fl Fl timestamp Ar timestamp
|
||||
Store all modification times in the archive with the
|
||||
.Ar timestamp
|
||||
given instead of the actual modification time of the individual archive member
|
||||
so that repeatable builds are possible.
|
||||
The
|
||||
.Ar timestamp
|
||||
can be a
|
||||
.Pa pathname ,
|
||||
where the timestamps are derived from that file, a parseable date for
|
||||
.Xr parsedate 3
|
||||
(this option is not yet available in the tools build), or an integer value
|
||||
interpreted as the number of seconds from the Epoch.
|
||||
.El
|
||||
.Pp
|
||||
The options
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: tar.c,v 1.72 2015/06/16 22:31:08 christos Exp $ */
|
||||
/* $NetBSD: tar.c,v 1.75 2019/03/20 03:13:39 gutteridge Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1992 Keith Muller.
|
||||
|
|
@ -42,7 +42,7 @@
|
|||
#if 0
|
||||
static char sccsid[] = "@(#)tar.c 8.2 (Berkeley) 4/18/94";
|
||||
#else
|
||||
__RCSID("$NetBSD: tar.c,v 1.72 2015/06/16 22:31:08 christos Exp $");
|
||||
__RCSID("$NetBSD: tar.c,v 1.75 2019/03/20 03:13:39 gutteridge Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
|
|
@ -64,6 +64,8 @@ __RCSID("$NetBSD: tar.c,v 1.72 2015/06/16 22:31:08 christos Exp $");
|
|||
#include "extern.h"
|
||||
#include "tar.h"
|
||||
|
||||
extern struct stat tst;
|
||||
|
||||
/*
|
||||
* Routines for reading, writing and header identify of various versions of tar
|
||||
*/
|
||||
|
|
@ -349,7 +351,7 @@ tar_chksm(char *blk, int len)
|
|||
* checksum field as the sum of 8 blanks (which is pre-computed as
|
||||
* BLNKSUM).
|
||||
* ASSUMED: len is greater than CHK_OFFSET. (len is where our 0 padding
|
||||
* starts, no point in summing zero's)
|
||||
* starts, no point in summing zeros)
|
||||
*/
|
||||
pt += CHK_LEN;
|
||||
stop = blk + len;
|
||||
|
|
@ -366,7 +368,7 @@ tar_chksm(char *blk, int len)
|
|||
* tar_id()
|
||||
* determine if a block given to us is a valid tar header (and not a USTAR
|
||||
* header). We have to be on the lookout for those pesky blocks of all
|
||||
* zero's.
|
||||
* zeros.
|
||||
* Return:
|
||||
* 0 if a tar header, -1 otherwise
|
||||
*/
|
||||
|
|
@ -384,7 +386,7 @@ tar_id(char *blk, int size)
|
|||
uhd = (HD_USTAR *)blk;
|
||||
|
||||
/*
|
||||
* check for block of zero's first, a simple and fast test, then make
|
||||
* check for block of zeros first, a simple and fast test, then make
|
||||
* sure this is not a ustar header by looking for the ustar magic
|
||||
* cookie. We should use TMAGLEN, but some USTAR archive programs are
|
||||
* wrong and create archives missing the \0. Last we check the
|
||||
|
|
@ -484,6 +486,8 @@ tar_rd(ARCHD *arcn, char *buf)
|
|||
arcn->sb.st_uid = (uid_t)asc_u32(hd->uid, sizeof(hd->uid), OCT);
|
||||
arcn->sb.st_gid = (gid_t)asc_u32(hd->gid, sizeof(hd->gid), OCT);
|
||||
arcn->sb.st_size = (off_t)ASC_OFFT(hd->size, sizeof(hd->size), OCT);
|
||||
if (arcn->sb.st_size == -1)
|
||||
return -1;
|
||||
arcn->sb.st_mtime = (time_t)(int32_t)asc_u32(hd->mtime, sizeof(hd->mtime), OCT);
|
||||
arcn->sb.st_ctime = arcn->sb.st_atime = arcn->sb.st_mtime;
|
||||
|
||||
|
|
@ -587,6 +591,7 @@ tar_wr(ARCHD *arcn)
|
|||
{
|
||||
HD_TAR *hd;
|
||||
int len;
|
||||
uintmax_t mtime;
|
||||
char hdblk[sizeof(HD_TAR)];
|
||||
|
||||
/*
|
||||
|
|
@ -695,10 +700,11 @@ tar_wr(ARCHD *arcn)
|
|||
/*
|
||||
* copy those fields that are independent of the type
|
||||
*/
|
||||
mtime = tst.st_ino ? tst.st_mtime : arcn->sb.st_mtime;
|
||||
if (u32_oct((uintmax_t)arcn->sb.st_mode, hd->mode, sizeof(hd->mode), 0) ||
|
||||
u32_oct((uintmax_t)arcn->sb.st_uid, hd->uid, sizeof(hd->uid), 0) ||
|
||||
u32_oct((uintmax_t)arcn->sb.st_gid, hd->gid, sizeof(hd->gid), 0) ||
|
||||
u32_oct((uintmax_t)arcn->sb.st_mtime, hd->mtime, sizeof(hd->mtime), 1))
|
||||
u32_oct(mtime, hd->mtime, sizeof(hd->mtime), 1))
|
||||
goto out;
|
||||
|
||||
/*
|
||||
|
|
@ -763,7 +769,7 @@ ustar_stwr(void)
|
|||
/*
|
||||
* ustar_id()
|
||||
* determine if a block given to us is a valid ustar header. We have to
|
||||
* be on the lookout for those pesky blocks of all zero's
|
||||
* be on the lookout for those pesky blocks of all zeros
|
||||
* Return:
|
||||
* 0 if a ustar header, -1 otherwise
|
||||
*/
|
||||
|
|
@ -778,7 +784,7 @@ ustar_id(char *blk, int size)
|
|||
hd = (HD_USTAR *)blk;
|
||||
|
||||
/*
|
||||
* check for block of zero's first, a simple and fast test then check
|
||||
* check for block of zeros first, a simple and fast test then check
|
||||
* ustar magic cookie. We should use TMAGLEN, but some USTAR archive
|
||||
* programs are fouled up and create archives missing the \0. Last we
|
||||
* check the checksum. If ok we have to assume it is a valid header.
|
||||
|
|
@ -856,6 +862,8 @@ ustar_rd(ARCHD *arcn, char *buf)
|
|||
arcn->sb.st_mode = (mode_t)(asc_u32(hd->mode, sizeof(hd->mode), OCT) &
|
||||
0xfff);
|
||||
arcn->sb.st_size = (off_t)ASC_OFFT(hd->size, sizeof(hd->size), OCT);
|
||||
if (arcn->sb.st_size == -1)
|
||||
return -1;
|
||||
arcn->sb.st_mtime = (time_t)(int32_t)asc_u32(hd->mtime, sizeof(hd->mtime), OCT);
|
||||
arcn->sb.st_ctime = arcn->sb.st_atime = arcn->sb.st_mtime;
|
||||
|
||||
|
|
@ -1046,6 +1054,7 @@ ustar_wr(ARCHD *arcn)
|
|||
{
|
||||
HD_USTAR *hd;
|
||||
char *pt;
|
||||
uintmax_t mtime;
|
||||
char hdblk[sizeof(HD_USTAR)];
|
||||
const char *user, *group;
|
||||
|
||||
|
|
@ -1210,7 +1219,8 @@ ustar_wr(ARCHD *arcn)
|
|||
return size_err("UID", arcn);
|
||||
if (u32_oct((uintmax_t)arcn->sb.st_gid, hd->gid, sizeof(hd->gid), 3))
|
||||
return size_err("GID", arcn);
|
||||
if (u32_oct((uintmax_t)arcn->sb.st_mtime,hd->mtime,sizeof(hd->mtime),3))
|
||||
mtime = tst.st_ino ? tst.st_mtime : arcn->sb.st_mtime;
|
||||
if (u32_oct(mtime, hd->mtime, sizeof(hd->mtime), 3))
|
||||
return size_err("MTIME", arcn);
|
||||
user = user_from_uid(arcn->sb.st_uid, 1);
|
||||
group = group_from_gid(arcn->sb.st_gid, 1);
|
||||
|
|
@ -1369,7 +1379,7 @@ tar_gnutar_exclude_one(const char *line, size_t len)
|
|||
}
|
||||
|
||||
/*
|
||||
* deal with GNU tar -X/--exclude-from & --exclude switchs. basically,
|
||||
* deal with GNU tar -X/--exclude-from & --exclude switches. basically,
|
||||
* we go through each line of the file, building a string from the "glob"
|
||||
* lines in the file into RE lines, of the form `/^RE$//', which we pass
|
||||
* to rep_add(), which will add a empty replacement (exclusion), for the
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user