[git commit] Move seamless .Z support into unpack_gz_stream

Denys Vlasenko vda.linux at googlemail.com
Tue Mar 6 15:32:06 UTC 2012


commit: http://git.busybox.net/busybox/commit/?id=02c3c3842004d88207b46450dbd19f80e6596c7e
branch: http://git.busybox.net/busybox/commit/?id=refs/heads/master

unpack_gz_stream                                     566     643     +77
unpack_gunzip                                        123      12    -111

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 archival/Config.src                     |    4 ++--
 archival/bbunzip.c                      |   24 +-----------------------
 archival/libarchive/decompress_gunzip.c |   18 ++++++++++++++++++
 3 files changed, 21 insertions(+), 25 deletions(-)

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;
 


More information about the busybox-cvs mailing list