diff options
author | Denys Vlasenko | 2010-05-06 14:19:19 +0000 |
---|---|---|
committer | Denys Vlasenko | 2010-05-06 14:19:19 +0000 |
commit | 27653adc8b7ebe44bd357511de53d0c14eef0894 (patch) | |
tree | d1c9b0facbcca408a18d75f93aa507e96927ef31 /archival/rpm2cpio.c | |
parent | b8ba6b66f5d730efcf13dbbb3f9362dd6840d93b (diff) | |
download | busybox-27653adc8b7ebe44bd357511de53d0c14eef0894.zip busybox-27653adc8b7ebe44bd357511de53d0c14eef0894.tar.gz |
rpm: code shrink. Now uses open_zipped's logic (factored out into setup_unzip_on_fd())
function old new delta
setup_unzip_on_fd - 80 +80
open_zipped 176 113 -63
rpm_main 1672 1355 -317
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 0/2 up/down: 80/-380) Total: -300 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'archival/rpm2cpio.c')
-rw-r--r-- | archival/rpm2cpio.c | 69 |
1 files changed, 28 insertions, 41 deletions
diff --git a/archival/rpm2cpio.c b/archival/rpm2cpio.c index 5403aee..4ed5b02 100644 --- a/archival/rpm2cpio.c +++ b/archival/rpm2cpio.c @@ -8,30 +8,7 @@ */ #include "libbb.h" #include "unarchive.h" - -#define RPM_MAGIC 0xedabeedb -#define RPM_MAGIC_STR "\355\253\356\333" - -struct rpm_lead { - uint32_t magic; - uint8_t major, minor; - uint16_t type; - uint16_t archnum; - char name[66]; - uint16_t osnum; - uint16_t signature_type; - char reserved[16]; -}; - -#define RPM_HEADER_MAGICnVER 0x8eade801 -#define RPM_HEADER_MAGIC_STR "\216\255\350" - -struct rpm_header { - uint32_t magic_and_ver; /* 3 byte magic: 0x8e 0xad 0xe8; 1 byte version */ - uint32_t reserved; /* 4 bytes reserved */ - uint32_t entries; /* Number of entries in header (4 bytes) */ - uint32_t size; /* Size of store (4 bytes) */ -}; +#include "rpm.h" enum { rpm_fd = STDIN_FILENO }; @@ -65,8 +42,6 @@ int rpm2cpio_main(int argc UNUSED_PARAM, char **argv) { struct rpm_lead lead; unsigned pos; - unsigned char magic[2]; - IF_DESKTOP(long long) int FAST_FUNC (*unpack)(int src_fd, int dst_fd); if (argv[1]) { xmove_fd(xopen(argv[1], O_RDONLY), rpm_fd); @@ -74,33 +49,45 @@ int rpm2cpio_main(int argc UNUSED_PARAM, char **argv) xread(rpm_fd, &lead, sizeof(lead)); /* Just check the magic, the rest is irrelevant */ - if (lead.magic != htonl(RPM_MAGIC)) { + if (lead.magic != htonl(RPM_LEAD_MAGIC)) { bb_error_msg_and_die("invalid RPM magic"); } /* Skip the signature header, align to 8 bytes */ pos = skip_header(); - seek_by_jump(rpm_fd, (8 - pos) & 7); + seek_by_jump(rpm_fd, (-(int)pos) & 7); /* Skip the main header */ skip_header(); - xread(rpm_fd, &magic, 2); - unpack = unpack_gz_stream; - if (magic[0] != 0x1f || magic[1] != 0x8b) { - if (!ENABLE_FEATURE_SEAMLESS_BZ2 - || magic[0] != 'B' || magic[1] != 'Z' - ) { - bb_error_msg_and_die("invalid gzip" - IF_FEATURE_SEAMLESS_BZ2("/bzip2") - " magic"); +#if 0 + /* This works, but doesn't report uncompress errors (they happen in child) */ + setup_unzip_on_fd(rpm_fd /*fail_if_not_detected: 1*/); + if (bb_copyfd_eof(rpm_fd, STDOUT_FILENO) < 0) + bb_error_msg_and_die("error unpacking"); +#else + /* BLOAT */ + { + unsigned char magic[2]; + IF_DESKTOP(long long) int FAST_FUNC (*unpack)(int src_fd, int dst_fd); + + xread(rpm_fd, &magic, 2); + unpack = unpack_gz_stream; + if (magic[0] != 0x1f || magic[1] != 0x8b) { + if (!ENABLE_FEATURE_SEAMLESS_BZ2 + || magic[0] != 'B' || magic[1] != 'Z' + ) { + bb_error_msg_and_die("invalid gzip" + IF_FEATURE_SEAMLESS_BZ2("/bzip2") + " magic"); + } + unpack = unpack_bz2_stream; } - unpack = unpack_bz2_stream; - } - if (unpack(rpm_fd, STDOUT_FILENO) < 0) { - bb_error_msg_and_die("error unpacking"); + if (unpack(rpm_fd, STDOUT_FILENO) < 0) + bb_error_msg_and_die("error unpacking"); } +#endif if (ENABLE_FEATURE_CLEAN_UP) { close(rpm_fd); |