diff options
author | Tim Kientzle <kientzle@FreeBSD.org> | 2009-03-06 05:58:56 +0000 |
---|---|---|
committer | Tim Kientzle <kientzle@FreeBSD.org> | 2009-03-06 05:58:56 +0000 |
commit | 634fb9dd4872ad89170b514d8c0bf9125bfa0d3e (patch) | |
tree | 5d87f6f3a950ec9ead6d49f3895b6b060a82f0b7 /lib/libarchive/archive_write_set_compression_gzip.c | |
parent | ce54c7c56a3c5e128f554e7ef4d4c230ab57d3d7 (diff) | |
download | src-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.c | 59 |
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 |