rpm2cpio: teach it to understand xz format
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
acaaca839a
commit
c88c1a0190
@ -68,22 +68,35 @@ int rpm2cpio_main(int argc UNUSED_PARAM, char **argv)
|
||||
#else
|
||||
/* BLOAT */
|
||||
{
|
||||
unsigned char magic[2];
|
||||
unsigned char magic[8];
|
||||
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");
|
||||
}
|
||||
if (magic[0] == 0x1f && magic[1] == 0x8b) {
|
||||
unpack = unpack_gz_stream;
|
||||
} else
|
||||
if (ENABLE_FEATURE_SEAMLESS_BZ2
|
||||
&& magic[0] == 'B' && magic[1] == 'Z'
|
||||
) {
|
||||
unpack = unpack_bz2_stream;
|
||||
} else
|
||||
if (ENABLE_FEATURE_SEAMLESS_XZ
|
||||
&& magic[0] == 0xfd && magic[1] == '7'
|
||||
) {
|
||||
/* .xz signature: 0xfd, '7', 'z', 'X', 'Z', 0x00 */
|
||||
/* More info at: http://tukaani.org/xz/xz-file-format.txt */
|
||||
xread(rpm_fd, magic + 2, 4);
|
||||
if (strcmp((char*)magic + 2, "zXZ") != 0)
|
||||
goto no_magic;
|
||||
xlseek(rpm_fd, -6, SEEK_CUR);
|
||||
unpack = unpack_xz_stream;
|
||||
} else {
|
||||
no_magic:
|
||||
bb_error_msg_and_die("no gzip"
|
||||
IF_FEATURE_SEAMLESS_BZ2("/bzip2")
|
||||
IF_FEATURE_SEAMLESS_XZ("/xz")
|
||||
" magic");
|
||||
}
|
||||
|
||||
if (unpack(rpm_fd, STDOUT_FILENO) < 0)
|
||||
bb_error_msg_and_die("error unpacking");
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user