summaryrefslogtreecommitdiffhomepage
path: root/archival/libunarchive
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2010-05-30 04:18:13 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2010-05-30 04:18:13 +0200
commit6948f210ed443f8153e0ba751e77bec8a0c6c8d4 (patch)
tree134443f225a788cbb4fda7b4713ee2bc535fb126 /archival/libunarchive
parentfb6c76cb6eaade5693b7e99c33846c902689f1db (diff)
*: teach tar et. al. to understand .xz by heart
function old new delta unpack_xz_stream - 4126 +4126 setup_unzip_on_fd 80 150 +70 open_zipped 113 131 +18 unpack_unxz 5 12 +7 send_tree 360 353 -7 unpack_xz_stream_stdin 3953 - -3953 ------------------------------------------------------------------------------ (add/remove: 1/1 grow/shrink: 3/1 up/down: 4221/-3960) Total: 261 bytes Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'archival/libunarchive')
-rw-r--r--archival/libunarchive/decompress_unxz.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/archival/libunarchive/decompress_unxz.c b/archival/libunarchive/decompress_unxz.c
index 0ae789160..9edc2461a 100644
--- a/archival/libunarchive/decompress_unxz.c
+++ b/archival/libunarchive/decompress_unxz.c
@@ -3,7 +3,7 @@
* by Lasse Collin <lasse.collin@tukaani.org>
* and Igor Pavlov <http://7-zip.org/>
*
- * See README file in unxzbz/ directory for more information.
+ * See README file in unxz/ directory for more information.
*
* This file is:
* Copyright (C) 2010 Denys Vlasenko <vda.linux@googlemail.com>
@@ -48,7 +48,7 @@ static uint32_t xz_crc32(uint32_t *crc32_table,
#include "unxz/xz_stream.h"
IF_DESKTOP(long long) int FAST_FUNC
-unpack_xz_stream_stdin(void)
+unpack_xz_stream(int src_fd, int dst_fd)
{
struct xz_buf iobuf;
struct xz_dec *state;
@@ -79,7 +79,7 @@ unpack_xz_stream_stdin(void)
iobuf.in_pos = 0;
rd = IN_SIZE - insz;
if (rd) {
- rd = safe_read(STDIN_FILENO, membuf + insz, rd);
+ rd = safe_read(src_fd, membuf + insz, rd);
if (rd < 0) {
bb_error_msg("read error");
total = -1;
@@ -94,10 +94,11 @@ unpack_xz_stream_stdin(void)
// iobuf.in_pos, iobuf.in_size, iobuf.out_pos, iobuf.out_size, r);
outpos = iobuf.out_pos;
if (outpos) {
- xwrite(STDOUT_FILENO, iobuf.out, outpos);
+ xwrite(dst_fd, iobuf.out, outpos);
IF_DESKTOP(total += outpos;)
}
if (r == XZ_STREAM_END
+ /* this happens even with well-formed files: */
|| (r == XZ_BUF_ERROR && insz == 0 && outpos == 0)
) {
break;