aboutsummaryrefslogtreecommitdiff
path: root/lib/libarchive/archive_write_set_compression_gzip.c
diff options
context:
space:
mode:
authorTim Kientzle <kientzle@FreeBSD.org>2009-03-06 05:58:56 +0000
committerTim Kientzle <kientzle@FreeBSD.org>2009-03-06 05:58:56 +0000
commit634fb9dd4872ad89170b514d8c0bf9125bfa0d3e (patch)
tree5d87f6f3a950ec9ead6d49f3895b6b060a82f0b7 /lib/libarchive/archive_write_set_compression_gzip.c
parentce54c7c56a3c5e128f554e7ef4d4c230ab57d3d7 (diff)
downloadsrc-634fb9dd4872ad89170b514d8c0bf9125bfa0d3e.tar.gz
src-634fb9dd4872ad89170b514d8c0bf9125bfa0d3e.zip
Merge r491,493,500,507,510,530,543 from libarchive.googlecode.com:
This implements the new generic options framework that provides a way to override format- and compression-specific parameters.
Notes
Notes: svn path=/head/; revision=189438
Diffstat (limited to 'lib/libarchive/archive_write_set_compression_gzip.c')
-rw-r--r--lib/libarchive/archive_write_set_compression_gzip.c59
1 files changed, 58 insertions, 1 deletions
diff --git a/lib/libarchive/archive_write_set_compression_gzip.c b/lib/libarchive/archive_write_set_compression_gzip.c
index 807d54e51879..1588c9eeacb3 100644
--- a/lib/libarchive/archive_write_set_compression_gzip.c
+++ b/lib/libarchive/archive_write_set_compression_gzip.c
@@ -61,6 +61,8 @@ struct private_data {
unsigned char *compressed;
size_t compressed_buffer_size;
unsigned long crc;
+ /* Options */
+ int compression_level;
};
@@ -73,6 +75,8 @@ struct private_data {
static int archive_compressor_gzip_finish(struct archive_write *);
static int archive_compressor_gzip_init(struct archive_write *);
+static int archive_compressor_gzip_options(struct archive_write *,
+ const char *, const char *);
static int archive_compressor_gzip_write(struct archive_write *,
const void *, size_t);
static int drive_compressor(struct archive_write *, struct private_data *,
@@ -143,6 +147,7 @@ archive_compressor_gzip_init(struct archive_write *a)
state->compressed_buffer_size = a->bytes_per_block;
state->compressed = (unsigned char *)malloc(state->compressed_buffer_size);
state->crc = crc32(0L, NULL, 0);
+ state->compression_level = Z_DEFAULT_COMPRESSION;
if (state->compressed == NULL) {
archive_set_error(&a->archive, ENOMEM,
@@ -169,12 +174,13 @@ archive_compressor_gzip_init(struct archive_write *a)
state->stream.next_out += 10;
state->stream.avail_out -= 10;
+ a->compressor.options = archive_compressor_gzip_options;
a->compressor.write = archive_compressor_gzip_write;
a->compressor.finish = archive_compressor_gzip_finish;
/* Initialize compression library. */
ret = deflateInit2(&(state->stream),
- Z_DEFAULT_COMPRESSION,
+ state->compression_level,
Z_DEFLATED,
-15 /* < 0 to suppress zlib header */,
8,
@@ -213,6 +219,57 @@ archive_compressor_gzip_init(struct archive_write *a)
}
/*
+ * Set write options.
+ */
+static int
+archive_compressor_gzip_options(struct archive_write *a, const char *key,
+ const char *value)
+{
+ struct private_data *state;
+ int ret;
+
+ state = (struct private_data *)a->compressor.data;
+ if (strcmp(key, "compression-level") == 0) {
+ int level;
+
+ if (value == NULL || !(value[0] >= '0' && value[0] <= '9') ||
+ value[1] != '\0')
+ return (ARCHIVE_WARN);
+ level = value[0] - '0';
+ if (level == state->compression_level)
+ return (ARCHIVE_OK);
+
+ ret = deflateParams(&(state->stream), level,
+ Z_DEFAULT_STRATEGY);
+ if (ret == Z_OK) {
+ state->compression_level = level;
+ return (ARCHIVE_OK);
+ }
+ switch (ret) {
+ case Z_STREAM_ERROR:
+ archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
+ "Internal error updating params "
+ "compression library: state was inconsistent "
+ "or parameter was invalid");
+ break;
+ case Z_BUF_ERROR:
+ archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
+ "Internal error updating params "
+ "compression library: out buffer was zero");
+ break;
+ default:
+ archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
+ "Internal error updatng params "
+ "compression library");
+ break;
+ }
+ return (ARCHIVE_FATAL);
+ }
+
+ return (ARCHIVE_WARN);
+}
+
+/*
* Write data to the compressed stream.
*/
static int