diff options
Diffstat (limited to 'Utilities/cmlibarchive/libarchive/archive_write_add_filter_xz.c')
-rw-r--r-- | Utilities/cmlibarchive/libarchive/archive_write_add_filter_xz.c | 35 |
1 files changed, 24 insertions, 11 deletions
diff --git a/Utilities/cmlibarchive/libarchive/archive_write_add_filter_xz.c b/Utilities/cmlibarchive/libarchive/archive_write_add_filter_xz.c index b06775224..fa73311e7 100644 --- a/Utilities/cmlibarchive/libarchive/archive_write_add_filter_xz.c +++ b/Utilities/cmlibarchive/libarchive/archive_write_add_filter_xz.c @@ -1,6 +1,6 @@ /*- - * Copyright (c) 2009,2010 Michihiro NAKAJIMA * Copyright (c) 2003-2010 Tim Kientzle + * Copyright (c) 2009-2012 Michihiro NAKAJIMA * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -172,7 +172,7 @@ archive_write_add_filter_xz(struct archive *_a) f = __archive_write_allocate_filter(_a); r = common_setup(f); if (r == ARCHIVE_OK) { - f->code = ARCHIVE_COMPRESSION_XZ; + f->code = ARCHIVE_FILTER_XZ; f->name = "xz"; } return (r); @@ -192,7 +192,7 @@ archive_write_add_filter_lzma(struct archive *_a) f = __archive_write_allocate_filter(_a); r = common_setup(f); if (r == ARCHIVE_OK) { - f->code = ARCHIVE_COMPRESSION_LZMA; + f->code = ARCHIVE_FILTER_LZMA; f->name = "lzma"; } return (r); @@ -209,7 +209,7 @@ archive_write_add_filter_lzip(struct archive *_a) f = __archive_write_allocate_filter(_a); r = common_setup(f); if (r == ARCHIVE_OK) { - f->code = ARCHIVE_COMPRESSION_LZIP; + f->code = ARCHIVE_FILTER_LZIP; f->name = "lzip"; } return (r); @@ -225,12 +225,12 @@ archive_compressor_xz_init_stream(struct archive_write_filter *f, data->stream = lzma_stream_init_data; data->stream.next_out = data->compressed; data->stream.avail_out = data->compressed_buffer_size; - if (f->code == ARCHIVE_COMPRESSION_XZ) + if (f->code == ARCHIVE_FILTER_XZ) ret = lzma_stream_encoder(&(data->stream), data->lzmafilters, LZMA_CHECK_CRC64); - else if (f->code == ARCHIVE_COMPRESSION_LZMA) + else if (f->code == ARCHIVE_FILTER_LZMA) ret = lzma_alone_encoder(&(data->stream), &data->lzma_opt); - else { /* ARCHIVE_COMPRESSION_LZIP */ + else { /* ARCHIVE_FILTER_LZIP */ int dict_size = data->lzma_opt.dict_size; int ds, log2dic, wedges; @@ -298,7 +298,17 @@ archive_compressor_xz_open(struct archive_write_filter *f) return (ret); if (data->compressed == NULL) { - data->compressed_buffer_size = 65536; + size_t bs = 65536, bpb; + if (f->archive->magic == ARCHIVE_WRITE_MAGIC) { + /* Buffer size should be a multiple number of the of bytes + * per block for performance. */ + bpb = archive_write_get_bytes_per_block(f->archive); + if (bpb > bs) + bs = bpb; + else if (bpb != 0) + bs -= bs % bpb; + } + data->compressed_buffer_size = bs; data->compressed = (unsigned char *)malloc(data->compressed_buffer_size); if (data->compressed == NULL) { @@ -311,7 +321,7 @@ archive_compressor_xz_open(struct archive_write_filter *f) f->write = archive_compressor_xz_write; /* Initialize compression library. */ - if (f->code == ARCHIVE_COMPRESSION_LZIP) { + if (f->code == ARCHIVE_FILTER_LZIP) { const struct option_value *val = &option_values[data->compression_level]; @@ -365,6 +375,9 @@ archive_compressor_xz_options(struct archive_write_filter *f, 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. */ return (ARCHIVE_WARN); } @@ -380,7 +393,7 @@ archive_compressor_xz_write(struct archive_write_filter *f, /* Update statistics */ data->total_in += length; - if (f->code == ARCHIVE_COMPRESSION_LZIP) + if (f->code == ARCHIVE_FILTER_LZIP) data->crc32 = lzma_crc32(buff, length, data->crc32); /* Compress input data to output buffer */ @@ -409,7 +422,7 @@ archive_compressor_xz_close(struct archive_write_filter *f) ret = __archive_write_filter(f->next_filter, data->compressed, data->compressed_buffer_size - data->stream.avail_out); - if (f->code == ARCHIVE_COMPRESSION_LZIP && ret == ARCHIVE_OK) { + if (f->code == ARCHIVE_FILTER_LZIP && ret == ARCHIVE_OK) { archive_le32enc(data->compressed, data->crc32); archive_le64enc(data->compressed+4, data->total_in); archive_le64enc(data->compressed+12, data->total_out + 20); |