svn commit: trunk/busybox: archival archival/libunarchive docs incl etc...

vda at busybox.net vda at busybox.net
Fri Jun 8 13:05:39 UTC 2007


Author: vda
Date: 2007-06-08 06:05:39 -0700 (Fri, 08 Jun 2007)
New Revision: 18780

Log:
rmp: add optional support for bz2 data. +50 bytes of code


Modified:
   trunk/busybox/archival/Config.in
   trunk/busybox/archival/bbunzip.c
   trunk/busybox/archival/libunarchive/decompress_bunzip2.c
   trunk/busybox/archival/libunarchive/decompress_unlzma.c
   trunk/busybox/archival/libunarchive/decompress_unzip.c
   trunk/busybox/archival/libunarchive/get_header_tar_bz2.c
   trunk/busybox/archival/libunarchive/get_header_tar_gz.c
   trunk/busybox/archival/libunarchive/get_header_tar_lzma.c
   trunk/busybox/archival/rpm.c
   trunk/busybox/archival/rpm2cpio.c
   trunk/busybox/docs/keep_data_small.txt
   trunk/busybox/include/unarchive.h


Changeset:
Modified: trunk/busybox/archival/Config.in
===================================================================
--- trunk/busybox/archival/Config.in	2007-06-08 12:52:17 UTC (rev 18779)
+++ trunk/busybox/archival/Config.in	2007-06-08 13:05:39 UTC (rev 18780)
@@ -133,6 +133,13 @@
 	help
 	  Mini RPM applet - queries and extracts RPM packages.
 
+config FEATURE_RPM_BZ2
+	bool "Enable handling of rpms with bzip2-compressed data inside"
+	default n
+	depends on RPM
+	help
+	  Enable handling of rpms with bzip2-compressed data inside.
+
 config TAR
 	bool "tar"
 	default n

Modified: trunk/busybox/archival/bbunzip.c
===================================================================
--- trunk/busybox/archival/bbunzip.c	2007-06-08 12:52:17 UTC (rev 18779)
+++ trunk/busybox/archival/bbunzip.c	2007-06-08 13:05:39 UTC (rev 18780)
@@ -155,7 +155,7 @@
 static
 USE_DESKTOP(long long) int unpack_bunzip2(void)
 {
-	return uncompressStream(STDIN_FILENO, STDOUT_FILENO);
+	return unpack_bz2_stream(STDIN_FILENO, STDOUT_FILENO);
 }
 
 int bunzip2_main(int argc, char **argv);
@@ -242,7 +242,7 @@
 			status = uncompress(STDIN_FILENO, STDOUT_FILENO);
 		} else if (magic2 == 0x8b) {
 			check_header_gzip_or_die(STDIN_FILENO);
-			status = inflate_gunzip(STDIN_FILENO, STDOUT_FILENO);
+			status = unpack_gz_stream(STDIN_FILENO, STDOUT_FILENO);
 		} else {
 			goto bad_magic;
 		}
@@ -292,7 +292,7 @@
 static
 USE_DESKTOP(long long) int unpack_unlzma(void)
 {
-	return unlzma(STDIN_FILENO, STDOUT_FILENO);
+	return unpack_lzma_stream(STDIN_FILENO, STDOUT_FILENO);
 }
 
 int unlzma_main(int argc, char **argv);

Modified: trunk/busybox/archival/libunarchive/decompress_bunzip2.c
===================================================================
--- trunk/busybox/archival/libunarchive/decompress_bunzip2.c	2007-06-08 12:52:17 UTC (rev 18779)
+++ trunk/busybox/archival/libunarchive/decompress_bunzip2.c	2007-06-08 13:05:39 UTC (rev 18780)
@@ -700,7 +700,7 @@
 /* Decompress src_fd to dst_fd.  Stops at end of bzip data, not end of file. */
 
 USE_DESKTOP(long long) int
-uncompressStream(int src_fd, int dst_fd)
+unpack_bz2_stream(int src_fd, int dst_fd)
 {
 	USE_DESKTOP(long long total_written = 0;)
 	char *outbuf;
@@ -751,7 +751,7 @@
 /* Dumb little test thing, decompress stdin to stdout */
 int main(int argc, char **argv)
 {
-	int i = uncompressStream(0, 1);
+	int i = unpack_bz2_stream(0, 1);
 	char c;
 
 	if (i < 0)

Modified: trunk/busybox/archival/libunarchive/decompress_unlzma.c
===================================================================
--- trunk/busybox/archival/libunarchive/decompress_unlzma.c	2007-06-08 12:52:17 UTC (rev 18779)
+++ trunk/busybox/archival/libunarchive/decompress_unlzma.c	2007-06-08 13:05:39 UTC (rev 18780)
@@ -228,7 +228,7 @@
 
 
 USE_DESKTOP(long long) int
-unlzma(int src_fd, int dst_fd)
+unpack_lzma_stream(int src_fd, int dst_fd)
 {
 	USE_DESKTOP(long long total_written = 0;)
 	lzma_header_t header;

Modified: trunk/busybox/archival/libunarchive/decompress_unzip.c
===================================================================
--- trunk/busybox/archival/libunarchive/decompress_unzip.c	2007-06-08 12:52:17 UTC (rev 18779)
+++ trunk/busybox/archival/libunarchive/decompress_unzip.c	2007-06-08 13:05:39 UTC (rev 18780)
@@ -981,7 +981,7 @@
 }
 
 
-/* Called from inflate_gunzip() and inflate_unzip() */
+/* Called from unpack_gz_stream() and inflate_unzip() */
 /* NB: bytebuffer is allocated here but freeing it is left to the caller! */
 static USE_DESKTOP(long long) int
 inflate_unzip_internal(STATE_PARAM int in, int out)
@@ -1056,7 +1056,7 @@
 
 
 USE_DESKTOP(long long) int
-inflate_gunzip(int in, int out)
+unpack_gz_stream(int in, int out)
 {
 	uint32_t stored_crc = 0;
 	unsigned count;

Modified: trunk/busybox/archival/libunarchive/get_header_tar_bz2.c
===================================================================
--- trunk/busybox/archival/libunarchive/get_header_tar_bz2.c	2007-06-08 12:52:17 UTC (rev 18779)
+++ trunk/busybox/archival/libunarchive/get_header_tar_bz2.c	2007-06-08 13:05:39 UTC (rev 18780)
@@ -11,7 +11,7 @@
 	/* Can't lseek over pipes */
 	archive_handle->seek = seek_by_read;
 
-	archive_handle->src_fd = open_transformer(archive_handle->src_fd, uncompressStream);
+	archive_handle->src_fd = open_transformer(archive_handle->src_fd, unpack_bz2_stream);
 	archive_handle->offset = 0;
 	while (get_header_tar(archive_handle) == EXIT_SUCCESS) /**/;
 

Modified: trunk/busybox/archival/libunarchive/get_header_tar_gz.c
===================================================================
--- trunk/busybox/archival/libunarchive/get_header_tar_gz.c	2007-06-08 12:52:17 UTC (rev 18779)
+++ trunk/busybox/archival/libunarchive/get_header_tar_gz.c	2007-06-08 13:05:39 UTC (rev 18780)
@@ -20,7 +20,7 @@
 
 	check_header_gzip_or_die(archive_handle->src_fd);
 
-	archive_handle->src_fd = open_transformer(archive_handle->src_fd, inflate_gunzip);
+	archive_handle->src_fd = open_transformer(archive_handle->src_fd, unpack_gz_stream);
 	archive_handle->offset = 0;
 	while (get_header_tar(archive_handle) == EXIT_SUCCESS) /**/;
 

Modified: trunk/busybox/archival/libunarchive/get_header_tar_lzma.c
===================================================================
--- trunk/busybox/archival/libunarchive/get_header_tar_lzma.c	2007-06-08 12:52:17 UTC (rev 18779)
+++ trunk/busybox/archival/libunarchive/get_header_tar_lzma.c	2007-06-08 13:05:39 UTC (rev 18780)
@@ -14,7 +14,7 @@
 	/* Can't lseek over pipes */
 	archive_handle->seek = seek_by_read;
 
-	archive_handle->src_fd = open_transformer(archive_handle->src_fd, unlzma);
+	archive_handle->src_fd = open_transformer(archive_handle->src_fd, unpack_lzma_stream);
 	archive_handle->offset = 0;
 	while (get_header_tar(archive_handle) == EXIT_SUCCESS) /**/;
 

Modified: trunk/busybox/archival/rpm.c
===================================================================
--- trunk/busybox/archival/rpm.c	2007-06-08 12:52:17 UTC (rev 18779)
+++ trunk/busybox/archival/rpm.c	2007-06-08 13:05:39 UTC (rev 18780)
@@ -187,10 +187,11 @@
 
 static void extract_cpio_gz(int fd)
 {
+	USE_DESKTOP(long long) int (*xformer)(int src_fd, int dst_fd);
 	archive_handle_t *archive_handle;
 	unsigned char magic[2];
 
-	/* Initialise */
+	/* Initialize */
 	archive_handle = init_handle();
 	archive_handle->seek = seek_by_read;
 	//archive_handle->action_header = header_list;
@@ -201,16 +202,26 @@
 	archive_handle->offset = 0;
 
 	xread(archive_handle->src_fd, &magic, 2);
+	xformer = unpack_gz_stream;
 	if ((magic[0] != 0x1f) || (magic[1] != 0x8b)) {
-		bb_error_msg_and_die("invalid gzip magic");
-	}
-	check_header_gzip_or_die(archive_handle->src_fd);
+		if (ENABLE_FEATURE_RPM_BZ2
+		 && (magic[0] == 0x42) && (magic[1] == 0x5a)) {
+			xformer = unpack_bz2_stream;
+	/* We can do better, need modifying unpack_bz2_stream to not require
+	 * first 2 bytes. Not very hard to do... I mean, TODO :) */
+			xlseek(archive_handle->src_fd, -2, SEEK_CUR);
+		} else
+			bb_error_msg_and_die("no gzip"
+				USE_FEATURE_RPM_BZ2("/bzip")
+				" magic");
+	} else
+		check_header_gzip_or_die(archive_handle->src_fd);
+
 	xchdir("/"); /* Install RPM's to root */
-
-	archive_handle->src_fd = open_transformer(archive_handle->src_fd, inflate_gunzip);
+	archive_handle->src_fd = open_transformer(archive_handle->src_fd, xformer);
 	archive_handle->offset = 0;
 	while (get_header_cpio(archive_handle) == EXIT_SUCCESS)
-		/* loop */;
+		continue;
 }
 
 

Modified: trunk/busybox/archival/rpm2cpio.c
===================================================================
--- trunk/busybox/archival/rpm2cpio.c	2007-06-08 12:52:17 UTC (rev 18779)
+++ trunk/busybox/archival/rpm2cpio.c	2007-06-08 13:05:39 UTC (rev 18780)
@@ -80,7 +80,7 @@
 	}
 
 	check_header_gzip_or_die(rpm_fd);
-	if (inflate_gunzip(rpm_fd, STDOUT_FILENO) < 0) {
+	if (unpack_gz_stream(rpm_fd, STDOUT_FILENO) < 0) {
 		bb_error_msg("error inflating");
 	}
 

Modified: trunk/busybox/docs/keep_data_small.txt
===================================================================
--- trunk/busybox/docs/keep_data_small.txt	2007-06-08 12:52:17 UTC (rev 18779)
+++ trunk/busybox/docs/keep_data_small.txt	2007-06-08 13:05:39 UTC (rev 18780)
@@ -65,7 +65,7 @@
 (see the rest of the file to get the idea)
 
 This example completely eliminates globals in that module.
-Required memory is allocated in inflate_gunzip() [its main module]
+Required memory is allocated in unpack_gz_stream() [its main module]
 and then passed down to all subroutines which need to access 'globals'
 as a parameter.
 

Modified: trunk/busybox/include/unarchive.h
===================================================================
--- trunk/busybox/include/unarchive.h	2007-06-08 12:52:17 UTC (rev 18779)
+++ trunk/busybox/include/unarchive.h	2007-06-08 13:05:39 UTC (rev 18780)
@@ -101,7 +101,6 @@
 extern const llist_t *find_list_entry(const llist_t *list, const char *filename);
 extern const llist_t *find_list_entry2(const llist_t *list, const char *filename);
 
-extern USE_DESKTOP(long long) int uncompressStream(int src_fd, int dst_fd);
 /* A bit of bunzip2 internals are exposed for compressed help support: */
 typedef struct bunzip_data bunzip_data;
 int start_bunzip(bunzip_data **bdp, int in_fd, const unsigned char *inbuf, int len);
@@ -113,9 +112,10 @@
 	uint32_t crc;
 } inflate_unzip_result;
 
-extern USE_DESKTOP(long long) int inflate_unzip(inflate_unzip_result *res, unsigned bufsize, int in, int out);
-extern USE_DESKTOP(long long) int inflate_gunzip(int in, int out);
-extern USE_DESKTOP(long long) int unlzma(int src_fd, int dst_fd);
+extern USE_DESKTOP(long long) int unpack_bz2_stream(int src_fd, int dst_fd);
+extern USE_DESKTOP(long long) int inflate_unzip(inflate_unzip_result *res, unsigned bufsize, int src_fd, int dst_fd);
+extern USE_DESKTOP(long long) int unpack_gz_stream(int src_fd, int dst_fd);
+extern USE_DESKTOP(long long) int unpack_lzma_stream(int src_fd, int dst_fd);
 
 extern int open_transformer(int src_fd,
 	USE_DESKTOP(long long) int (*transformer)(int src_fd, int dst_fd));




More information about the busybox-cvs mailing list