aboutsummaryrefslogtreecommitdiff
path: root/archival/libarchive
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--archival/libarchive/Kbuild.src1
-rw-r--r--archival/libarchive/decompress_unzstd.c11
-rw-r--r--archival/libarchive/filter_accept_list_reassign.c6
-rw-r--r--archival/libarchive/get_header_tar_zstd.c20
-rw-r--r--archival/libarchive/open_transformer.c5
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
43INSERT 44INSERT
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 @@
4IF_DESKTOP(long long) int FAST_FUNC 4IF_DESKTOP(long long) int FAST_FUNC
5unpack_zstd_stream(transformer_state_t *xstate) 5unpack_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
8char 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 }