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

This commit is contained in:
Denis Vlasenko 2007-06-08 13:05:39 +00:00
parent def8260219
commit c14d39e83a
12 changed files with 42 additions and 24 deletions

View File

@ -133,6 +133,13 @@ config RPM
help help
Mini RPM applet - queries and extracts RPM packages. 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 config TAR
bool "tar" bool "tar"
default n default n

View File

@ -155,7 +155,7 @@ char* make_new_name_bunzip2(char *filename)
static static
USE_DESKTOP(long long) int unpack_bunzip2(void) 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); 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); status = uncompress(STDIN_FILENO, STDOUT_FILENO);
} else if (magic2 == 0x8b) { } else if (magic2 == 0x8b) {
check_header_gzip_or_die(STDIN_FILENO); check_header_gzip_or_die(STDIN_FILENO);
status = inflate_gunzip(STDIN_FILENO, STDOUT_FILENO); status = unpack_gz_stream(STDIN_FILENO, STDOUT_FILENO);
} else { } else {
goto bad_magic; goto bad_magic;
} }
@ -292,7 +292,7 @@ char* make_new_name_unlzma(char *filename)
static static
USE_DESKTOP(long long) int unpack_unlzma(void) 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); int unlzma_main(int argc, char **argv);

View File

@ -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. */ /* Decompress src_fd to dst_fd. Stops at end of bzip data, not end of file. */
USE_DESKTOP(long long) int 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;) USE_DESKTOP(long long total_written = 0;)
char *outbuf; char *outbuf;
@ -751,7 +751,7 @@ static char *const bunzip_errors[] = {
/* Dumb little test thing, decompress stdin to stdout */ /* Dumb little test thing, decompress stdin to stdout */
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
int i = uncompressStream(0, 1); int i = unpack_bz2_stream(0, 1);
char c; char c;
if (i < 0) if (i < 0)

View File

@ -228,7 +228,7 @@ enum {
USE_DESKTOP(long long) int 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;) USE_DESKTOP(long long total_written = 0;)
lzma_header_t header; lzma_header_t header;

View File

@ -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! */ /* NB: bytebuffer is allocated here but freeing it is left to the caller! */
static USE_DESKTOP(long long) int static USE_DESKTOP(long long) int
inflate_unzip_internal(STATE_PARAM int in, int out) 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 USE_DESKTOP(long long) int
inflate_gunzip(int in, int out) unpack_gz_stream(int in, int out)
{ {
uint32_t stored_crc = 0; uint32_t stored_crc = 0;
unsigned count; unsigned count;

View File

@ -11,7 +11,7 @@ char get_header_tar_bz2(archive_handle_t *archive_handle)
/* Can't lseek over pipes */ /* Can't lseek over pipes */
archive_handle->seek = seek_by_read; 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; archive_handle->offset = 0;
while (get_header_tar(archive_handle) == EXIT_SUCCESS) /**/; while (get_header_tar(archive_handle) == EXIT_SUCCESS) /**/;

View File

@ -20,7 +20,7 @@ char get_header_tar_gz(archive_handle_t *archive_handle)
check_header_gzip_or_die(archive_handle->src_fd); 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; archive_handle->offset = 0;
while (get_header_tar(archive_handle) == EXIT_SUCCESS) /**/; while (get_header_tar(archive_handle) == EXIT_SUCCESS) /**/;

View File

@ -14,7 +14,7 @@ char get_header_tar_lzma(archive_handle_t * archive_handle)
/* Can't lseek over pipes */ /* Can't lseek over pipes */
archive_handle->seek = seek_by_read; 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; archive_handle->offset = 0;
while (get_header_tar(archive_handle) == EXIT_SUCCESS) /**/; while (get_header_tar(archive_handle) == EXIT_SUCCESS) /**/;

View File

@ -187,10 +187,11 @@ int rpm_main(int argc, char **argv)
static void extract_cpio_gz(int fd) static void extract_cpio_gz(int fd)
{ {
USE_DESKTOP(long long) int (*xformer)(int src_fd, int dst_fd);
archive_handle_t *archive_handle; archive_handle_t *archive_handle;
unsigned char magic[2]; unsigned char magic[2];
/* Initialise */ /* Initialize */
archive_handle = init_handle(); archive_handle = init_handle();
archive_handle->seek = seek_by_read; archive_handle->seek = seek_by_read;
//archive_handle->action_header = header_list; //archive_handle->action_header = header_list;
@ -201,16 +202,26 @@ static void extract_cpio_gz(int fd)
archive_handle->offset = 0; archive_handle->offset = 0;
xread(archive_handle->src_fd, &magic, 2); xread(archive_handle->src_fd, &magic, 2);
xformer = unpack_gz_stream;
if ((magic[0] != 0x1f) || (magic[1] != 0x8b)) { if ((magic[0] != 0x1f) || (magic[1] != 0x8b)) {
bb_error_msg_and_die("invalid gzip magic"); 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); 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); xchdir("/"); /* Install RPM's to root */
archive_handle->src_fd = open_transformer(archive_handle->src_fd, xformer);
archive_handle->offset = 0; archive_handle->offset = 0;
while (get_header_cpio(archive_handle) == EXIT_SUCCESS) while (get_header_cpio(archive_handle) == EXIT_SUCCESS)
/* loop */; continue;
} }

View File

@ -80,7 +80,7 @@ int rpm2cpio_main(int argc, char **argv)
} }
check_header_gzip_or_die(rpm_fd); 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"); bb_error_msg("error inflating");
} }

View File

@ -65,7 +65,7 @@ archival/libunarchive/decompress_unzip.c:
(see the rest of the file to get the idea) (see the rest of the file to get the idea)
This example completely eliminates globals in that module. 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' and then passed down to all subroutines which need to access 'globals'
as a parameter. as a parameter.

View File

@ -101,7 +101,6 @@ extern void data_align(archive_handle_t *archive_handle, const unsigned short bo
extern const llist_t *find_list_entry(const llist_t *list, const char *filename); 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 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: */ /* A bit of bunzip2 internals are exposed for compressed help support: */
typedef struct bunzip_data bunzip_data; typedef struct bunzip_data bunzip_data;
int start_bunzip(bunzip_data **bdp, int in_fd, const unsigned char *inbuf, int len); int start_bunzip(bunzip_data **bdp, int in_fd, const unsigned char *inbuf, int len);
@ -113,9 +112,10 @@ typedef struct inflate_unzip_result {
uint32_t crc; uint32_t crc;
} inflate_unzip_result; } 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 unpack_bz2_stream(int src_fd, int dst_fd);
extern USE_DESKTOP(long long) int inflate_gunzip(int in, int out); 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 unlzma(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, extern int open_transformer(int src_fd,
USE_DESKTOP(long long) int (*transformer)(int src_fd, int dst_fd)); USE_DESKTOP(long long) int (*transformer)(int src_fd, int dst_fd));