aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--toys/pending/xzcat.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/toys/pending/xzcat.c b/toys/pending/xzcat.c
index 42d5ba37..a90a4a90 100644
--- a/toys/pending/xzcat.c
+++ b/toys/pending/xzcat.c
@@ -12,9 +12,9 @@ config XZCAT
bool "xzcat"
default n
help
- usage: xzcat < file.xz
+ usage: xzcat [filename...]
- Read xz-compressed file from stdin and write decompressed file to stdout.
+ Decompress listed files to stdout. Use stdin if no files listed.
*/
#define FOR_xzcat
@@ -224,7 +224,7 @@ static uint64_t xz_crc64_table[256];
static uint8_t in[BUFSIZ];
static uint8_t out[BUFSIZ];
-void xzcat_main(void)
+void do_xzcat(int fd, char *name)
{
struct xz_buf b;
struct xz_dec *s;
@@ -265,7 +265,7 @@ void xzcat_main(void)
for (;;) {
if (b.in_pos == b.in_size) {
- b.in_size = fread(in, 1, sizeof(in), stdin);
+ b.in_size = read(fd, in, sizeof(in));
b.in_pos = 0;
}
@@ -286,8 +286,7 @@ void xzcat_main(void)
if (ret == XZ_UNSUPPORTED_CHECK)
continue;
- if (fwrite(out, 1, b.out_pos, stdout) != b.out_pos
- || fclose(stdout)) {
+ if (fwrite(out, 1, b.out_pos, stdout) != b.out_pos) {
msg = "Write error\n";
goto error;
}
@@ -329,6 +328,11 @@ error:
error_exit("%s", msg);
}
+void xzcat_main(void)
+{
+ loopfiles(toys.optargs, do_xzcat);
+}
+
// BEGIN xz_private.h