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 | } |