From: Michihiro NAKAJIMA Date: Wed, 10 Oct 2012 22:58:40 +0000 (+0900) Subject: Support lrzip options for writing. X-Git-Tag: v3.1.0~40^2~56 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=283cf8227193c7a81b156e474c7e9fc57e4ca622;p=thirdparty%2Flibarchive.git Support lrzip options for writing. --- diff --git a/libarchive/archive_write_add_filter_lrzip.c b/libarchive/archive_write_add_filter_lrzip.c index 1f27f686d..1ffb78bf3 100644 --- a/libarchive/archive_write_add_filter_lrzip.c +++ b/libarchive/archive_write_add_filter_lrzip.c @@ -33,12 +33,17 @@ __FBSDID("$FreeBSD$"); #ifdef HAVE_STDLIB_H #include #endif +#ifdef HAVE_STRING_H +#include +#endif #include "archive.h" #include "archive_write_private.h" struct write_lrzip { struct archive_write_program_data *pdata; + int compression_level; + enum { lzma = 0, bzip2, gzip, lzo, zpaq } compression; }; static int archive_write_lrzip_open(struct archive_write_filter *); @@ -88,9 +93,29 @@ static int archive_write_lrzip_options(struct archive_write_filter *f, const char *key, const char *value) { - (void)f; /* UNUSED */ - (void)key; /* UNUSED */ - (void)value; /* UNUSED */ + struct write_lrzip *data = (struct write_lrzip *)f->data; + + if (strcmp(key, "compression") == 0) { + if (value == NULL) + return (ARCHIVE_WARN); + else if (strcmp(value, "bzip2") == 0) + data->compression = bzip2; + else if (strcmp(value, "gzip") == 0) + data->compression = gzip; + else if (strcmp(value, "lzo") == 0) + data->compression = lzo; + else if (strcmp(value, "zpaq") == 0) + data->compression = zpaq; + else + return (ARCHIVE_WARN); + return (ARCHIVE_OK); + } else if (strcmp(key, "compression-level") == 0) { + if (value == NULL || !(value[0] >= '1' && value[0] <= '9') || + value[1] != '\0') + return (ARCHIVE_WARN); + data->compression_level = value[0] - '0'; + return (ARCHIVE_OK); + } /* Note: The "warn" return is just to inform the options * supervisor that we didn't handle it. It will generate * a suitable error if no one used this option. */ @@ -113,6 +138,45 @@ archive_write_lrzip_open(struct archive_write_filter *f) if (r != ARCHIVE_OK) goto memerr; + /* Specify compression type. */ + switch (data->compression) { + case lzma:/* default compression */ + break; + case bzip2: + r = __archive_write_program_add_arg(data->pdata, "-b"); + if (r != ARCHIVE_OK) + goto memerr; + break; + case gzip: + r = __archive_write_program_add_arg(data->pdata, "-g"); + if (r != ARCHIVE_OK) + goto memerr; + break; + case lzo: + r = __archive_write_program_add_arg(data->pdata, "-l"); + if (r != ARCHIVE_OK) + goto memerr; + break; + case zpaq: + r = __archive_write_program_add_arg(data->pdata, "-z"); + if (r != ARCHIVE_OK) + goto memerr; + break; + } + + /* Specify compression level. */ + if (data->compression_level > 0) { + char level[2]; + r = __archive_write_program_add_arg(data->pdata, "-L"); + if (r != ARCHIVE_OK) + goto memerr; + level[0] = '0' + data->compression_level; + level[1] = '\0'; + r = __archive_write_program_add_arg(data->pdata, level); + if (r != ARCHIVE_OK) + goto memerr; + } + r = __archive_write_program_open(f, data->pdata); return (r); memerr: