diff options
-rw-r--r-- | archive-zip.c | 9 | ||||
-rw-r--r-- | archive.h | 1 | ||||
-rw-r--r-- | builtin-archive.c | 3 |
3 files changed, 8 insertions, 5 deletions
diff --git a/archive-zip.c b/archive-zip.c index d56e5cfc1e..fb12398b0f 100644 --- a/archive-zip.c +++ b/archive-zip.c @@ -93,7 +93,7 @@ static void copy_le32(unsigned char *dest, unsigned int n) } static void *zlib_deflate(void *data, unsigned long size, - unsigned long *compressed_size) + int compression_level, unsigned long *compressed_size) { z_stream stream; unsigned long maxsize; @@ -101,7 +101,7 @@ static void *zlib_deflate(void *data, unsigned long size, int result; memset(&stream, 0, sizeof(stream)); - deflateInit(&stream, zlib_compression_level); + deflateInit(&stream, compression_level); maxsize = deflateBound(&stream, size); buffer = xmalloc(maxsize); @@ -157,7 +157,7 @@ static int write_zip_entry(struct archiver_args *args, method = 0; attr2 = S_ISLNK(mode) ? ((mode | 0777) << 16) : (mode & 0111) ? ((mode) << 16) : 0; - if (S_ISREG(mode) && zlib_compression_level != 0) + if (S_ISREG(mode) && args->compression_level != 0) method = 8; crc = crc32(crc, buffer, size); out = buffer; @@ -169,7 +169,8 @@ static int write_zip_entry(struct archiver_args *args, } if (method == 8) { - deflated = zlib_deflate(buffer, size, &compressed_size); + deflated = zlib_deflate(buffer, size, args->compression_level, + &compressed_size); if (deflated && compressed_size - 6 < size) { /* ZLIB --> raw compressed data (see RFC 1950) */ /* CMF and FLG ... */ @@ -13,6 +13,7 @@ struct archiver_args { time_t time; const char **pathspec; unsigned int verbose : 1; + int compression_level; }; typedef int (*write_archive_fn_t)(struct archiver_args *); diff --git a/builtin-archive.c b/builtin-archive.c index d5e3af879e..cff6ce7de3 100644 --- a/builtin-archive.c +++ b/builtin-archive.c @@ -185,9 +185,10 @@ int parse_archive_args(int argc, const char **argv, const struct archiver **ar, if (!*ar) die("Unknown archive format '%s'", format); + args->compression_level = Z_DEFAULT_COMPRESSION; if (compression_level != -1) { if ((*ar)->flags & USES_ZLIB_COMPRESSION) - zlib_compression_level = compression_level; + args->compression_level = compression_level; else { die("Argument not supported for format '%s': -%d", format, compression_level); |