From 02c3c3842004d88207b46450dbd19f80e6596c7e Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Tue, 6 Mar 2012 16:32:06 +0100 Subject: Move seamless .Z support into unpack_gz_stream unpack_gz_stream 566 643 +77 unpack_gunzip 123 12 -111 Signed-off-by: Denys Vlasenko --- archival/Config.src | 4 ++-- archival/bbunzip.c | 24 +----------------------- archival/libarchive/decompress_gunzip.c | 18 ++++++++++++++++++ 3 files changed, 21 insertions(+), 25 deletions(-) (limited to 'archival') diff --git a/archival/Config.src b/archival/Config.src index 885cb5b..ae1afc5 100644 --- a/archival/Config.src +++ b/archival/Config.src @@ -32,10 +32,10 @@ config FEATURE_SEAMLESS_GZ Make tar, rpm, modprobe etc understand .gz data. config FEATURE_SEAMLESS_Z - bool "Make tar and gunzip understand .Z data" + bool "tar, rpm, modprobe etc understand .Z data" default n help - Make tar and gunzip understand .Z data. + Make tar, rpm, modprobe etc understand .Z data. config AR bool "ar" diff --git a/archival/bbunzip.c b/archival/bbunzip.c index 1bc04ed..94d8a81 100644 --- a/archival/bbunzip.c +++ b/archival/bbunzip.c @@ -274,29 +274,7 @@ char* FAST_FUNC make_new_name_gunzip(char *filename, const char *expected_ext UN static IF_DESKTOP(long long) int FAST_FUNC unpack_gunzip(transformer_aux_data_t *aux) { - IF_DESKTOP(long long) int status = -1; - uint16_t magic2; - -//TODO: fold below into unpack_gz_stream? Then the whole level of indirection -// unpack_FOO() -> unpack_FOO_stream can be collapsed in this module! - - aux->check_signature = 0; /* we will check it here, not in unpack_*_stream */ - - if (full_read(STDIN_FILENO, &magic2, 2) != 2) - goto bad_magic; - if (ENABLE_FEATURE_SEAMLESS_Z && magic2 == COMPRESS_MAGIC) { - status = unpack_Z_stream(aux, STDIN_FILENO, STDOUT_FILENO); - } else if (magic2 == GZIP_MAGIC) { - status = unpack_gz_stream(aux, STDIN_FILENO, STDOUT_FILENO); - } else { - bad_magic: - bb_error_msg("invalid magic"); - /* status is still == -1 */ - } - if (status < 0) { - bb_error_msg("error inflating"); - } - return status; + return unpack_gz_stream(aux, STDIN_FILENO, STDOUT_FILENO); } /* * Linux kernel build uses gzip -d -n. We accept and ignore it. diff --git a/archival/libarchive/decompress_gunzip.c b/archival/libarchive/decompress_gunzip.c index f1c9a79..66152a8 100644 --- a/archival/libarchive/decompress_gunzip.c +++ b/archival/libarchive/decompress_gunzip.c @@ -1188,8 +1188,26 @@ unpack_gz_stream(transformer_aux_data_t *aux, int src_fd, int dst_fd) IF_DESKTOP(long long) int total, n; DECLARE_STATE; +#if !ENABLE_FEATURE_SEAMLESS_Z if (check_signature16(aux, src_fd, GZIP_MAGIC)) return -1; +#else + if (aux && aux->check_signature) { + uint16_t magic2; + + if (full_read(STDIN_FILENO, &magic2, 2) != 2) { + bad_magic: + bb_error_msg("invalid magic"); + return -1; + } + if (magic2 == COMPRESS_MAGIC) { + aux->check_signature = 0; + return unpack_Z_stream(aux, src_fd, dst_fd); + } + if (magic2 != GZIP_MAGIC) + goto bad_magic; + } +#endif total = 0; -- cgit v1.1