diff options
author | Tom Ivar Helbekkmo <tih@hamartun.priv.no> | 2021-03-05 23:18:21 +0100 |
---|---|---|
committer | Tom Ivar Helbekkmo <tih@hamartun.priv.no> | 2021-03-05 23:18:21 +0100 |
commit | 6c03f55caf276fe39d519ddb2b71f7cfd6a564bd (patch) | |
tree | 4429e3fe82389a86e0817eef1ee6a62339471eff /cpio | |
parent | af6e8b5bf507ec95ede2725b906a7570d93c9ff3 (diff) | |
download | libarchive-6c03f55caf276fe39d519ddb2b71f7cfd6a564bd.tar.gz |
add support for reading and writing PWB and V7 cpio archives
Diffstat (limited to 'cpio')
-rw-r--r-- | cpio/cmdline.c | 3 | ||||
-rw-r--r-- | cpio/cpio.c | 9 | ||||
-rw-r--r-- | cpio/cpio.h | 1 |
3 files changed, 12 insertions, 1 deletions
diff --git a/cpio/cmdline.c b/cpio/cmdline.c index c8fc30ea..0ca9b4de 100644 --- a/cpio/cmdline.c +++ b/cpio/cmdline.c @@ -51,7 +51,7 @@ __FBSDID("$FreeBSD: src/usr.bin/cpio/cmdline.c,v 1.5 2008/12/06 07:30:40 kientzl /* * Short options for cpio. Please keep this sorted. */ -static const char *short_options = "0AaBC:cdE:F:f:H:hI:iJjLlmnO:opR:rtuVvW:yZz"; +static const char *short_options = "06AaBC:cdE:F:f:H:hI:iJjLlmnO:opR:rtuVvW:yZz"; /* * Long options for cpio. Please keep this sorted. @@ -86,6 +86,7 @@ static const struct option { { "pass-through", 0, 'p' }, { "preserve-modification-time", 0, 'm' }, { "preserve-owner", 0, OPTION_PRESERVE_OWNER }, + { "pwb", 0, '6' }, { "quiet", 0, OPTION_QUIET }, { "unconditional", 0, 'u' }, { "uuencode", 0, OPTION_UUENCODE }, diff --git a/cpio/cpio.c b/cpio/cpio.c index e073bae0..678d2419 100644 --- a/cpio/cpio.c +++ b/cpio/cpio.c @@ -192,6 +192,9 @@ main(int argc, char *argv[]) case '0': /* GNU convention: --null, -0 */ cpio->option_null = 1; break; + case '6': /* 6th edition (PWB) interpretation of file mode bits */ + cpio->option_pwb = 1; + break; case 'A': /* NetBSD/OpenBSD */ cpio->option_append = 1; break; @@ -583,6 +586,8 @@ mode_out(struct cpio *cpio) } if (r < ARCHIVE_WARN) lafe_errc(1, 0, "Requested filter not available"); + if (cpio->option_pwb) + cpio->format = "pwb"; r = archive_write_set_format_by_name(cpio->archive, cpio->format); if (r != ARCHIVE_OK) lafe_errc(1, 0, "%s", archive_error_string(cpio->archive)); @@ -968,6 +973,8 @@ mode_in(struct cpio *cpio) lafe_errc(1, 0, "Couldn't allocate archive object"); archive_read_support_filter_all(a); archive_read_support_format_all(a); + if (cpio->option_pwb) + archive_read_set_options(a, "pwb"); if (cpio->passphrase != NULL) r = archive_read_add_passphrase(a, cpio->passphrase); else @@ -1078,6 +1085,8 @@ mode_list(struct cpio *cpio) lafe_errc(1, 0, "Couldn't allocate archive object"); archive_read_support_filter_all(a); archive_read_support_format_all(a); + if (cpio->option_pwb) + archive_read_set_options(a, "pwb"); if (cpio->passphrase != NULL) r = archive_read_add_passphrase(a, cpio->passphrase); else diff --git a/cpio/cpio.h b/cpio/cpio.h index 8e7cc5fd..a71b6649 100644 --- a/cpio/cpio.h +++ b/cpio/cpio.h @@ -62,6 +62,7 @@ struct cpio { int option_list; /* -t */ char option_null; /* --null */ int option_numeric_uid_gid; /* -n */ + int option_pwb; /* -6 */ int option_rename; /* -r */ char *destdir; size_t destdir_len; |