Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/usr.bin/unzip Add support for -c, make the output of -l/-v m...
details: https://anonhg.NetBSD.org/src/rev/f3c7eb6669e7
branches: trunk
changeset: 746887:f3c7eb6669e7
user: joerg <joerg%NetBSD.org@localhost>
date: Sat Aug 22 17:19:11 2009 +0000
description:
Add support for -c, make the output of -l/-v more similar to infozip.
diffstat:
usr.bin/unzip/unzip.1 | 8 +++++-
usr.bin/unzip/unzip.c | 71 +++++++++++++++++++++++++++++++++++---------------
2 files changed, 57 insertions(+), 22 deletions(-)
diffs (207 lines):
diff -r fb4e5171de43 -r f3c7eb6669e7 usr.bin/unzip/unzip.1
--- a/usr.bin/unzip/unzip.1 Sat Aug 22 15:16:50 2009 +0000
+++ b/usr.bin/unzip/unzip.1 Sat Aug 22 17:19:11 2009 +0000
@@ -25,7 +25,7 @@
.\" SUCH DAMAGE.
.\"
.\" $FreeBSD: revision 180125$
-.\" $NetBSD: unzip.1,v 1.3 2009/08/22 02:19:42 joerg Exp $
+.\" $NetBSD: unzip.1,v 1.4 2009/08/22 17:19:11 joerg Exp $
.\"
.Dd August 22, 2009
.Dt UNZIP 1
@@ -45,6 +45,12 @@
.It Fl a
When extracting a text file, convert DOS-style line endings to
Unix-style line endings.
+.It Fl c
+Extract to stdout/screen.
+When extracting files from the zipfile, they are written to stdout.
+This is similar to
+.Fl p ,
+but doesn't suppress normal output.
.It Fl d Ar dir
Extract files into the specified directory rather than the current
directory.
diff -r fb4e5171de43 -r f3c7eb6669e7 usr.bin/unzip/unzip.c
--- a/usr.bin/unzip/unzip.c Sat Aug 22 15:16:50 2009 +0000
+++ b/usr.bin/unzip/unzip.c Sat Aug 22 17:19:11 2009 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: unzip.c,v 1.2 2009/08/22 02:19:42 joerg Exp $ */
+/* $NetBSD: unzip.c,v 1.3 2009/08/22 17:19:11 joerg Exp $ */
/*-
* Copyright (c) 2009 Joerg Sonnenberger <joerg%NetBSD.org@localhost>
@@ -37,7 +37,7 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: unzip.c,v 1.2 2009/08/22 02:19:42 joerg Exp $");
+__RCSID("$NetBSD: unzip.c,v 1.3 2009/08/22 17:19:11 joerg Exp $");
#include <sys/queue.h>
#include <sys/stat.h>
@@ -57,17 +57,18 @@
/* command-line options */
static int a_opt; /* convert EOL */
+static int c_opt; /* extract to stoud */
static const char *d_arg; /* directory */
static int f_opt; /* update existing files only */
static int j_opt; /* junk directories */
static int L_opt; /* lowercase names */
static int n_opt; /* never overwrite */
static int o_opt; /* always overwrite */
-static int p_opt; /* extract to stdout */
+static int p_opt; /* extract to stdout, quiet */
static int q_opt; /* quiet */
static int t_opt; /* test */
static int u_opt; /* update */
-static int v_opt; /* verbose */
+static int v_opt; /* verbose/list */
/* time when unzip started */
static time_t now;
@@ -666,6 +667,9 @@
return;
}
+ if (c_opt)
+ info("x %s\n", pathname);
+
text = a_opt;
warn = 0;
cr = 0;
@@ -677,9 +681,10 @@
/* left over CR from previous buffer */
if (a_opt && cr) {
- if (len == 0 || buffer[0] != '\n')
- if (write(STDOUT_FILENO, "\r", 1) != 1)
+ if (len == 0 || buffer[0] != '\n') {
+ if (fwrite("\r", 1, 1, stderr) != 1)
error("write('%s')", pathname);
+ }
cr = 0;
}
@@ -709,7 +714,7 @@
/* simple case */
if (!a_opt || !text) {
- if (write(STDOUT_FILENO, buffer, len) != len)
+ if (fwrite(buffer, 1, len, stdout) != (size_t)len)
error("write('%s')", pathname);
continue;
}
@@ -732,7 +737,7 @@
if (q[1] == '\n')
break;
}
- if (write(STDOUT_FILENO, p, q - p) != q - p)
+ if (fwrite(p, 1, q - p, stdout) != (size_t)(q - p))
error("write('%s')", pathname);
}
}
@@ -746,27 +751,23 @@
static void
list(struct archive *a, struct archive_entry *e)
{
- static int printed_header;
char buf[20];
time_t mtime;
- if (!printed_header && !q_opt) {
- printed_header = 1;
- printf(" Length Method Size Ratio Date Time CRC-32 Name\n");
- printf("-------- ------ ------- ----- ---- ---- ------ ----\n");
- }
+ mtime = archive_entry_mtime(e);
+ strftime(buf, sizeof(buf), "%m-%d-%g %R", localtime(&mtime));
- if (v_opt == 2) {
- mtime = archive_entry_mtime(e);
- strftime(buf, sizeof(buf), "%m-%d-%g %R", localtime(&mtime));
+ if (v_opt == 1) {
+ printf(" %8ju %s %s\n",
+ (uintmax_t)archive_entry_size(e),
+ buf, archive_entry_pathname(e));
+ } else if (v_opt == 2) {
printf("%8ju Stored %7ju 0%% %s %08x %s\n",
(uintmax_t)archive_entry_size(e),
(uintmax_t)archive_entry_size(e),
buf,
0U,
archive_entry_pathname(e));
- } else {
- printf("%s\n", archive_entry_pathname(e));
}
ac(archive_read_data_skip(a));
}
@@ -807,6 +808,7 @@
struct archive *a;
struct archive_entry *e;
int fd, ret;
+ uintmax_t total_size, file_count;
if ((fd = open(fn, O_RDONLY)) < 0)
error("%s", fn);
@@ -815,6 +817,16 @@
ac(archive_read_support_format_zip(a));
ac(archive_read_open_fd(a, fd, 8192));
+ if (v_opt == 1) {
+ printf(" Length Date Time Name\n");
+ printf(" -------- ---- ---- ----\n");
+ } else if (v_opt == 2) {
+ printf(" Length Method Size Ratio Date Time CRC-32 Name\n");
+ printf("-------- ------ ------- ----- ---- ---- ------ ----\n");
+ }
+
+ total_size = 0;
+ file_count = 0;
for (;;) {
ret = archive_read_next_header(a, &e);
if (ret == ARCHIVE_EOF)
@@ -824,10 +836,24 @@
test(a, e);
else if (v_opt)
list(a, e);
- else if (p_opt)
+ else if (p_opt || c_opt)
extract_stdout(a, e);
else
extract(a, e);
+
+ total_size += archive_entry_size(e);
+ ++file_count;
+ }
+
+ if (v_opt == 1) {
+ printf(" -------- -------\n");
+ printf(" %8ju %ju file%s\n",
+ total_size, file_count, file_count != 1 ? "s" : "");
+ } else if (v_opt == 2) {
+ printf("-------- ------- --- -------\n");
+ printf("%8ju %7ju 0%% %8ju file%s\n",
+ total_size, total_size, file_count,
+ file_count != 1 ? "s" : "");
}
ac(archive_read_close(a));
@@ -853,11 +879,14 @@
int opt;
optreset = optind = 1;
- while ((opt = getopt(argc, argv, "ad:fjLlnopqtuvx:")) != -1)
+ while ((opt = getopt(argc, argv, "acd:fjLlnopqtuvx:")) != -1)
switch (opt) {
case 'a':
a_opt = 1;
break;
+ case 'c':
+ c_opt = 1;
+ break;
case 'd':
d_arg = optarg;
break;
Home |
Main Index |
Thread Index |
Old Index