From 4aa7016df78090405b37008a7bffb7e095c1ee5c Mon Sep 17 00:00:00 2001 From: tv Date: Sun, 7 Feb 1999 00:56:55 +0000 Subject: [PATCH] Fix opt_add to take const char * so that it can be passed a constant string legally (it strdup()s the argument). How pax-as-tar `-o' ever worked without a coredump is beyond me... Also modify pax-as-tar `-o' to do three things, which depend on the create/extract mode: - write V7 format archives (which, though part of GNU tar, actually goes along with the following point--after all, old pax-as-tar created V7 archives by default); - write archives with "write_opt=nodir", as pax already did, and as specified by 4.2BSD; - extract archives with owner/group set to invoking user, as specified by SUS. --- bin/pax/options.c | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/bin/pax/options.c b/bin/pax/options.c index cbbc7c171ee2..840fa7100c49 100644 --- a/bin/pax/options.c +++ b/bin/pax/options.c @@ -1,4 +1,4 @@ -/* $NetBSD: options.c,v 1.17 1999/02/02 23:42:41 tv Exp $ */ +/* $NetBSD: options.c,v 1.18 1999/02/07 00:56:55 tv 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.17 1999/02/02 23:42:41 tv Exp $"); +__RCSID("$NetBSD: options.c,v 1.18 1999/02/07 00:56:55 tv Exp $"); #endif #endif /* not lint */ @@ -70,6 +70,7 @@ __RCSID("$NetBSD: options.c,v 1.17 1999/02/02 23:42:41 tv Exp $"); int cpio_mode; /* set if we are in cpio mode */ char *chdir_dir; /* directory to chdir to before operating */ +static int nopids; /* tar mode: suppress "pids" for -p option */ static char *flgch = FLGCH; /* list of all possible flags (pax) */ static OPLIST *ophead = NULL; /* head for format specific options -x */ static OPLIST *optail = NULL; /* option tail */ @@ -132,7 +133,7 @@ FSUB fsub[] = { #define F_CPIO 1 /* old octal character cpio format */ #define F_SV4CPIO 2 /* SVR4 hex cpio format */ #define F_SV4CRC 3 /* SVR4 hex with crc cpio format */ -#define F_TAR 4 /* format when called as tar */ +#define F_TAR 4 /* old V7 UNIX tar format */ #define F_USTAR 5 /* ustar format */ #define DEFLT F_USTAR /* default write format from list above */ @@ -670,16 +671,30 @@ tar_options(argc, argv) pmtime = 0; break; case 'o': - /* Change output type to V7 tar. */ - if (act == ARCHIVE) + /* + * This option does several things based on whether + * this is a create or extract operation. + */ + if (act == ARCHIVE) { + /* 4.2BSD: don't add directory entries. */ + if (opt_add("write_opt=nodir") < 0) + tar_usage(); + + /* GNU tar: write V7 format archives. */ frmt = &(fsub[F_TAR]); + } else { + /* SUS: don't preserve owner/group. */ + pids = 0; + nopids = 1; + } break; case 'p': /* * preserve user id, group id, file * mode, access/modification times */ - pids = 1; + if (!nopids) + pids = 1; pmode = 1; patime = 1; pmtime = 1; @@ -1197,11 +1212,11 @@ bad_opt() #if __STDC__ int -opt_add(char *str) +opt_add(const char *str) #else int opt_add(str) - char *str; + const char *str; #endif { OPLIST *opt; @@ -1213,7 +1228,7 @@ opt_add(str) tty_warn(0, "Invalid option name"); return(-1); } - frpt = endpt = str; + frpt = endpt = strdup(str); /* * break into name and values pieces and stuff each one into a