diff options
Diffstat (limited to 'archival')
-rw-r--r-- | archival/Config.in | 7 | ||||
-rw-r--r-- | archival/bbunzip.c | 6 | ||||
-rw-r--r-- | archival/libunarchive/decompress_bunzip2.c | 4 | ||||
-rw-r--r-- | archival/libunarchive/decompress_unlzma.c | 2 | ||||
-rw-r--r-- | archival/libunarchive/decompress_unzip.c | 4 | ||||
-rw-r--r-- | archival/libunarchive/get_header_tar_bz2.c | 2 | ||||
-rw-r--r-- | archival/libunarchive/get_header_tar_gz.c | 2 | ||||
-rw-r--r-- | archival/libunarchive/get_header_tar_lzma.c | 2 | ||||
-rw-r--r-- | archival/rpm.c | 25 | ||||
-rw-r--r-- | archival/rpm2cpio.c | 2 |
10 files changed, 37 insertions, 19 deletions
diff --git a/archival/Config.in b/archival/Config.in index 2741982..661c71c 100644 --- a/archival/Config.in +++ b/archival/Config.in @@ -133,6 +133,13 @@ config RPM 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 diff --git a/archival/bbunzip.c b/archival/bbunzip.c index 83b5637..bd1526b 100644 --- a/archival/bbunzip.c +++ b/archival/bbunzip.c @@ -155,7 +155,7 @@ char* make_new_name_bunzip2(char *filename) 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 @@ USE_DESKTOP(long long) int unpack_gunzip(void) 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 @@ char* make_new_name_unlzma(char *filename) 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); diff --git a/archival/libunarchive/decompress_bunzip2.c b/archival/libunarchive/decompress_bunzip2.c index a9d5d68..fe1d3ff 100644 --- a/archival/libunarchive/decompress_bunzip2.c +++ b/archival/libunarchive/decompress_bunzip2.c @@ -700,7 +700,7 @@ void dealloc_bunzip(bunzip_data *bd) /* 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 @@ static char *const bunzip_errors[] = { /* 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) diff --git a/archival/libunarchive/decompress_unlzma.c b/archival/libunarchive/decompress_unlzma.c index 15a0275..907e44e 100644 --- a/archival/libunarchive/decompress_unlzma.c +++ b/archival/libunarchive/decompress_unlzma.c @@ -228,7 +228,7 @@ enum { 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; diff --git a/archival/libunarchive/decompress_unzip.c b/archival/libunarchive/decompress_unzip.c index 19ce509..c698763 100644 --- a/archival/libunarchive/decompress_unzip.c +++ b/archival/libunarchive/decompress_unzip.c @@ -981,7 +981,7 @@ static int inflate_get_next_window(STATE_PARAM_ONLY) } -/* 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 @@ inflate_unzip(inflate_unzip_result *res, unsigned bufsize, int in, int out) 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; diff --git a/archival/libunarchive/get_header_tar_bz2.c b/archival/libunarchive/get_header_tar_bz2.c index d8715c0..e11f44c 100644 --- a/archival/libunarchive/get_header_tar_bz2.c +++ b/archival/libunarchive/get_header_tar_bz2.c @@ -11,7 +11,7 @@ char get_header_tar_bz2(archive_handle_t *archive_handle) /* 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) /**/; diff --git a/archival/libunarchive/get_header_tar_gz.c b/archival/libunarchive/get_header_tar_gz.c index 69126e0..85070d9 100644 --- a/archival/libunarchive/get_header_tar_gz.c +++ b/archival/libunarchive/get_header_tar_gz.c @@ -20,7 +20,7 @@ char get_header_tar_gz(archive_handle_t *archive_handle) 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) /**/; diff --git a/archival/libunarchive/get_header_tar_lzma.c b/archival/libunarchive/get_header_tar_lzma.c index 5c02767..771f664 100644 --- a/archival/libunarchive/get_header_tar_lzma.c +++ b/archival/libunarchive/get_header_tar_lzma.c @@ -14,7 +14,7 @@ char get_header_tar_lzma(archive_handle_t * archive_handle) /* 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) /**/; diff --git a/archival/rpm.c b/archival/rpm.c index 71ed32e..674ee26 100644 --- a/archival/rpm.c +++ b/archival/rpm.c @@ -187,10 +187,11 @@ int rpm_main(int argc, char **argv) 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 @@ static void extract_cpio_gz(int fd) 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); - xchdir("/"); /* Install RPM's to root */ + 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); - archive_handle->src_fd = open_transformer(archive_handle->src_fd, inflate_gunzip); + xchdir("/"); /* Install RPM's to root */ + 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; } diff --git a/archival/rpm2cpio.c b/archival/rpm2cpio.c index 460aeaf..dcd9265 100644 --- a/archival/rpm2cpio.c +++ b/archival/rpm2cpio.c @@ -80,7 +80,7 @@ int rpm2cpio_main(int argc, char **argv) } 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"); } |