rmp: add optional support for bz2 data. +50 bytes of code
This commit is contained in:
parent
def8260219
commit
c14d39e83a
@ -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
|
||||||
|
@ -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);
|
||||||
|
@ -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)
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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) /**/;
|
||||||
|
|
||||||
|
@ -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) /**/;
|
||||||
|
|
||||||
|
@ -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) /**/;
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -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");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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.
|
||||||
|
|
||||||
|
@ -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));
|
||||||
|
Loading…
Reference in New Issue
Block a user