aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2012-03-06 16:32:06 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2012-03-06 16:32:06 +0100
commit02c3c3842004d88207b46450dbd19f80e6596c7e (patch)
tree68890b6d081c3851b898f41bede25badc6b453fa
parent8a6a2f9c9c214b94bd945acd97ac8b28c25e194e (diff)
downloadbusybox-02c3c3842004d88207b46450dbd19f80e6596c7e.tar.gz
Move seamless .Z support into unpack_gz_stream
unpack_gz_stream 566 643 +77 unpack_gunzip 123 12 -111 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--archival/Config.src4
-rw-r--r--archival/bbunzip.c24
-rw-r--r--archival/libarchive/decompress_gunzip.c18
3 files changed, 21 insertions, 25 deletions
diff --git a/archival/Config.src b/archival/Config.src
index 885cb5bcc..ae1afc594 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 1bc04ed33..94d8a81c9 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 f1c9a79e5..66152a853 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;