]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
Replace archive_write_zip_set_deflate and archive_write_zip_set_store
authorJoerg Sonnenberger <joerg.sonnenberger@gmail.com>
Tue, 26 May 2009 20:21:39 +0000 (16:21 -0400)
committerJoerg Sonnenberger <joerg.sonnenberger@gmail.com>
Tue, 26 May 2009 20:21:39 +0000 (16:21 -0400)
with options.

SVN-Revision: 1136

libarchive/archive.h
libarchive/archive_write_set_format_zip.c
libarchive/test/test_write_format_zip.c
libarchive/test/test_write_format_zip_no_compression.c
tar/bsdtar.1

index 22f17b8ec5b2d7b152225227e7cd86d014434d7a..3371064b080607d6ac896d85ec3a6b0f46d22f38 100644 (file)
@@ -530,8 +530,6 @@ __LA_DECL int                archive_write_set_format_shar(struct archive *);
 __LA_DECL int           archive_write_set_format_shar_dump(struct archive *);
 __LA_DECL int           archive_write_set_format_ustar(struct archive *);
 __LA_DECL int           archive_write_set_format_zip(struct archive *);
-__LA_DECL int           archive_write_zip_set_deflate(struct archive *);
-__LA_DECL int           archive_write_zip_set_store(struct archive *);
 __LA_DECL int           archive_write_open(struct archive *, void *,
                     archive_open_callback *, archive_write_callback *,
                     archive_close_callback *);
index 61fffc47ba529222a4d3d8dd6054da53d9b69875..8a2397a63dcb8d371c16c6c215ca418e252767ab 100644 (file)
@@ -197,6 +197,29 @@ struct zip_central_directory_end {
        char comment_length[2];
 };
 
+static int
+archive_write_zip_options(struct archive_write *a, const char *key,
+    const char *value)
+{
+       struct zip *zip = a->format_data;
+
+       if (strcmp(key, "compression") == 0) {
+               if (strcmp(value, "deflate") == 0) {
+#ifdef HAVE_ZLIB_H
+                       zip->compression = COMPRESSION_DEFLATE;
+#else
+                       archive_set_error(_a, ARCHIVE_ERRNO_MISC, "deflate compression not supported");
+                       return ARCHIVE_WARN;
+#endif
+               } else if (strcmp(value, "store") == 0)
+                       zip->compression = COMPRESSION_STORE;
+               else
+                       return (ARCHIVE_WARN);
+               return (ARCHIVE_OK);
+       }
+       return (ARCHIVE_WARN);
+}
+
 int
 archive_write_set_format_zip(struct archive *_a)
 {
@@ -233,6 +256,8 @@ archive_write_set_format_zip(struct archive *_a)
        a->format_data = zip;
 
        a->pad_uncompressed = 0; /* Actually not needed for now, since no compression support yet. */
+       a->format_name = "zip";
+       a->format_options = archive_write_zip_options;
        a->format_write_header = archive_write_zip_header;
        a->format_write_data = archive_write_zip_data;
        a->format_finish_entry = archive_write_zip_finish_entry;
@@ -250,29 +275,6 @@ archive_write_set_format_zip(struct archive *_a)
        return (ARCHIVE_OK);
 }
 
-int
-archive_write_zip_set_store(struct archive *_a)
-{
-       struct archive_write *a = (struct archive_write *)_a;
-       struct zip *zip = a->format_data;
-       zip->compression = COMPRESSION_STORE;
-       return (ARCHIVE_OK);
-}
-
-int
-archive_write_zip_set_deflate(struct archive *_a)
-{
-#ifdef HAVE_ZLIB_H
-       struct archive_write *a = (struct archive_write *)_a;
-       struct zip *zip = a->format_data;
-       zip->compression = COMPRESSION_DEFLATE;
-       return (ARCHIVE_OK);
-#else
-       archive_set_error(_a, ARCHIVE_ERRNO_MISC, "Filetype not supported");
-       return ARCHIVE_FATAL;
-#endif
-}
-
 static int
 archive_write_zip_header(struct archive_write *a, struct archive_entry *entry)
 {
index de8d11d1592b5da5bb2e7ee1f791c3599aa0058f..f4c51f34ba93c13c7921b2e804dbe2b37366d4af 100644 (file)
@@ -41,6 +41,7 @@ DEFINE_TEST(test_write_format_zip)
        size_t used;
        size_t buffsize = 1000000;
        char *buff;
+       const char *compression_type;
 
        buff = malloc(buffsize);
 
@@ -48,10 +49,12 @@ DEFINE_TEST(test_write_format_zip)
        assert((a = archive_write_new()) != NULL);
        assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_zip(a));
 #ifdef HAVE_ZLIB_H
-       assertEqualIntA(a, ARCHIVE_OK, archive_write_zip_set_deflate(a));
+       compression_type = "zip:compression=deflate";
 #else
-       assertEqualIntA(a, ARCHIVE_OK, archive_write_zip_set_store(a));
+       compression_type = "zip:compression=store";
 #endif
+       assertEqualIntA(a, ARCHIVE_OK,
+           archive_write_set_format_options(a, compression_type));
        assertEqualIntA(a, ARCHIVE_OK, archive_write_set_compression_none(a));
        assertEqualIntA(a, ARCHIVE_OK,
            archive_write_open_memory(a, buff, buffsize, &used));
index 5bed1ded9dad285bf7b6f0c1a50e4ee004b75c14..63e76b67038702cc9a0c67baa72b2cdb16a997ae 100644 (file)
@@ -98,7 +98,7 @@ DEFINE_TEST(test_write_format_zip_no_compression)
        /* Create new ZIP archive in memory without padding. */
        assert((a = archive_write_new()) != NULL);
        assertA(0 == archive_write_set_format_zip(a));
-       assertA(0 == archive_write_zip_set_store(a));
+       assertA(0 == archive_write_set_format_options(a, "zip:compression=store"));
        assertA(0 == archive_write_set_compression_none(a));
        assertA(0 == archive_write_set_bytes_per_block(a, 1));
        assertA(0 == archive_write_set_bytes_in_last_block(a, 1));
index 23e322ecd030841e5d74375f529c5d07bde94ac6..80da3c0041b5fd5347747786c9b770cb940f28c3 100644 (file)
@@ -361,6 +361,11 @@ lines in the output.
 .It Cm mtree:indent
 Produce human-readable output by indenting options and splitting lines
 to fit into 80 columns.
+.It Cm zip:compression Ns = Ns Ar type
+Use
+.Ar type
+as compression method.
+Supported values are store (uncompressed) and deflate (gzip algorithm).
 .El
 If a provided option is not supported by any module, that
 is a fatal error.