diff -Naur busybox-1.20.2/archival/libarchive/filter_accept_list_reassign.c busybox-1.20.2-magellan/archival/libarchive/filter_accept_list_reassign.c --- busybox-1.20.2/archival/libarchive/filter_accept_list_reassign.c 2012-06-26 15:35:45.000000000 +0200 +++ busybox-1.20.2-magellan/archival/libarchive/filter_accept_list_reassign.c 2012-07-13 12:15:10.649986771 +0200 @@ -46,6 +46,12 @@ archive_handle->dpkg__action_data_subarchive = get_header_tar_lzma; return EXIT_SUCCESS; } + if (ENABLE_FEATURE_SEAMLESS_XZ + && strcmp(name_ptr, "xz") == 0 + ) { + archive_handle->dpkg__action_data_subarchive = get_header_tar_xz; + return EXIT_SUCCESS; + } } return EXIT_FAILURE; } diff -Naur busybox-1.20.2/archival/libarchive/get_header_tar_xz.c busybox-1.20.2-magellan/archival/libarchive/get_header_tar_xz.c --- busybox-1.20.2/archival/libarchive/get_header_tar_xz.c 1970-01-01 01:00:00.000000000 +0100 +++ busybox-1.20.2-magellan/archival/libarchive/get_header_tar_xz.c 2012-07-13 12:13:24.191983102 +0200 @@ -0,0 +1,39 @@ +/* vi: set sw=4 ts=4: */ +/* + * Small xz deflate implementation. + * Copyright (C) 2006 Aurelien Jacobs + * Copyright (C) 2012 Niels Rogalla + * + * Licensed under GPLv2, see file LICENSE in this source tree. + */ + +#include "libbb.h" +#include "bb_archive.h" + +char FAST_FUNC get_header_tar_xz(archive_handle_t *archive_handle) +{ + uint16_t magic; + + /* check magic for LZMA or XZ */ + xread(archive_handle->src_fd, &magic, 2); + xlseek(archive_handle->src_fd, -2, SEEK_CUR); + + /* Can't lseek over pipes */ + archive_handle->seek = seek_by_read; + + if (magic == LZMA_DEFAULT_MAGIC) { + open_transformer_with_sig(archive_handle->src_fd, unpack_lzma_stream, "unlzma"); + archive_handle->offset = 0; + while (get_header_tar(archive_handle) == EXIT_SUCCESS) + continue; + } else { + xlseek(archive_handle->src_fd, +6, SEEK_CUR); + open_transformer_with_sig(archive_handle->src_fd, unpack_xz_stream, "unxz"); + archive_handle->offset = 0; + while (get_header_tar(archive_handle) == EXIT_SUCCESS) + continue; + } + + /* Can only do one file at a time */ + return EXIT_FAILURE; +} diff -Naur busybox-1.20.2/archival/libarchive/Kbuild.src busybox-1.20.2-magellan/archival/libarchive/Kbuild.src --- busybox-1.20.2/archival/libarchive/Kbuild.src 2012-06-26 15:35:45.000000000 +0200 +++ busybox-1.20.2-magellan/archival/libarchive/Kbuild.src 2012-07-13 12:15:47.140983876 +0200 @@ -59,7 +59,7 @@ lib-$(CONFIG_FEATURE_SEAMLESS_GZ) += open_transformer.o decompress_gunzip.o lib-$(CONFIG_FEATURE_SEAMLESS_BZ2) += open_transformer.o decompress_bunzip2.o lib-$(CONFIG_FEATURE_SEAMLESS_LZMA) += open_transformer.o decompress_unlzma.o -lib-$(CONFIG_FEATURE_SEAMLESS_XZ) += open_transformer.o decompress_unxz.o +lib-$(CONFIG_FEATURE_SEAMLESS_XZ) += open_transformer.o decompress_unxz.o get_header_tar_xz.o lib-$(CONFIG_FEATURE_COMPRESS_USAGE) += open_transformer.o decompress_bunzip2.o lib-$(CONFIG_FEATURE_COMPRESS_BBCONFIG) += decompress_bunzip2.o lib-$(CONFIG_FEATURE_TAR_TO_COMMAND) += data_extract_to_command.o diff -Naur busybox-1.20.2/archival/tar.c busybox-1.20.2-magellan/archival/tar.c --- busybox-1.20.2/archival/tar.c 2012-07-02 16:08:25.000000000 +0200 +++ busybox-1.20.2-magellan/archival/tar.c 2012-07-13 12:27:19.799982146 +0200 @@ -696,6 +696,7 @@ //usage: IF_FEATURE_SEAMLESS_GZ("z") //usage: IF_FEATURE_SEAMLESS_BZ2("j") //usage: IF_FEATURE_SEAMLESS_LZMA("a") +//usage: IF_FEATURE_SEAMLESS_XZ("J") //usage: IF_FEATURE_TAR_CREATE("h") //usage: IF_FEATURE_TAR_NOPRESERVE_TIME("m") //usage: "vO] " @@ -726,6 +727,9 @@ //usage: IF_FEATURE_SEAMLESS_LZMA( //usage: "\n a (De)compress using lzma" //usage: ) +//usage: IF_FEATURE_SEAMLESS_XZ( +//usage: "\n J (De)compress using xz" +//usage: ) //usage: "\n O Extract to stdout" //usage: IF_FEATURE_TAR_CREATE( //usage: "\n h Follow symlinks" @@ -762,6 +766,7 @@ IF_FEATURE_TAR_CREATE( OPTBIT_DEREFERENCE ,) IF_FEATURE_SEAMLESS_BZ2( OPTBIT_BZIP2 ,) IF_FEATURE_SEAMLESS_LZMA(OPTBIT_LZMA ,) + IF_FEATURE_SEAMLESS_XZ(OPTBIT_XZ ,) IF_FEATURE_TAR_FROM( OPTBIT_INCLUDE_FROM,) IF_FEATURE_TAR_FROM( OPTBIT_EXCLUDE_FROM,) IF_FEATURE_SEAMLESS_GZ( OPTBIT_GZIP ,) @@ -786,6 +791,7 @@ OPT_DEREFERENCE = IF_FEATURE_TAR_CREATE( (1 << OPTBIT_DEREFERENCE )) + 0, // h OPT_BZIP2 = IF_FEATURE_SEAMLESS_BZ2( (1 << OPTBIT_BZIP2 )) + 0, // j OPT_LZMA = IF_FEATURE_SEAMLESS_LZMA((1 << OPTBIT_LZMA )) + 0, // a + OPT_XZ = IF_FEATURE_SEAMLESS_XZ( (1 << OPTBIT_XZ )) + 0, // J OPT_INCLUDE_FROM = IF_FEATURE_TAR_FROM( (1 << OPTBIT_INCLUDE_FROM)) + 0, // T OPT_EXCLUDE_FROM = IF_FEATURE_TAR_FROM( (1 << OPTBIT_EXCLUDE_FROM)) + 0, // X OPT_GZIP = IF_FEATURE_SEAMLESS_GZ( (1 << OPTBIT_GZIP )) + 0, // z @@ -796,7 +802,7 @@ OPT_NOPRESERVE_PERM = IF_FEATURE_TAR_LONG_OPTIONS((1 << OPTBIT_NOPRESERVE_PERM)) + 0, // no-same-permissions OPT_OVERWRITE = IF_FEATURE_TAR_LONG_OPTIONS((1 << OPTBIT_OVERWRITE )) + 0, // overwrite - OPT_ANY_COMPRESS = (OPT_BZIP2 | OPT_LZMA | OPT_GZIP | OPT_COMPRESS), + OPT_ANY_COMPRESS = (OPT_BZIP2 | OPT_LZMA | OPT_XZ | OPT_GZIP | OPT_COMPRESS), }; #if ENABLE_FEATURE_TAR_LONG_OPTIONS static const char tar_longopts[] ALIGN1 = @@ -822,6 +828,9 @@ # if ENABLE_FEATURE_SEAMLESS_LZMA "lzma\0" No_argument "a" # endif +# if ENABLE_FEATURE_SEAMLESS_XZ + "xz\0" No_argument "J" +# endif # if ENABLE_FEATURE_TAR_FROM "files-from\0" Required_argument "T" "exclude-from\0" Required_argument "X" @@ -919,6 +928,7 @@ IF_FEATURE_TAR_CREATE( "ch" ) IF_FEATURE_SEAMLESS_BZ2( "j" ) IF_FEATURE_SEAMLESS_LZMA("a" ) + IF_FEATURE_SEAMLESS_XZ( "J" ) IF_FEATURE_TAR_FROM( "T:X:") IF_FEATURE_SEAMLESS_GZ( "z" ) IF_FEATURE_SEAMLESS_Z( "Z" ) @@ -1071,6 +1081,9 @@ if (opt & OPT_LZMA) USE_FOR_MMU(xformer = unpack_lzma_stream;) USE_FOR_NOMMU(xformer_prog = "unlzma";) + if (opt & OPT_XZ) + USE_FOR_MMU(xformer = unpack_xz_stream;) + USE_FOR_NOMMU(xformer_prog = "unxz";) open_transformer_with_sig(tar_handle->src_fd, xformer, xformer_prog); /* Can't lseek over pipes */ diff -Naur busybox-1.20.2/include/bb_archive.h busybox-1.20.2-magellan/include/bb_archive.h --- busybox-1.20.2/include/bb_archive.h 2012-07-02 16:08:25.000000000 +0200 +++ busybox-1.20.2-magellan/include/bb_archive.h 2012-07-13 12:29:25.386980771 +0200 @@ -9,6 +9,8 @@ COMPRESS_MAGIC = 0x1f9d, GZIP_MAGIC = 0x1f8b, BZIP2_MAGIC = 256 * 'B' + 'Z', + /* lzma default options: lc=3 lp=0 pb=2, historic % 256 == 0 */ + LZMA_DEFAULT_MAGIC = 0x5d00, /* .xz signature: 0xfd, '7', 'z', 'X', 'Z', 0x00 */ /* More info at: http://tukaani.org/xz/xz-file-format.txt */ XZ_MAGIC1 = 256 * 0xfd + '7', @@ -21,6 +23,8 @@ COMPRESS_MAGIC = 0x9d1f, GZIP_MAGIC = 0x8b1f, BZIP2_MAGIC = 'B' + 'Z' * 256, + /* lzma default options: lc=3 lp=0 pb=2, historic % 256 == 0 */ + LZMA_DEFAULT_MAGIC = 0x5d, XZ_MAGIC1 = 0xfd + '7' * 256, XZ_MAGIC2 = 'z' + ('X' + ('Z' + 0 * 256) * 256) * 256, XZ_MAGIC1a = 0xfd + ('7' + ('z' + 'X' * 256) * 256) * 256, @@ -180,6 +184,7 @@ char get_header_tar_gz(archive_handle_t *archive_handle) FAST_FUNC; char get_header_tar_bz2(archive_handle_t *archive_handle) FAST_FUNC; char get_header_tar_lzma(archive_handle_t *archive_handle) FAST_FUNC; +char get_header_tar_xz(archive_handle_t *archive_handle) FAST_FUNC; void seek_by_jump(int fd, off_t amount) FAST_FUNC; void seek_by_read(int fd, off_t amount) FAST_FUNC;