diff options
Diffstat (limited to '')
| -rw-r--r-- | archival/libarchive/Kbuild.src | 1 | ||||
| -rw-r--r-- | archival/libarchive/decompress_unzstd.c | 11 | ||||
| -rw-r--r-- | archival/libarchive/filter_accept_list_reassign.c | 6 | ||||
| -rw-r--r-- | archival/libarchive/get_header_tar_zstd.c | 20 | ||||
| -rw-r--r-- | archival/libarchive/open_transformer.c | 5 |
5 files changed, 33 insertions, 10 deletions
diff --git a/archival/libarchive/Kbuild.src b/archival/libarchive/Kbuild.src index 70c7fae5b..1af3cf61d 100644 --- a/archival/libarchive/Kbuild.src +++ b/archival/libarchive/Kbuild.src | |||
| @@ -39,6 +39,7 @@ DPKG_FILES:= \ | |||
| 39 | get_header_tar_bz2.o \ | 39 | get_header_tar_bz2.o \ |
| 40 | get_header_tar_lzma.o \ | 40 | get_header_tar_lzma.o \ |
| 41 | get_header_tar_xz.o \ | 41 | get_header_tar_xz.o \ |
| 42 | get_header_tar_zstd.o \ | ||
| 42 | 43 | ||
| 43 | INSERT | 44 | INSERT |
| 44 | 45 | ||
diff --git a/archival/libarchive/decompress_unzstd.c b/archival/libarchive/decompress_unzstd.c index 08930a3e5..c55ab8575 100644 --- a/archival/libarchive/decompress_unzstd.c +++ b/archival/libarchive/decompress_unzstd.c | |||
| @@ -4,16 +4,9 @@ | |||
| 4 | IF_DESKTOP(long long) int FAST_FUNC | 4 | IF_DESKTOP(long long) int FAST_FUNC |
| 5 | unpack_zstd_stream(transformer_state_t *xstate) | 5 | unpack_zstd_stream(transformer_state_t *xstate) |
| 6 | { | 6 | { |
| 7 | char *argv[] = {(char *)"unzstd", NULL}; | 7 | // FIXME Provide an internal implementation of zstd decompression. |
| 8 | char *argv[] = {(char *)"unzstd", (char *)"-cf", (char *)"-", NULL}; | ||
| 8 | 9 | ||
| 9 | /* Exec external unzstd. */ | ||
| 10 | #if BB_MMU | ||
| 11 | if (xstate->signature_skipped) { | ||
| 12 | /* If called from fork_transformer_with_no_sig() signature_skipped | ||
| 13 | * is just a flag, not the actual offset. But we know it's 4. */ | ||
| 14 | xlseek(xstate->src_fd, -4, SEEK_CUR); | ||
| 15 | } | ||
| 16 | #endif | ||
| 17 | xmove_fd(xstate->src_fd, STDIN_FILENO); | 10 | xmove_fd(xstate->src_fd, STDIN_FILENO); |
| 18 | xmove_fd(xstate->dst_fd, STDOUT_FILENO); | 11 | xmove_fd(xstate->dst_fd, STDOUT_FILENO); |
| 19 | BB_EXECVP_or_die(argv); | 12 | BB_EXECVP_or_die(argv); |
diff --git a/archival/libarchive/filter_accept_list_reassign.c b/archival/libarchive/filter_accept_list_reassign.c index 826c5c29d..a78186a6e 100644 --- a/archival/libarchive/filter_accept_list_reassign.c +++ b/archival/libarchive/filter_accept_list_reassign.c | |||
| @@ -55,6 +55,12 @@ char FAST_FUNC filter_accept_list_reassign(archive_handle_t *archive_handle) | |||
| 55 | archive_handle->dpkg__action_data_subarchive = get_header_tar_xz; | 55 | archive_handle->dpkg__action_data_subarchive = get_header_tar_xz; |
| 56 | return EXIT_SUCCESS; | 56 | return EXIT_SUCCESS; |
| 57 | } | 57 | } |
| 58 | if (ENABLE_FEATURE_SEAMLESS_ZSTD | ||
| 59 | && strcmp(name_ptr, "zst") == 0 | ||
| 60 | ) { | ||
| 61 | archive_handle->dpkg__action_data_subarchive = get_header_tar_zstd; | ||
| 62 | return EXIT_SUCCESS; | ||
| 63 | } | ||
| 58 | } | 64 | } |
| 59 | return EXIT_FAILURE; | 65 | return EXIT_FAILURE; |
| 60 | } | 66 | } |
diff --git a/archival/libarchive/get_header_tar_zstd.c b/archival/libarchive/get_header_tar_zstd.c new file mode 100644 index 000000000..6f1b4b977 --- /dev/null +++ b/archival/libarchive/get_header_tar_zstd.c | |||
| @@ -0,0 +1,20 @@ | |||
| 1 | /* vi: set sw=4 ts=4: */ | ||
| 2 | /* | ||
| 3 | * Licensed under GPLv2 or later, see file LICENSE in this source tree. | ||
| 4 | */ | ||
| 5 | #include "libbb.h" | ||
| 6 | #include "bb_archive.h" | ||
| 7 | |||
| 8 | char FAST_FUNC get_header_tar_zstd(archive_handle_t *archive_handle) | ||
| 9 | { | ||
| 10 | /* Can't lseek over pipes */ | ||
| 11 | archive_handle->seek = seek_by_read; | ||
| 12 | |||
| 13 | fork_transformer_with_sig(archive_handle->src_fd, unpack_zstd_stream, "unzstd"); | ||
| 14 | archive_handle->offset = 0; | ||
| 15 | while (get_header_tar(archive_handle) == EXIT_SUCCESS) | ||
| 16 | continue; | ||
| 17 | |||
| 18 | /* Can only do one file at a time */ | ||
| 19 | return EXIT_FAILURE; | ||
| 20 | } | ||
diff --git a/archival/libarchive/open_transformer.c b/archival/libarchive/open_transformer.c index 9f41c7b4f..375e7b249 100644 --- a/archival/libarchive/open_transformer.c +++ b/archival/libarchive/open_transformer.c | |||
| @@ -211,11 +211,14 @@ static transformer_state_t *setup_transformer_on_fd(int fd, int die_if_not_compr | |||
| 211 | } | 211 | } |
| 212 | 212 | ||
| 213 | if (ENABLE_FEATURE_SEAMLESS_ZSTD && xstate->magic.b16[0] == ZSTD_MAGIC1) { | 213 | if (ENABLE_FEATURE_SEAMLESS_ZSTD && xstate->magic.b16[0] == ZSTD_MAGIC1) { |
| 214 | xstate->signature_skipped = 4; | ||
| 215 | xread(fd, &xstate->magic.b16[1], 2); | 214 | xread(fd, &xstate->magic.b16[1], 2); |
| 216 | if (xstate->magic.b16[1] == ZSTD_MAGIC2) { | 215 | if (xstate->magic.b16[1] == ZSTD_MAGIC2) { |
| 217 | xstate->xformer = unpack_zstd_stream; | 216 | xstate->xformer = unpack_zstd_stream; |
| 218 | USE_FOR_NOMMU(xstate->xformer_prog = "unzstd";) | 217 | USE_FOR_NOMMU(xstate->xformer_prog = "unzstd";) |
| 218 | // FIXME We execute an external decompressor even on MMU. | ||
| 219 | // Force a seek back to the signature. | ||
| 220 | xstate->signature_skipped = 0; | ||
| 221 | xlseek(xstate->src_fd, -4, SEEK_CUR); | ||
| 219 | goto found_magic; | 222 | goto found_magic; |
| 220 | } | 223 | } |
| 221 | } | 224 | } |
