From: Tim Kientzle Date: Wed, 1 Apr 2009 07:36:15 +0000 (-0400) Subject: Have xz/lzma support fall back to the unxz/unlzma command-line utilities X-Git-Tag: v2.7.0~47 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=51f0aba72f33ea741fa0024f46dcc86b17cac23e;p=thirdparty%2Flibarchive.git Have xz/lzma support fall back to the unxz/unlzma command-line utilities if the libraries were unavailable at build time. Have the public setup functions return ARCHIVE_WARN in this case. Update the tests to detect this situation and simply skip the appropriate tests. TODO: Update one of these tests to use systemf() to try running the command-line tool; if we can find it, run the test anyway. That will give us some coverage of the fallback handling. SVN-Revision: 894 --- diff --git a/libarchive/archive_read_support_compression_xz.c b/libarchive/archive_read_support_compression_xz.c index df0518ea2..a3c9553c9 100644 --- a/libarchive/archive_read_support_compression_xz.c +++ b/libarchive/archive_read_support_compression_xz.c @@ -79,8 +79,6 @@ struct private_data { /* Lzma-only filter */ static ssize_t lzma_filter_read(struct archive_read_filter *, const void **); static int lzma_filter_close(struct archive_read_filter *); -static int lzma_bidder_init(struct archive_read_filter *); - #endif /* @@ -110,7 +108,13 @@ archive_read_support_compression_xz(struct archive *_a) bidder->init = xz_bidder_init; bidder->options = NULL; bidder->free = NULL; +#if HAVE_LZMA_H && HAVE_LIBLZMA return (ARCHIVE_OK); +#else + archive_set_error(_a, ARCHIVE_ERRNO_MISC, + "Using external unxz program for xz decompression"); + return (ARCHIVE_WARN); +#endif } int @@ -127,7 +131,15 @@ archive_read_support_compression_lzma(struct archive *_a) bidder->init = lzma_bidder_init; bidder->options = NULL; bidder->free = NULL; +#if HAVE_LZMA_H && HAVE_LIBLZMA + return (ARCHIVE_OK); +#elif HAVE_LZMADEC_H && HAVE_LIBLZMADEC return (ARCHIVE_OK); +#else + archive_set_error(_a, ARCHIVE_ERRNO_MISC, + "Using external unlzma program for lzma decompression"); + return (ARCHIVE_WARN); +#endif } /* @@ -596,22 +608,34 @@ lzma_filter_close(struct archive_read_filter *self) * */ static int -lzma_bidder_init(struct archive_read_filter *filter) +lzma_bidder_init(struct archive_read_filter *self) { - archive_set_error(&filter->archive->archive, -1, - "This version of libarchive was compiled without lzma support"); - return (ARCHIVE_FATAL); + int r; + + r = __archive_read_program(self, "unlzma"); + /* Note: We set the format here even if __archive_read_program() + * above fails. We do, after all, know what the format is + * even if we weren't able to read it. */ + self->code = ARCHIVE_COMPRESSION_LZMA; + self->name = "lzma"; + return (r); } #endif /* HAVE_LZMADEC_H */ static int -xz_bidder_init(struct archive_read_filter *filter) +xz_bidder_init(struct archive_read_filter *self) { - archive_set_error(&filter->archive->archive, -1, - "This version of libarchive was compiled without xz support"); - return (ARCHIVE_FATAL); + int r; + + r = __archive_read_program(self, "unxz"); + /* Note: We set the format here even if __archive_read_program() + * above fails. We do, after all, know what the format is + * even if we weren't able to read it. */ + self->code = ARCHIVE_COMPRESSION_XZ; + self->name = "xz"; + return (r); } diff --git a/libarchive/test/test_compat_xz.c b/libarchive/test/test_compat_xz.c index d84326f7b..9041427f8 100644 --- a/libarchive/test/test_compat_xz.c +++ b/libarchive/test/test_compat_xz.c @@ -43,29 +43,25 @@ compat_xz(const char *name) const char *n[7] = { "f1", "f2", "f3", "d1/f1", "d1/f2", "d1/f3", NULL }; struct archive_entry *ae; struct archive *a; - int i,r; + int i, r; assert((a = archive_read_new()) != NULL); assertEqualIntA(a, ARCHIVE_OK, archive_read_support_compression_all(a)); + r = archive_read_support_compression_xz(a); + if (r == ARCHIVE_WARN) { + skipping("xz reading not fully supported on this platform"); + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); + return; + } assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); extract_reference_file(name); assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, name, 2)); /* Read entries, match up names with list above. */ for (i = 0; i < 6; ++i) { - r = archive_read_next_header(a, &ae); - if (UnsupportedCompress(r, a)) { - skipping("Skipping XZ compression check: " - "This version of libarchive was compiled " - "without xz support"); - goto finish; - } failure("Could not read file %d (%s) from %s", i, n[i], name); - assertEqualIntA(a, ARCHIVE_OK, r); - if (r != ARCHIVE_OK) { - archive_read_finish(a); - return; - } + assertEqualIntA(a, ARCHIVE_OK, + archive_read_next_header(a, &ae)); assertEqualString(n[i], archive_entry_pathname(ae)); } @@ -78,12 +74,7 @@ compat_xz(const char *name) assertEqualInt(archive_format(a), ARCHIVE_FORMAT_TAR_USTAR); assertEqualInt(ARCHIVE_OK, archive_read_close(a)); -finish: -#if ARCHIVE_VERSION_NUMBER < 2000000 - archive_read_finish(a); -#else assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); -#endif } diff --git a/libarchive/test/test_read_format_cpio_bin_xz.c b/libarchive/test/test_read_format_cpio_bin_xz.c index d29324c98..e864e5a66 100644 --- a/libarchive/test/test_read_format_cpio_bin_xz.c +++ b/libarchive/test/test_read_format_cpio_bin_xz.c @@ -51,25 +51,20 @@ DEFINE_TEST(test_read_format_cpio_bin_xz) int r; assert((a = archive_read_new()) != NULL); - assert(0 == archive_read_support_compression_all(a)); - assert(0 == archive_read_support_format_all(a)); - assert(0 == archive_read_open_memory(a, archive, sizeof(archive))); - r = archive_read_next_header(a, &ae); - if (UnsupportedCompress(r, a)) { - skipping("Skipping XZ compression check: " - "This version of libarchive was compiled " - "without xz support"); - goto finish; + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_compression_all(a)); + r = archive_read_support_compression_xz(a); + if (r == ARCHIVE_WARN) { + skipping("xz reading not fully supported on this platform"); + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); + return; } - assert(0 == r); - assert(archive_compression(a) == ARCHIVE_COMPRESSION_XZ); - assert(archive_format(a) == ARCHIVE_FORMAT_CPIO_BIN_LE); - assert(0 == archive_read_close(a)); -finish: -#if ARCHIVE_VERSION_NUMBER < 2000000 - archive_read_finish(a); -#else - assert(0 == archive_read_finish(a)); -#endif + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_open_memory(a, archive, sizeof(archive))); + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualInt(archive_compression(a), ARCHIVE_COMPRESSION_XZ); + assertEqualInt(archive_format(a), ARCHIVE_FORMAT_CPIO_BIN_LE); + assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); } diff --git a/libarchive/test/test_read_format_txz.c b/libarchive/test/test_read_format_txz.c index 2325e1d16..4d088b2e9 100644 --- a/libarchive/test/test_read_format_txz.c +++ b/libarchive/test/test_read_format_txz.c @@ -45,24 +45,19 @@ DEFINE_TEST(test_read_format_txz) int r; assert((a = archive_read_new()) != NULL); - assert(0 == archive_read_support_compression_all(a)); - assert(0 == archive_read_support_format_all(a)); - assert(0 == archive_read_open_memory(a, archive, sizeof(archive))); - r = archive_read_next_header(a, &ae); - if (UnsupportedCompress(r, a)) { - skipping("Skipping XZ compression check: " - "This version of libarchive was compiled " - "without xz support"); - goto finish; + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_compression_all(a)); + r = archive_read_support_compression_xz(a); + if (r == ARCHIVE_WARN) { + skipping("xz reading not fully supported on this platform"); + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); + return; } - assert(0 == r); - assert(archive_compression(a) == ARCHIVE_COMPRESSION_XZ); - assert(archive_format(a) == ARCHIVE_FORMAT_TAR_USTAR); - assert(0 == archive_read_close(a)); -finish: -#if ARCHIVE_VERSION_NUMBER < 2000000 - archive_read_finish(a); -#else - assert(0 == archive_read_finish(a)); -#endif + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_open_memory(a, archive, sizeof(archive))); + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualInt(archive_compression(a), ARCHIVE_COMPRESSION_XZ); + assertEqualInt(archive_format(a), ARCHIVE_FORMAT_TAR_USTAR); + assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); }