summaryrefslogtreecommitdiff
path: root/archivers/libarchive/files/tar/bsdtar.c
diff options
context:
space:
mode:
Diffstat (limited to 'archivers/libarchive/files/tar/bsdtar.c')
-rw-r--r--archivers/libarchive/files/tar/bsdtar.c37
1 files changed, 31 insertions, 6 deletions
diff --git a/archivers/libarchive/files/tar/bsdtar.c b/archivers/libarchive/files/tar/bsdtar.c
index 81d9841bd94..2491dda6bca 100644
--- a/archivers/libarchive/files/tar/bsdtar.c
+++ b/archivers/libarchive/files/tar/bsdtar.c
@@ -24,7 +24,7 @@
*/
#include "bsdtar_platform.h"
-__FBSDID("$FreeBSD: src/usr.bin/tar/bsdtar.c,v 1.86 2008/03/15 05:08:21 kientzle Exp $");
+__FBSDID("$FreeBSD: src/usr.bin/tar/bsdtar.c,v 1.90 2008/05/19 18:38:01 cperciva Exp $");
#ifdef HAVE_SYS_PARAM_H
#include <sys/param.h>
@@ -118,7 +118,7 @@ static void version(void);
* non-option. Otherwise, GNU getopt() permutes the arguments and
* screws up -C processing.
*/
-static const char *tar_opts = "+Bb:C:cf:HhI:jkLlmnOoPprtT:UuvW:wX:xyZz";
+static const char *tar_opts = "+Bb:C:cf:HhI:jkLlmnOoPprts:ST:UuvW:wX:xyZz";
/*
* Most of these long options are deliberately not documented. They
@@ -142,6 +142,7 @@ enum {
OPTION_FORMAT,
OPTION_HELP,
OPTION_INCLUDE,
+ OPTION_KEEP_NEWER_FILES,
OPTION_NEWER_CTIME,
OPTION_NEWER_CTIME_THAN,
OPTION_NEWER_MTIME,
@@ -150,6 +151,7 @@ enum {
OPTION_NO_SAME_OWNER,
OPTION_NO_SAME_PERMISSIONS,
OPTION_NULL,
+ OPTION_NUMERIC_OWNER,
OPTION_ONE_FILE_SYSTEM,
OPTION_POSIX,
OPTION_STRIP_COMPONENTS,
@@ -190,6 +192,7 @@ static const struct option tar_longopts[] = {
{ "include", required_argument, NULL, OPTION_INCLUDE },
{ "interactive", no_argument, NULL, 'w' },
{ "insecure", no_argument, NULL, 'P' },
+ { "keep-newer-files", no_argument, NULL, OPTION_KEEP_NEWER_FILES },
{ "keep-old-files", no_argument, NULL, 'k' },
{ "list", no_argument, NULL, 't' },
{ "modification-time", no_argument, NULL, 'm' },
@@ -205,6 +208,7 @@ static const struct option tar_longopts[] = {
{ "no-same-owner", no_argument, NULL, OPTION_NO_SAME_OWNER },
{ "no-same-permissions",no_argument, NULL, OPTION_NO_SAME_PERMISSIONS },
{ "null", no_argument, NULL, OPTION_NULL },
+ { "numeric-owner", no_argument, NULL, OPTION_NUMERIC_OWNER },
{ "one-file-system", no_argument, NULL, OPTION_ONE_FILE_SYSTEM },
{ "posix", no_argument, NULL, OPTION_POSIX },
{ "preserve-permissions", no_argument, NULL, 'p' },
@@ -392,6 +396,9 @@ main(int argc, char **argv)
case 'k': /* GNU tar */
bsdtar->extract_flags |= ARCHIVE_EXTRACT_NO_OVERWRITE;
break;
+ case OPTION_KEEP_NEWER_FILES: /* GNU tar */
+ bsdtar->extract_flags |= ARCHIVE_EXTRACT_NO_OVERWRITE_NEWER;
+ break;
case 'L': /* BSD convention */
bsdtar->symlink_mode = 'L';
break;
@@ -455,6 +462,9 @@ main(int argc, char **argv)
case OPTION_NULL: /* GNU tar */
bsdtar->option_null++;
break;
+ case OPTION_NUMERIC_OWNER: /* GNU tar */
+ bsdtar->option_numeric_owner++;
+ break;
case 'O': /* GNU tar */
bsdtar->option_stdout = 1;
break;
@@ -494,6 +504,17 @@ main(int argc, char **argv)
case 'r': /* SUSv2 */
set_mode(bsdtar, opt);
break;
+ case 'S': /* NetBSD pax-as-tar */
+ bsdtar->extract_flags |= ARCHIVE_EXTRACT_SPARSE;
+ break;
+ case 's': /* NetBSD pax-as-tar */
+#if HAVE_REGEX_H
+ add_substitution(bsdtar, optarg);
+#else
+ bsdtar_warnc(bsdtar, 0, "-s is not supported by this version of bsdtar");
+ usage(bsdtar);
+#endif
+ break;
case OPTION_STRIP_COMPONENTS: /* GNU tar 1.15 */
bsdtar->strip_components = atoi(optarg);
break;
@@ -638,7 +659,7 @@ main(int argc, char **argv)
only_mode(bsdtar, buff, "cxt");
}
if (bsdtar->create_format != NULL)
- only_mode(bsdtar, "--format", "c");
+ only_mode(bsdtar, "--format", "cru");
if (bsdtar->symlink_mode != '\0') {
strcpy(buff, "-?");
buff[1] = bsdtar->symlink_mode;
@@ -669,6 +690,10 @@ main(int argc, char **argv)
}
cleanup_exclusions(bsdtar);
+#if HAVE_REGEX_H
+ cleanup_substitution(bsdtar);
+#endif
+
if (bsdtar->return_value != 0)
bsdtar_warnc(bsdtar, 0,
"Error exit delayed from previous errors.");
@@ -721,8 +746,8 @@ rewrite_argv(struct bsdtar *bsdtar, int *argc, char **src_argv,
const char *p;
char *src, *dest;
- if (src_argv[0] == NULL ||
- src_argv[1] == NULL || src_argv[1][0] == '-')
+ if (src_argv[0] == NULL || src_argv[1] == NULL ||
+ src_argv[1][0] == '-' || src_argv[1][0] == '\0')
return (src_argv);
*argc += strlen(src_argv[1]) - 1;
@@ -788,7 +813,7 @@ version(void)
printf("bsdtar %s - %s\n",
BSDTAR_VERSION_STRING,
archive_version());
- exit(1);
+ exit(0);
}
static const char *long_help_msg =