From: Michihiro NAKAJIMA Date: Mon, 26 Jan 2009 14:36:09 +0000 (-0500) Subject: Add support "--format-options" option to bsdtar to use X-Git-Tag: v2.7.0~401 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f11ea26c9aaa5916f9be6ed0567024f7f22e91c6;p=thirdparty%2Flibarchive.git Add support "--format-options" option to bsdtar to use format option frame work. SVN-Revision: 492 --- diff --git a/tar/bsdtar.c b/tar/bsdtar.c index 33a044baa..65975dff9 100644 --- a/tar/bsdtar.c +++ b/tar/bsdtar.c @@ -194,6 +194,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/tar/bsdtar.h b/tar/bsdtar.h index 9222b60b4..a427b9a39 100644 --- a/tar/bsdtar.h +++ b/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/tar/cmdline.c b/tar/cmdline.c index 09818a31a..ad8b487a6 100644 --- a/tar/cmdline.c +++ b/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/tar/read.c b/tar/read.c index a8cb14ab3..c4b6e938b 100644 --- a/tar/read.c +++ b/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/tar/write.c b/tar/write.c index bd16a8b0a..6bb317cd2 100644 --- a/tar/write.c +++ b/tar/write.c @@ -201,6 +201,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); } @@ -287,6 +293,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 */ @@ -303,6 +314,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)); @@ -367,6 +379,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);