diff options
-rw-r--r-- | usr.bin/tar/bsdtar.c | 3 | ||||
-rw-r--r-- | usr.bin/tar/bsdtar.h | 2 | ||||
-rw-r--r-- | usr.bin/tar/cmdline.c | 1 | ||||
-rw-r--r-- | usr.bin/tar/read.c | 6 | ||||
-rw-r--r-- | usr.bin/tar/write.c | 17 |
5 files changed, 29 insertions, 0 deletions
diff --git a/usr.bin/tar/bsdtar.c b/usr.bin/tar/bsdtar.c index c982061..e90afbc 100644 --- a/usr.bin/tar/bsdtar.c +++ b/usr.bin/tar/bsdtar.c @@ -212,6 +212,9 @@ main(int argc, char **argv) case OPTION_FORMAT: /* GNU tar, others */ bsdtar->create_format = bsdtar->optarg; break; + case OPTION_FORMAT_OPTIONS: + bsdtar->option_format_options = bsdtar->optarg; + break; case 'f': /* SUSv2 */ bsdtar->filename = bsdtar->optarg; if (strcmp(bsdtar->filename, "-") == 0) diff --git a/usr.bin/tar/bsdtar.h b/usr.bin/tar/bsdtar.h index 98b365b..1e6673a 100644 --- a/usr.bin/tar/bsdtar.h +++ b/usr.bin/tar/bsdtar.h @@ -60,6 +60,7 @@ struct bsdtar { char option_chroot; /* --chroot */ char option_dont_traverse_mounts; /* --one-file-system */ char option_fast_read; /* --fast-read */ + const char *option_format_options; /* --format-options */ char option_honor_nodump; /* --nodump */ char option_interactive; /* -w */ char option_no_owner; /* -o */ @@ -110,6 +111,7 @@ enum { OPTION_CHROOT, OPTION_EXCLUDE, OPTION_FORMAT, + OPTION_FORMAT_OPTIONS, OPTION_HELP, OPTION_INCLUDE, OPTION_KEEP_NEWER_FILES, diff --git a/usr.bin/tar/cmdline.c b/usr.bin/tar/cmdline.c index 09818a3..ad8b487 100644 --- a/usr.bin/tar/cmdline.c +++ b/usr.bin/tar/cmdline.c @@ -83,6 +83,7 @@ static struct option { { "file", 1, 'f' }, { "files-from", 1, 'T' }, { "format", 1, OPTION_FORMAT }, + { "format-options", 1, OPTION_FORMAT_OPTIONS }, { "gunzip", 0, 'z' }, { "gzip", 0, 'z' }, { "help", 0, OPTION_HELP }, diff --git a/usr.bin/tar/read.c b/usr.bin/tar/read.c index 3aa164f..054476b 100644 --- a/usr.bin/tar/read.c +++ b/usr.bin/tar/read.c @@ -132,6 +132,12 @@ read_archive(struct bsdtar *bsdtar, char mode) DEFAULT_BYTES_PER_BLOCK)) bsdtar_errc(bsdtar, 1, 0, "Error opening archive: %s", archive_error_string(a)); + if (bsdtar->option_format_options != NULL) { + r = archive_read_set_options(a, bsdtar->option_format_options); + if (r != ARCHIVE_OK) + bsdtar_errc(bsdtar, 1, 0, "Error archive options: %s", + archive_error_string(a)); + } do_chdir(bsdtar); diff --git a/usr.bin/tar/write.c b/usr.bin/tar/write.c index dd53453..6f89286 100644 --- a/usr.bin/tar/write.c +++ b/usr.bin/tar/write.c @@ -208,6 +208,12 @@ tar_mode_c(struct bsdtar *bsdtar) if (r != ARCHIVE_OK) bsdtar_errc(bsdtar, 1, 0, archive_error_string(a)); + if (bsdtar->option_format_options != NULL) { + r = archive_write_set_options(a, bsdtar->option_format_options); + if (r != ARCHIVE_OK) + bsdtar_errc(bsdtar, 1, 0, archive_error_string(a)); + } + write_archive(a, bsdtar); } @@ -294,6 +300,11 @@ tar_mode_r(struct bsdtar *bsdtar) } lseek(bsdtar->fd, end_offset, SEEK_SET); /* XXX check return val XXX */ archive_write_open_fd(a, bsdtar->fd); /* XXX check return val XXX */ + if (bsdtar->option_format_options != NULL) { + r = archive_write_set_options(a, bsdtar->option_format_options); + if (r != ARCHIVE_OK) + bsdtar_errc(bsdtar, 1, 0, archive_error_string(a)); + } write_archive(a, bsdtar); /* XXX check return val XXX */ @@ -310,6 +321,7 @@ tar_mode_u(struct bsdtar *bsdtar) int format; struct archive_dir_entry *p; struct archive_dir archive_dir; + int r; bsdtar->archive_dir = &archive_dir; memset(&archive_dir, 0, sizeof(archive_dir)); @@ -374,6 +386,11 @@ tar_mode_u(struct bsdtar *bsdtar) lseek(bsdtar->fd, end_offset, SEEK_SET); ftruncate(bsdtar->fd, end_offset); archive_write_open_fd(a, bsdtar->fd); + if (bsdtar->option_format_options != NULL) { + r = archive_write_set_options(a, bsdtar->option_format_options); + if (r != ARCHIVE_OK) + bsdtar_errc(bsdtar, 1, 0, archive_error_string(a)); + } write_archive(a, bsdtar); |