with options.
SVN-Revision: 1136
__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 *);
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)
{
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;
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)
{
size_t used;
size_t buffsize = 1000000;
char *buff;
+ const char *compression_type;
buff = malloc(buffsize);
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));
/* 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));
.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.