From df81ab878f0b8124f3ead12d8299abec6ce5fac3 Mon Sep 17 00:00:00 2001 From: Ron Yorston Date: Tue, 19 Jan 2021 11:47:11 +0000 Subject: libarchive: allow extraction of hard links Allow create_or_remember_link() to create hardlinks. As a result tar and cpio can now extract hard links. Since unzip only supports symlinks it sees no improvement. As before, attempts to extract symlinks result in a warning. --- archival/libarchive/unsafe_symlink_target.c | 10 +++++++--- archival/unzip.c | 5 +---- include/bb_archive.h | 7 ------- 3 files changed, 8 insertions(+), 14 deletions(-) diff --git a/archival/libarchive/unsafe_symlink_target.c b/archival/libarchive/unsafe_symlink_target.c index ff96991f5..b5f5a2670 100644 --- a/archival/libarchive/unsafe_symlink_target.c +++ b/archival/libarchive/unsafe_symlink_target.c @@ -24,12 +24,17 @@ void FAST_FUNC create_or_remember_link(llist_t **link_placeholders, ); } #else + if (hard_link) { + llist_add_to_end(link_placeholders, + xasprintf("%c%s%c%s", hard_link, linkname, '\0', target) + ); + return; + } /* symlink isn't implemented for WIN32, just issue a warning */ - bb_perror_msg("can't create %slink '%s' to '%s'", "sym", linkname, target); + bb_perror_msg("can't create symlink '%s' to '%s'", linkname, target); #endif } -#if !ENABLE_PLATFORM_MINGW32 void FAST_FUNC create_links_from_list(llist_t *list) { while (list) { @@ -46,4 +51,3 @@ void FAST_FUNC create_links_from_list(llist_t *list) list = list->link; } } -#endif diff --git a/archival/unzip.c b/archival/unzip.c index 67593d4ed..19353c708 100644 --- a/archival/unzip.c +++ b/archival/unzip.c @@ -348,9 +348,6 @@ static void unzip_create_leading_dirs(const char *fn) } #if ENABLE_FEATURE_UNZIP_CDF -#if ENABLE_PLATFORM_MINGW32 -#define unzip_extract_symlink(s, z, d) unzip_extract_symlink(z, d) -#endif static void unzip_extract_symlink(llist_t **symlink_placeholders, zip_header_t *zip, const char *dst_fn) @@ -495,7 +492,7 @@ int unzip_main(int argc, char **argv) llist_t *zaccept = NULL; llist_t *zreject = NULL; char *base_dir = NULL; -#if ENABLE_FEATURE_UNZIP_CDF && !ENABLE_PLATFORM_MINGW32 +#if ENABLE_FEATURE_UNZIP_CDF llist_t *symlink_placeholders = NULL; #endif int i; diff --git a/include/bb_archive.h b/include/bb_archive.h index 58e4c21bb..892c8a472 100644 --- a/include/bb_archive.h +++ b/include/bb_archive.h @@ -213,18 +213,11 @@ void seek_by_jump(int fd, off_t amount) FAST_FUNC; void seek_by_read(int fd, off_t amount) FAST_FUNC; const char *strip_unsafe_prefix(const char *str) FAST_FUNC; -#if ENABLE_PLATFORM_MINGW32 -#define create_or_remember_link(lp, t, ln, hl) create_or_remember_link(t, ln) -#endif void create_or_remember_link(llist_t **link_placeholders, const char *target, const char *linkname, int hard_link) FAST_FUNC; -#if !ENABLE_PLATFORM_MINGW32 void create_links_from_list(llist_t *list) FAST_FUNC; -#else -#define create_links_from_list(l) (void)0 -#endif void data_align(archive_handle_t *archive_handle, unsigned boundary) FAST_FUNC; const llist_t *find_list_entry(const llist_t *list, const char *filename) FAST_FUNC; -- cgit v1.2.3-55-g6feb