According to the deb(5) man page the tar files contained in a deb file can be compressed as follows:
control.tar: uncompressed, gz, xz data.tar: uncompressed, gz, bz2, lzma, xz Signed-off-by: Ron Yorston <[email protected]> --- archival/dpkg.c | 12 ++++++++++-- archival/dpkg_deb.c | 8 ++++++-- archival/libarchive/Kbuild.src | 1 + archival/libarchive/filter_accept_list_reassign.c | 10 ++++++++++ include/bb_archive.h | 1 + 5 files changed, 28 insertions(+), 4 deletions(-) diff --git a/archival/dpkg.c b/archival/dpkg.c index 2893cfc..104f47d 100644 --- a/archival/dpkg.c +++ b/archival/dpkg.c @@ -1472,11 +1472,12 @@ static void init_archive_deb_control(archive_handle_t *ar_handle) tar_handle->src_fd = ar_handle->src_fd; /* We don't care about data.tar.* or debian-binary, just control.tar.* */ + llist_add_to(&(ar_handle->accept), (char*)"control.tar"); #if ENABLE_FEATURE_SEAMLESS_GZ llist_add_to(&(ar_handle->accept), (char*)"control.tar.gz"); #endif -#if ENABLE_FEATURE_SEAMLESS_BZ2 - llist_add_to(&(ar_handle->accept), (char*)"control.tar.bz2"); +#if ENABLE_FEATURE_SEAMLESS_XZ + llist_add_to(&(ar_handle->accept), (char*)"control.tar.xz"); #endif /* Assign the tar handle as a subarchive of the ar handle */ @@ -1492,12 +1493,19 @@ static void init_archive_deb_data(archive_handle_t *ar_handle) tar_handle->src_fd = ar_handle->src_fd; /* We don't care about control.tar.* or debian-binary, just data.tar.* */ + llist_add_to(&(ar_handle->accept), (char*)"data.tar"); #if ENABLE_FEATURE_SEAMLESS_GZ llist_add_to(&(ar_handle->accept), (char*)"data.tar.gz"); #endif #if ENABLE_FEATURE_SEAMLESS_BZ2 llist_add_to(&(ar_handle->accept), (char*)"data.tar.bz2"); #endif +#if ENABLE_FEATURE_SEAMLESS_LZMA + llist_add_to(&(ar_handle->accept), (char*)"data.tar.lzma"); +#endif +#if ENABLE_FEATURE_SEAMLESS_XZ + llist_add_to(&(ar_handle->accept), (char*)"data.tar.xz"); +#endif /* Assign the tar handle as a subarchive of the ar handle */ ar_handle->dpkg__sub_archive = tar_handle; diff --git a/archival/dpkg_deb.c b/archival/dpkg_deb.c index 13f9db9..b1e46a8 100644 --- a/archival/dpkg_deb.c +++ b/archival/dpkg_deb.c @@ -70,17 +70,21 @@ int dpkg_deb_main(int argc, char **argv) ar_archive->dpkg__sub_archive = tar_archive; ar_archive->filter = filter_accept_list_reassign; + llist_add_to(&ar_archive->accept, (char*)"data.tar"); + llist_add_to(&control_tar_llist, (char*)"control.tar"); #if ENABLE_FEATURE_SEAMLESS_GZ llist_add_to(&ar_archive->accept, (char*)"data.tar.gz"); llist_add_to(&control_tar_llist, (char*)"control.tar.gz"); #endif #if ENABLE_FEATURE_SEAMLESS_BZ2 llist_add_to(&ar_archive->accept, (char*)"data.tar.bz2"); - llist_add_to(&control_tar_llist, (char*)"control.tar.bz2"); #endif #if ENABLE_FEATURE_SEAMLESS_LZMA llist_add_to(&ar_archive->accept, (char*)"data.tar.lzma"); - llist_add_to(&control_tar_llist, (char*)"control.tar.lzma"); +#endif +#if ENABLE_FEATURE_SEAMLESS_XZ + llist_add_to(&ar_archive->accept, (char*)"data.tar.xz"); + llist_add_to(&control_tar_llist, (char*)"control.tar.xz"); #endif opt_complementary = "c--efXx:e--cfXx:f--ceXx:X--cefx:x--cefX"; diff --git a/archival/libarchive/Kbuild.src b/archival/libarchive/Kbuild.src index 968fdf8..7e89e9e 100644 --- a/archival/libarchive/Kbuild.src +++ b/archival/libarchive/Kbuild.src @@ -35,6 +35,7 @@ DPKG_FILES:= \ get_header_tar_gz.o \ get_header_tar_bz2.o \ get_header_tar_lzma.o \ + get_header_tar_xz.o \ INSERT diff --git a/archival/libarchive/filter_accept_list_reassign.c b/archival/libarchive/filter_accept_list_reassign.c index 3d19abe..b9acfbc 100644 --- a/archival/libarchive/filter_accept_list_reassign.c +++ b/archival/libarchive/filter_accept_list_reassign.c @@ -28,6 +28,10 @@ char FAST_FUNC filter_accept_list_reassign(archive_handle_t *archive_handle) name_ptr++; /* Modify the subarchive handler based on the extension */ + if (strcmp(name_ptr, "tar") == 0) { + archive_handle->dpkg__action_data_subarchive = get_header_tar; + return EXIT_SUCCESS; + } if (ENABLE_FEATURE_SEAMLESS_GZ && strcmp(name_ptr, "gz") == 0 ) { @@ -46,6 +50,12 @@ char FAST_FUNC filter_accept_list_reassign(archive_handle_t *archive_handle) 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 --git a/include/bb_archive.h b/include/bb_archive.h index b82cfd8..242a7d0 100644 --- a/include/bb_archive.h +++ b/include/bb_archive.h @@ -184,6 +184,7 @@ char get_header_tar(archive_handle_t *archive_handle) FAST_FUNC; 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; -- 1.9.3 _______________________________________________ busybox mailing list [email protected] http://lists.busybox.net/mailman/listinfo/busybox
