]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
Have xz/lzma support fall back to the unxz/unlzma command-line utilities
authorTim Kientzle <kientzle@gmail.com>
Wed, 1 Apr 2009 07:36:15 +0000 (03:36 -0400)
committerTim Kientzle <kientzle@gmail.com>
Wed, 1 Apr 2009 07:36:15 +0000 (03:36 -0400)
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

libarchive/archive_read_support_compression_xz.c
libarchive/test/test_compat_xz.c
libarchive/test/test_read_format_cpio_bin_xz.c
libarchive/test/test_read_format_txz.c

index df0518ea2e8ac19eb8245699aaed9a6f71b8e282..a3c9553c92e0d1d6084211b1d0a87d4c32c5e1b5 100644 (file)
@@ -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);
 }
 
 
index d84326f7bee73c7c7ec91599700a89646a1f27f9..9041427f8780b6f456f026c8339a8546e3ab1c55 100644 (file)
@@ -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
 }
 
 
index d29324c98eddebaff65eb87ee7af3e0d8ef64eea..e864e5a662ce90476cc895d89dffcd19a1995ac5 100644 (file)
@@ -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));
 }
 
index 2325e1d1627bf47a0b2fecd1596742e860ec2998..4d088b2e9e5a885767e780be56949e84e70693bf 100644 (file)
@@ -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));
 }