*: 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>
This commit is contained in:
Denys Vlasenko
2010-05-30 04:18:13 +02:00
parent fb6c76cb6e
commit 6948f210ed
5 changed files with 46 additions and 25 deletions

View File

@@ -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;