From 849a3f9c280da219ae0b12e823f8e41a5270ad8c Mon Sep 17 00:00:00 2001 From: tholo Date: Sun, 2 Mar 1997 09:46:40 +0000 Subject: [PATCH] More complete cpio(1) emulation --- bin/pax/cpio.1 | 5 +---- bin/pax/extern.h | 3 ++- bin/pax/file_subs.c | 10 +++++----- bin/pax/options.c | 47 +++++++++++++++++++++++++++++++++++++++++---- bin/pax/pax.c | 5 +++-- 5 files changed, 54 insertions(+), 16 deletions(-) diff --git a/bin/pax/cpio.1 b/bin/pax/cpio.1 index f6af9140ece..75ca1ce6f7d 100644 --- a/bin/pax/cpio.1 +++ b/bin/pax/cpio.1 @@ -27,7 +27,7 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.\" $OpenBSD: cpio.1,v 1.1 1997/02/20 06:54:33 tholo Exp $ +.\" $OpenBSD: cpio.1,v 1.2 1997/03/02 09:46:40 tholo Exp $ .\" .Dd February 16, 1997 .Dt CPIO 1 @@ -261,9 +261,6 @@ specific archive format specification. .Xr pax 1 , .Xr tar 1 .Sh BUGS -The -.Fl d -option is the default and cannot be turned off. The .Fl s and diff --git a/bin/pax/extern.h b/bin/pax/extern.h index 1bedec50087..2e3fea87f98 100644 --- a/bin/pax/extern.h +++ b/bin/pax/extern.h @@ -1,4 +1,4 @@ -/* $OpenBSD: extern.h,v 1.10 1997/02/27 23:32:57 michaels Exp $ */ +/* $OpenBSD: extern.h,v 1.11 1997/03/02 09:46:43 tholo Exp $ */ /* $NetBSD: extern.h,v 1.5 1996/03/26 23:54:16 mrg Exp $ */ /*- @@ -229,6 +229,7 @@ extern int Zflag; extern int vfpart; extern int patime; extern int pmtime; +extern int nodirs; extern int pmode; extern int pids; extern int exit_val; diff --git a/bin/pax/file_subs.c b/bin/pax/file_subs.c index 6b9e80607d8..9828d8cf8dc 100644 --- a/bin/pax/file_subs.c +++ b/bin/pax/file_subs.c @@ -1,4 +1,4 @@ -/* $OpenBSD: file_subs.c,v 1.4 1997/01/26 10:33:22 downsj Exp $ */ +/* $OpenBSD: file_subs.c,v 1.5 1997/03/02 09:46:45 tholo Exp $ */ /* $NetBSD: file_subs.c,v 1.4 1995/03/21 09:07:18 cgd Exp $ */ /*- @@ -42,7 +42,7 @@ #if 0 static char sccsid[] = "@(#)file_subs.c 8.1 (Berkeley) 5/31/93"; #else -static char rcsid[] = "$OpenBSD: file_subs.c,v 1.4 1997/01/26 10:33:22 downsj Exp $"; +static char rcsid[] = "$OpenBSD: file_subs.c,v 1.5 1997/03/02 09:46:45 tholo Exp $"; #endif #endif /* not lint */ @@ -126,7 +126,7 @@ file_creat(arcn) file_mode)) >= 0) break; oerrno = errno; - if (chk_path(arcn->name,arcn->sb.st_uid,arcn->sb.st_gid) < 0) { + if (nodirs || chk_path(arcn->name,arcn->sb.st_uid,arcn->sb.st_gid) < 0) { syswarn(1, oerrno, "Unable to create %s", arcn->name); return(-1); } @@ -360,7 +360,7 @@ mk_link(to, to_sb, from, ign) if (link(to, from) == 0) break; oerrno = errno; - if (chk_path(from, to_sb->st_uid, to_sb->st_gid) == 0) + if (!nodirs && chk_path(from, to_sb->st_uid, to_sb->st_gid) == 0) continue; if (!ign) { syswarn(1, oerrno, "Could not link to %s from %s", to, @@ -468,7 +468,7 @@ node_creat(arcn) if (++pass <= 1) continue; - if (chk_path(arcn->name,arcn->sb.st_uid,arcn->sb.st_gid) < 0) { + if (nodirs || chk_path(arcn->name,arcn->sb.st_uid,arcn->sb.st_gid) < 0) { syswarn(1, oerrno, "Could not create: %s", arcn->name); return(-1); } diff --git a/bin/pax/options.c b/bin/pax/options.c index 513af6962e8..59f9059bd70 100644 --- a/bin/pax/options.c +++ b/bin/pax/options.c @@ -1,4 +1,4 @@ -/* $OpenBSD: options.c,v 1.15 1997/02/27 23:32:58 michaels Exp $ */ +/* $OpenBSD: options.c,v 1.16 1997/03/02 09:46:47 tholo Exp $ */ /* $NetBSD: options.c,v 1.6 1996/03/26 23:54:18 mrg Exp $ */ /*- @@ -42,7 +42,7 @@ #if 0 static char sccsid[] = "@(#)options.c 8.2 (Berkeley) 4/18/94"; #else -static char rcsid[] = "$OpenBSD: options.c,v 1.15 1997/02/27 23:32:58 michaels Exp $"; +static char rcsid[] = "$OpenBSD: options.c,v 1.16 1997/03/02 09:46:47 tholo Exp $"; #endif #endif /* not lint */ @@ -849,6 +849,39 @@ tar_options(argc, argv) } } +int +mkpath(path) + char *path; +{ + struct stat sb; + register char *slash; + int done = 0; + + slash = path; + + while (!done) { + slash += strspn(slash, "/"); + slash += strcspn(slash, "/"); + + done = (*slash == '\0'); + *slash = '\0'; + + if (stat(path, &sb)) { + if (errno != ENOENT || mkdir(path, 0777)) { + paxwarn(1, "%s", path); + return (-1); + } + } else if (!S_ISDIR(sb.st_mode)) { + syswarn(1, ENOTDIR, "%s", path); + return (-1); + } + + if (!done) + *slash = '/'; + } + + return (0); +} /* * cpio_options() * look at the user specified flags. set globals as required and check if @@ -874,9 +907,11 @@ cpio_options(argc, argv) kflag = 1; pids = 1; pmode = 1; + pmtime = 0; arcname = NULL; dflag = 1; act = -1; + nodirs = 1; while ((c=getopt(argc,argv,"abcdfiklmoprstuvzABC:E:F:H:I:LO:SZ6")) != EOF) switch (c) { case 'a': @@ -900,6 +935,7 @@ cpio_options(argc, argv) /* * create directories as needed */ + nodirs = 0; break; case 'f': /* @@ -1081,12 +1117,15 @@ cpio_options(argc, argv) cpio_usage(); break; case COPY: - if (optind >= argc) { + if (*argv == (char *)NULL) { paxwarn(0, "Destination directory was not supplied"); cpio_usage(); } + dirptr = *argv; + if (mkpath(dirptr) < 0) + cpio_usage(); --argc; - dirptr = argv[argc]; + ++argv; /* FALL THROUGH */ case ARCHIVE: case APPND: diff --git a/bin/pax/pax.c b/bin/pax/pax.c index 2f0c5a6be8e..1fd965a1aff 100644 --- a/bin/pax/pax.c +++ b/bin/pax/pax.c @@ -1,4 +1,4 @@ -/* $OpenBSD: pax.c,v 1.5 1996/10/27 06:45:13 downsj Exp $ */ +/* $OpenBSD: pax.c,v 1.6 1997/03/02 09:46:49 tholo Exp $ */ /* $NetBSD: pax.c,v 1.5 1996/03/26 23:54:20 mrg Exp $ */ /*- @@ -48,7 +48,7 @@ static char copyright[] = #if 0 static char sccsid[] = "@(#)pax.c 8.2 (Berkeley) 4/18/94"; #else -static char rcsid[] = "$OpenBSD: pax.c,v 1.5 1996/10/27 06:45:13 downsj Exp $"; +static char rcsid[] = "$OpenBSD: pax.c,v 1.6 1997/03/02 09:46:49 tholo Exp $"; #endif #endif /* not lint */ @@ -94,6 +94,7 @@ int Zflag; /* same as uflg except after name mode */ int vfpart; /* is partial verbose output in progress */ int patime = 1; /* preserve file access time */ int pmtime = 1; /* preserve file modification times */ +int nodirs; /* do not create directories as needed */ int pmode; /* preserve file mode bits */ int pids; /* preserve file uid/gid */ int exit_val; /* exit value */ -- 2.20.1