diff options
| author | Denys Vlasenko <vda.linux@googlemail.com> | 2010-05-30 05:10:16 +0200 |
|---|---|---|
| committer | Denys Vlasenko <vda.linux@googlemail.com> | 2010-05-30 05:10:16 +0200 |
| commit | c88c1a01904b5791dfd1ca5342c805a9f392e17f (patch) | |
| tree | 5e7dad7e81657d02b99a0fe31442364344e965fe | |
| parent | acaaca839abada0d0718375ba03dcaeddda15d9e (diff) | |
| download | busybox-w32-c88c1a01904b5791dfd1ca5342c805a9f392e17f.tar.gz busybox-w32-c88c1a01904b5791dfd1ca5342c805a9f392e17f.tar.bz2 busybox-w32-c88c1a01904b5791dfd1ca5342c805a9f392e17f.zip | |
rpm2cpio: teach it to understand xz format
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
| -rw-r--r-- | archival/rpm2cpio.c | 35 |
1 files changed, 24 insertions, 11 deletions
diff --git a/archival/rpm2cpio.c b/archival/rpm2cpio.c index 4ed5b023b..598ec8670 100644 --- a/archival/rpm2cpio.c +++ b/archival/rpm2cpio.c | |||
| @@ -68,22 +68,35 @@ int rpm2cpio_main(int argc UNUSED_PARAM, char **argv) | |||
| 68 | #else | 68 | #else |
| 69 | /* BLOAT */ | 69 | /* BLOAT */ |
| 70 | { | 70 | { |
| 71 | unsigned char magic[2]; | 71 | unsigned char magic[8]; |
| 72 | IF_DESKTOP(long long) int FAST_FUNC (*unpack)(int src_fd, int dst_fd); | 72 | IF_DESKTOP(long long) int FAST_FUNC (*unpack)(int src_fd, int dst_fd); |
| 73 | 73 | ||
| 74 | xread(rpm_fd, &magic, 2); | 74 | xread(rpm_fd, &magic, 2); |
| 75 | unpack = unpack_gz_stream; | 75 | if (magic[0] == 0x1f && magic[1] == 0x8b) { |
| 76 | if (magic[0] != 0x1f || magic[1] != 0x8b) { | 76 | unpack = unpack_gz_stream; |
| 77 | if (!ENABLE_FEATURE_SEAMLESS_BZ2 | 77 | } else |
| 78 | || magic[0] != 'B' || magic[1] != 'Z' | 78 | if (ENABLE_FEATURE_SEAMLESS_BZ2 |
| 79 | ) { | 79 | && magic[0] == 'B' && magic[1] == 'Z' |
| 80 | bb_error_msg_and_die("invalid gzip" | 80 | ) { |
| 81 | IF_FEATURE_SEAMLESS_BZ2("/bzip2") | ||
| 82 | " magic"); | ||
| 83 | } | ||
| 84 | unpack = unpack_bz2_stream; | 81 | unpack = unpack_bz2_stream; |
| 82 | } else | ||
| 83 | if (ENABLE_FEATURE_SEAMLESS_XZ | ||
| 84 | && magic[0] == 0xfd && magic[1] == '7' | ||
| 85 | ) { | ||
| 86 | /* .xz signature: 0xfd, '7', 'z', 'X', 'Z', 0x00 */ | ||
| 87 | /* More info at: http://tukaani.org/xz/xz-file-format.txt */ | ||
| 88 | xread(rpm_fd, magic + 2, 4); | ||
| 89 | if (strcmp((char*)magic + 2, "zXZ") != 0) | ||
| 90 | goto no_magic; | ||
| 91 | xlseek(rpm_fd, -6, SEEK_CUR); | ||
| 92 | unpack = unpack_xz_stream; | ||
| 93 | } else { | ||
| 94 | no_magic: | ||
| 95 | bb_error_msg_and_die("no gzip" | ||
| 96 | IF_FEATURE_SEAMLESS_BZ2("/bzip2") | ||
| 97 | IF_FEATURE_SEAMLESS_XZ("/xz") | ||
| 98 | " magic"); | ||
| 85 | } | 99 | } |
| 86 | |||
| 87 | if (unpack(rpm_fd, STDOUT_FILENO) < 0) | 100 | if (unpack(rpm_fd, STDOUT_FILENO) < 0) |
| 88 | bb_error_msg_and_die("error unpacking"); | 101 | bb_error_msg_and_die("error unpacking"); |
| 89 | } | 102 | } |
