diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2015-01-30 15:15:38 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2015-01-30 15:15:38 +0100 |
commit | 08f9ffc3f7503eb3dc94f16c615b20d2ae9a059c (patch) | |
tree | 7f4ad348cc275500a72a6c7ea3dab015bce2221b | |
parent | 8c05a74f7efcda6ae5bd83e134edf44af12cb5e4 (diff) | |
download | busybox-w32-08f9ffc3f7503eb3dc94f16c615b20d2ae9a059c.tar.gz busybox-w32-08f9ffc3f7503eb3dc94f16c615b20d2ae9a059c.tar.bz2 busybox-w32-08f9ffc3f7503eb3dc94f16c615b20d2ae9a059c.zip |
dpkg: update supported compression methods
Based on a patch by Ron Yorston <rmy@tigress.co.uk>
function old new delta
get_header_tar_xz - 60 +60
filter_accept_list_reassign 128 188 +60
unpack_package 585 621 +36
init_archive_deb_control 52 76 +24
------------------------------------------------------------------------------
(add/remove: 2/0 grow/shrink: 3/0 up/down: 180/0) Total: 180 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | archival/dpkg.c | 11 | ||||
-rw-r--r-- | archival/dpkg_deb.c | 6 | ||||
-rw-r--r-- | archival/libarchive/Kbuild.src | 1 | ||||
-rw-r--r-- | archival/libarchive/filter_accept_list_reassign.c | 10 | ||||
-rw-r--r-- | archival/libarchive/get_header_tar_xz.c | 21 | ||||
-rw-r--r-- | include/bb_archive.h | 1 |
6 files changed, 50 insertions, 0 deletions
diff --git a/archival/dpkg.c b/archival/dpkg.c index 2893cfc2d..151f0ca43 100644 --- a/archival/dpkg.c +++ b/archival/dpkg.c | |||
@@ -1472,12 +1472,16 @@ static void init_archive_deb_control(archive_handle_t *ar_handle) | |||
1472 | tar_handle->src_fd = ar_handle->src_fd; | 1472 | tar_handle->src_fd = ar_handle->src_fd; |
1473 | 1473 | ||
1474 | /* We don't care about data.tar.* or debian-binary, just control.tar.* */ | 1474 | /* We don't care about data.tar.* or debian-binary, just control.tar.* */ |
1475 | llist_add_to(&(ar_handle->accept), (char*)"control.tar"); | ||
1475 | #if ENABLE_FEATURE_SEAMLESS_GZ | 1476 | #if ENABLE_FEATURE_SEAMLESS_GZ |
1476 | llist_add_to(&(ar_handle->accept), (char*)"control.tar.gz"); | 1477 | llist_add_to(&(ar_handle->accept), (char*)"control.tar.gz"); |
1477 | #endif | 1478 | #endif |
1478 | #if ENABLE_FEATURE_SEAMLESS_BZ2 | 1479 | #if ENABLE_FEATURE_SEAMLESS_BZ2 |
1479 | llist_add_to(&(ar_handle->accept), (char*)"control.tar.bz2"); | 1480 | llist_add_to(&(ar_handle->accept), (char*)"control.tar.bz2"); |
1480 | #endif | 1481 | #endif |
1482 | #if ENABLE_FEATURE_SEAMLESS_XZ | ||
1483 | llist_add_to(&(ar_handle->accept), (char*)"control.tar.xz"); | ||
1484 | #endif | ||
1481 | 1485 | ||
1482 | /* Assign the tar handle as a subarchive of the ar handle */ | 1486 | /* Assign the tar handle as a subarchive of the ar handle */ |
1483 | ar_handle->dpkg__sub_archive = tar_handle; | 1487 | ar_handle->dpkg__sub_archive = tar_handle; |
@@ -1492,12 +1496,19 @@ static void init_archive_deb_data(archive_handle_t *ar_handle) | |||
1492 | tar_handle->src_fd = ar_handle->src_fd; | 1496 | tar_handle->src_fd = ar_handle->src_fd; |
1493 | 1497 | ||
1494 | /* We don't care about control.tar.* or debian-binary, just data.tar.* */ | 1498 | /* We don't care about control.tar.* or debian-binary, just data.tar.* */ |
1499 | llist_add_to(&(ar_handle->accept), (char*)"data.tar"); | ||
1495 | #if ENABLE_FEATURE_SEAMLESS_GZ | 1500 | #if ENABLE_FEATURE_SEAMLESS_GZ |
1496 | llist_add_to(&(ar_handle->accept), (char*)"data.tar.gz"); | 1501 | llist_add_to(&(ar_handle->accept), (char*)"data.tar.gz"); |
1497 | #endif | 1502 | #endif |
1498 | #if ENABLE_FEATURE_SEAMLESS_BZ2 | 1503 | #if ENABLE_FEATURE_SEAMLESS_BZ2 |
1499 | llist_add_to(&(ar_handle->accept), (char*)"data.tar.bz2"); | 1504 | llist_add_to(&(ar_handle->accept), (char*)"data.tar.bz2"); |
1500 | #endif | 1505 | #endif |
1506 | #if ENABLE_FEATURE_SEAMLESS_LZMA | ||
1507 | llist_add_to(&(ar_handle->accept), (char*)"data.tar.lzma"); | ||
1508 | #endif | ||
1509 | #if ENABLE_FEATURE_SEAMLESS_XZ | ||
1510 | llist_add_to(&(ar_handle->accept), (char*)"data.tar.xz"); | ||
1511 | #endif | ||
1501 | 1512 | ||
1502 | /* Assign the tar handle as a subarchive of the ar handle */ | 1513 | /* Assign the tar handle as a subarchive of the ar handle */ |
1503 | ar_handle->dpkg__sub_archive = tar_handle; | 1514 | ar_handle->dpkg__sub_archive = tar_handle; |
diff --git a/archival/dpkg_deb.c b/archival/dpkg_deb.c index 13f9db991..0285273fe 100644 --- a/archival/dpkg_deb.c +++ b/archival/dpkg_deb.c | |||
@@ -70,6 +70,8 @@ int dpkg_deb_main(int argc, char **argv) | |||
70 | ar_archive->dpkg__sub_archive = tar_archive; | 70 | ar_archive->dpkg__sub_archive = tar_archive; |
71 | ar_archive->filter = filter_accept_list_reassign; | 71 | ar_archive->filter = filter_accept_list_reassign; |
72 | 72 | ||
73 | llist_add_to(&ar_archive->accept, (char*)"data.tar"); | ||
74 | llist_add_to(&control_tar_llist, (char*)"control.tar"); | ||
73 | #if ENABLE_FEATURE_SEAMLESS_GZ | 75 | #if ENABLE_FEATURE_SEAMLESS_GZ |
74 | llist_add_to(&ar_archive->accept, (char*)"data.tar.gz"); | 76 | llist_add_to(&ar_archive->accept, (char*)"data.tar.gz"); |
75 | llist_add_to(&control_tar_llist, (char*)"control.tar.gz"); | 77 | llist_add_to(&control_tar_llist, (char*)"control.tar.gz"); |
@@ -82,6 +84,10 @@ int dpkg_deb_main(int argc, char **argv) | |||
82 | llist_add_to(&ar_archive->accept, (char*)"data.tar.lzma"); | 84 | llist_add_to(&ar_archive->accept, (char*)"data.tar.lzma"); |
83 | llist_add_to(&control_tar_llist, (char*)"control.tar.lzma"); | 85 | llist_add_to(&control_tar_llist, (char*)"control.tar.lzma"); |
84 | #endif | 86 | #endif |
87 | #if ENABLE_FEATURE_SEAMLESS_XZ | ||
88 | llist_add_to(&ar_archive->accept, (char*)"data.tar.xz"); | ||
89 | llist_add_to(&control_tar_llist, (char*)"control.tar.xz"); | ||
90 | #endif | ||
85 | 91 | ||
86 | opt_complementary = "c--efXx:e--cfXx:f--ceXx:X--cefx:x--cefX"; | 92 | opt_complementary = "c--efXx:e--cfXx:f--ceXx:X--cefx:x--cefX"; |
87 | opt = getopt32(argv, "cefXx"); | 93 | opt = getopt32(argv, "cefXx"); |
diff --git a/archival/libarchive/Kbuild.src b/archival/libarchive/Kbuild.src index 968fdf8ab..7e89e9e89 100644 --- a/archival/libarchive/Kbuild.src +++ b/archival/libarchive/Kbuild.src | |||
@@ -35,6 +35,7 @@ DPKG_FILES:= \ | |||
35 | get_header_tar_gz.o \ | 35 | get_header_tar_gz.o \ |
36 | get_header_tar_bz2.o \ | 36 | get_header_tar_bz2.o \ |
37 | get_header_tar_lzma.o \ | 37 | get_header_tar_lzma.o \ |
38 | get_header_tar_xz.o \ | ||
38 | 39 | ||
39 | INSERT | 40 | INSERT |
40 | 41 | ||
diff --git a/archival/libarchive/filter_accept_list_reassign.c b/archival/libarchive/filter_accept_list_reassign.c index 3d19abe44..b9acfbc05 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) | |||
28 | name_ptr++; | 28 | name_ptr++; |
29 | 29 | ||
30 | /* Modify the subarchive handler based on the extension */ | 30 | /* Modify the subarchive handler based on the extension */ |
31 | if (strcmp(name_ptr, "tar") == 0) { | ||
32 | archive_handle->dpkg__action_data_subarchive = get_header_tar; | ||
33 | return EXIT_SUCCESS; | ||
34 | } | ||
31 | if (ENABLE_FEATURE_SEAMLESS_GZ | 35 | if (ENABLE_FEATURE_SEAMLESS_GZ |
32 | && strcmp(name_ptr, "gz") == 0 | 36 | && strcmp(name_ptr, "gz") == 0 |
33 | ) { | 37 | ) { |
@@ -46,6 +50,12 @@ char FAST_FUNC filter_accept_list_reassign(archive_handle_t *archive_handle) | |||
46 | archive_handle->dpkg__action_data_subarchive = get_header_tar_lzma; | 50 | archive_handle->dpkg__action_data_subarchive = get_header_tar_lzma; |
47 | return EXIT_SUCCESS; | 51 | return EXIT_SUCCESS; |
48 | } | 52 | } |
53 | if (ENABLE_FEATURE_SEAMLESS_XZ | ||
54 | && strcmp(name_ptr, "xz") == 0 | ||
55 | ) { | ||
56 | archive_handle->dpkg__action_data_subarchive = get_header_tar_xz; | ||
57 | return EXIT_SUCCESS; | ||
58 | } | ||
49 | } | 59 | } |
50 | return EXIT_FAILURE; | 60 | return EXIT_FAILURE; |
51 | } | 61 | } |
diff --git a/archival/libarchive/get_header_tar_xz.c b/archival/libarchive/get_header_tar_xz.c new file mode 100644 index 000000000..7bf3b3b56 --- /dev/null +++ b/archival/libarchive/get_header_tar_xz.c | |||
@@ -0,0 +1,21 @@ | |||
1 | /* vi: set sw=4 ts=4: */ | ||
2 | /* | ||
3 | * Licensed under GPLv2 or later, see file LICENSE in this source tree. | ||
4 | */ | ||
5 | |||
6 | #include "libbb.h" | ||
7 | #include "bb_archive.h" | ||
8 | |||
9 | char FAST_FUNC get_header_tar_xz(archive_handle_t *archive_handle) | ||
10 | { | ||
11 | /* Can't lseek over pipes */ | ||
12 | archive_handle->seek = seek_by_read; | ||
13 | |||
14 | fork_transformer_with_sig(archive_handle->src_fd, unpack_xz_stream, "unxz"); | ||
15 | archive_handle->offset = 0; | ||
16 | while (get_header_tar(archive_handle) == EXIT_SUCCESS) | ||
17 | continue; | ||
18 | |||
19 | /* Can only do one file at a time */ | ||
20 | return EXIT_FAILURE; | ||
21 | } | ||
diff --git a/include/bb_archive.h b/include/bb_archive.h index a6b166fe3..5d9e24c17 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; | |||
184 | char get_header_tar_gz(archive_handle_t *archive_handle) FAST_FUNC; | 184 | char get_header_tar_gz(archive_handle_t *archive_handle) FAST_FUNC; |
185 | char get_header_tar_bz2(archive_handle_t *archive_handle) FAST_FUNC; | 185 | char get_header_tar_bz2(archive_handle_t *archive_handle) FAST_FUNC; |
186 | char get_header_tar_lzma(archive_handle_t *archive_handle) FAST_FUNC; | 186 | char get_header_tar_lzma(archive_handle_t *archive_handle) FAST_FUNC; |
187 | char get_header_tar_xz(archive_handle_t *archive_handle) FAST_FUNC; | ||
187 | 188 | ||
188 | void seek_by_jump(int fd, off_t amount) FAST_FUNC; | 189 | void seek_by_jump(int fd, off_t amount) FAST_FUNC; |
189 | void seek_by_read(int fd, off_t amount) FAST_FUNC; | 190 | void seek_by_read(int fd, off_t amount) FAST_FUNC; |