aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2010-05-30 05:10:16 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2010-05-30 05:10:16 +0200
commitc88c1a01904b5791dfd1ca5342c805a9f392e17f (patch)
tree5e7dad7e81657d02b99a0fe31442364344e965fe
parentacaaca839abada0d0718375ba03dcaeddda15d9e (diff)
downloadbusybox-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.c35
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 }