From: Joerg Sonnenberger Date: Tue, 26 May 2009 20:21:39 +0000 (-0400) Subject: Replace archive_write_zip_set_deflate and archive_write_zip_set_store X-Git-Tag: v2.8.0~608 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=35164b8c5079b3f7c6d4dc6d7404d6bd7dc81950;p=thirdparty%2Flibarchive.git Replace archive_write_zip_set_deflate and archive_write_zip_set_store with options. SVN-Revision: 1136 --- diff --git a/libarchive/archive.h b/libarchive/archive.h index 22f17b8ec..3371064b0 100644 --- a/libarchive/archive.h +++ b/libarchive/archive.h @@ -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 *); diff --git a/libarchive/archive_write_set_format_zip.c b/libarchive/archive_write_set_format_zip.c index 61fffc47b..8a2397a63 100644 --- a/libarchive/archive_write_set_format_zip.c +++ b/libarchive/archive_write_set_format_zip.c @@ -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) { diff --git a/libarchive/test/test_write_format_zip.c b/libarchive/test/test_write_format_zip.c index de8d11d15..f4c51f34b 100644 --- a/libarchive/test/test_write_format_zip.c +++ b/libarchive/test/test_write_format_zip.c @@ -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)); diff --git a/libarchive/test/test_write_format_zip_no_compression.c b/libarchive/test/test_write_format_zip_no_compression.c index 5bed1ded9..63e76b670 100644 --- a/libarchive/test/test_write_format_zip_no_compression.c +++ b/libarchive/test/test_write_format_zip_no_compression.c @@ -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)); diff --git a/tar/bsdtar.1 b/tar/bsdtar.1 index 23e322ecd..80da3c004 100644 --- a/tar/bsdtar.1 +++ b/tar/bsdtar.1 @@ -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.