aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMingye Wang <arthur200126@gmail.com>2023-06-27 16:54:12 +0000
committerWarner Losh <imp@FreeBSD.org>2023-06-27 16:55:26 +0000
commita227908571da056f66abb7263f965331303bf02f (patch)
treefbc6aa4e25dcc0c219415a48658465ccdf95ebb9
parent8edb6fb572f29578877fdac3c30f718e589a0360 (diff)
downloadsrc-a227908571da056f66abb7263f965331303bf02f.tar.gz
src-a227908571da056f66abb7263f965331303bf02f.zip
unzip: add -O/-I encoding support
These are for compatibility with the info-zip version of unzip. PR: 271657 Reviewed by: imp Pull Request: https://github.com/freebsd/freebsd-src/pull/752
-rw-r--r--usr.bin/unzip/unzip.16
-rw-r--r--usr.bin/unzip/unzip.c11
2 files changed, 14 insertions, 3 deletions
diff --git a/usr.bin/unzip/unzip.1 b/usr.bin/unzip/unzip.1
index 82e2c3a60ea0..436f1a928ce9 100644
--- a/usr.bin/unzip/unzip.1
+++ b/usr.bin/unzip/unzip.1
@@ -25,7 +25,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd January 2, 2023
+.Dd June 27, 2023
.Dt UNZIP 1
.Os
.Sh NAME
@@ -34,6 +34,7 @@
.Sh SYNOPSIS
.Nm
.Op Fl aCcfjLlnopqtuvy
+.Op { Fl O | Fl I No } Ar encoding
.Op Fl d Ar dir
.Op Fl x Ar pattern
.Op Fl P Ar password
@@ -62,6 +63,9 @@ Update existing.
Extract only files from the zipfile if a file with the same name
already exists on disk and is older than the former.
Otherwise, the file is silently skipped.
+.It Fl I Ar encoding
+.It Fl O Ar encoding
+Convert filenames from the specified encoding.
.It Fl j
Ignore directories stored in the zipfile; instead, extract all files
directly into the extraction directory.
diff --git a/usr.bin/unzip/unzip.c b/usr.bin/unzip/unzip.c
index 578eaca9d772..1200aa53e7e3 100644
--- a/usr.bin/unzip/unzip.c
+++ b/usr.bin/unzip/unzip.c
@@ -59,6 +59,7 @@ static int C_opt; /* match case-insensitively */
static int c_opt; /* extract to stdout */
static const char *d_arg; /* directory */
static int f_opt; /* update existing files only */
+static char *O_arg; /* encoding */
static int j_opt; /* junk directories */
static int L_opt; /* lowercase names */
static int n_opt; /* never overwrite */
@@ -917,6 +918,9 @@ unzip(const char *fn)
ac(archive_read_support_format_zip(a));
+ if (O_arg)
+ ac(archive_read_set_format_option(a, "zip", "hdrcharset", O_arg));
+
if (P_arg)
archive_read_add_passphrase(a, P_arg);
else
@@ -999,7 +1003,7 @@ usage(void)
{
fprintf(stderr,
-"Usage: unzip [-aCcfjLlnopqtuvyZ1] [-d dir] [-x pattern] [-P password] zipfile\n"
+"Usage: unzip [-aCcfjLlnopqtuvyZ1] [{-O|-I} encoding] [-d dir] [-x pattern] [-P password] zipfile\n"
" [member ...]\n");
exit(EXIT_FAILURE);
}
@@ -1010,7 +1014,7 @@ getopts(int argc, char *argv[])
int opt;
optreset = optind = 1;
- while ((opt = getopt(argc, argv, "aCcd:fjLlnopP:qtuvx:yZ1")) != -1)
+ while ((opt = getopt(argc, argv, "aCcd:fI:jLlnO:opP:qtuvx:yZ1")) != -1)
switch (opt) {
case '1':
Z1_opt = 1;
@@ -1030,6 +1034,9 @@ getopts(int argc, char *argv[])
case 'f':
f_opt = 1;
break;
+ case 'I':
+ case 'O':
+ O_arg = optarg;
case 'j':
j_opt = 1;
break;