basic: expose compression level argument in compress_blob functions
This commit is contained in:
+26
-9
@@ -8,6 +8,10 @@
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#if HAVE_LZ4
|
||||
#include <lz4hc.h>
|
||||
#endif
|
||||
|
||||
#if HAVE_XZ
|
||||
#include <lzma.h>
|
||||
#endif
|
||||
@@ -43,6 +47,7 @@ static DLSYM_PROTOTYPE(LZ4F_freeCompressionContext) = NULL;
|
||||
static DLSYM_PROTOTYPE(LZ4F_freeDecompressionContext) = NULL;
|
||||
static DLSYM_PROTOTYPE(LZ4F_isError) = NULL;
|
||||
DLSYM_PROTOTYPE(LZ4_compress_default) = NULL;
|
||||
DLSYM_PROTOTYPE(LZ4_compress_HC) = NULL;
|
||||
DLSYM_PROTOTYPE(LZ4_decompress_safe) = NULL;
|
||||
DLSYM_PROTOTYPE(LZ4_decompress_safe_partial) = NULL;
|
||||
DLSYM_PROTOTYPE(LZ4_versionNumber) = NULL;
|
||||
@@ -94,6 +99,7 @@ static DLSYM_PROTOTYPE(lzma_easy_encoder) = NULL;
|
||||
static DLSYM_PROTOTYPE(lzma_end) = NULL;
|
||||
static DLSYM_PROTOTYPE(lzma_stream_buffer_encode) = NULL;
|
||||
static DLSYM_PROTOTYPE(lzma_stream_decoder) = NULL;
|
||||
static DLSYM_PROTOTYPE(lzma_lzma_preset) = NULL;
|
||||
|
||||
/* We can't just do _cleanup_(sym_lzma_end) because a compiler bug makes
|
||||
* this fail with:
|
||||
@@ -145,12 +151,13 @@ int dlopen_lzma(void) {
|
||||
DLSYM_ARG(lzma_easy_encoder),
|
||||
DLSYM_ARG(lzma_end),
|
||||
DLSYM_ARG(lzma_stream_buffer_encode),
|
||||
DLSYM_ARG(lzma_lzma_preset),
|
||||
DLSYM_ARG(lzma_stream_decoder));
|
||||
}
|
||||
#endif
|
||||
|
||||
int compress_blob_xz(const void *src, uint64_t src_size,
|
||||
void *dst, size_t dst_alloc_size, size_t *dst_size) {
|
||||
void *dst, size_t dst_alloc_size, size_t *dst_size, int level) {
|
||||
|
||||
assert(src);
|
||||
assert(src_size > 0);
|
||||
@@ -159,12 +166,12 @@ int compress_blob_xz(const void *src, uint64_t src_size,
|
||||
assert(dst_size);
|
||||
|
||||
#if HAVE_XZ
|
||||
static const lzma_options_lzma opt = {
|
||||
lzma_options_lzma opt = {
|
||||
1u << 20u, NULL, 0, LZMA_LC_DEFAULT, LZMA_LP_DEFAULT,
|
||||
LZMA_PB_DEFAULT, LZMA_MODE_FAST, 128, LZMA_MF_HC3, 4
|
||||
};
|
||||
static const lzma_filter filters[] = {
|
||||
{ LZMA_FILTER_LZMA2, (lzma_options_lzma*) &opt },
|
||||
lzma_filter filters[] = {
|
||||
{ LZMA_FILTER_LZMA2, &opt },
|
||||
{ LZMA_VLI_UNKNOWN, NULL }
|
||||
};
|
||||
lzma_ret ret;
|
||||
@@ -175,13 +182,19 @@ int compress_blob_xz(const void *src, uint64_t src_size,
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
if (level >= 0) {
|
||||
r = sym_lzma_lzma_preset(&opt, (uint32_t) level);
|
||||
if (r < 0)
|
||||
return r;
|
||||
}
|
||||
|
||||
/* Returns < 0 if we couldn't compress the data or the
|
||||
* compressed result is longer than the original */
|
||||
|
||||
if (src_size < 80)
|
||||
return -ENOBUFS;
|
||||
|
||||
ret = sym_lzma_stream_buffer_encode((lzma_filter*) filters, LZMA_CHECK_NONE, NULL,
|
||||
ret = sym_lzma_stream_buffer_encode(filters, LZMA_CHECK_NONE, NULL,
|
||||
src, src_size, dst, &out_pos, dst_alloc_size);
|
||||
if (ret != LZMA_OK)
|
||||
return -ENOBUFS;
|
||||
@@ -214,6 +227,7 @@ int dlopen_lz4(void) {
|
||||
DLSYM_ARG(LZ4F_freeDecompressionContext),
|
||||
DLSYM_ARG(LZ4F_isError),
|
||||
DLSYM_ARG(LZ4_compress_default),
|
||||
DLSYM_ARG(LZ4_compress_HC),
|
||||
DLSYM_ARG(LZ4_decompress_safe),
|
||||
DLSYM_ARG(LZ4_decompress_safe_partial),
|
||||
DLSYM_ARG(LZ4_versionNumber));
|
||||
@@ -221,7 +235,7 @@ int dlopen_lz4(void) {
|
||||
#endif
|
||||
|
||||
int compress_blob_lz4(const void *src, uint64_t src_size,
|
||||
void *dst, size_t dst_alloc_size, size_t *dst_size) {
|
||||
void *dst, size_t dst_alloc_size, size_t *dst_size, int level) {
|
||||
|
||||
assert(src);
|
||||
assert(src_size > 0);
|
||||
@@ -241,7 +255,10 @@ int compress_blob_lz4(const void *src, uint64_t src_size,
|
||||
if (src_size < 9)
|
||||
return -ENOBUFS;
|
||||
|
||||
r = sym_LZ4_compress_default(src, (char*)dst + 8, src_size, (int) dst_alloc_size - 8);
|
||||
if (level <= 0)
|
||||
r = sym_LZ4_compress_default(src, (char*)dst + 8, src_size, (int) dst_alloc_size - 8);
|
||||
else
|
||||
r = sym_LZ4_compress_HC(src, (char*)dst + 8, src_size, (int) dst_alloc_size - 8, level);
|
||||
if (r <= 0)
|
||||
return -ENOBUFS;
|
||||
|
||||
@@ -285,7 +302,7 @@ int dlopen_zstd(void) {
|
||||
|
||||
int compress_blob_zstd(
|
||||
const void *src, uint64_t src_size,
|
||||
void *dst, size_t dst_alloc_size, size_t *dst_size) {
|
||||
void *dst, size_t dst_alloc_size, size_t *dst_size, int level) {
|
||||
|
||||
assert(src);
|
||||
assert(src_size > 0);
|
||||
@@ -301,7 +318,7 @@ int compress_blob_zstd(
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
k = sym_ZSTD_compress(dst, dst_alloc_size, src, src_size, 0);
|
||||
k = sym_ZSTD_compress(dst, dst_alloc_size, src, src_size, level < 0 ? 0 : level);
|
||||
if (sym_ZSTD_isError(k))
|
||||
return zstd_ret_to_errno(k);
|
||||
|
||||
|
||||
@@ -28,11 +28,11 @@ Compression compression_from_string(const char *compression);
|
||||
bool compression_supported(Compression c);
|
||||
|
||||
int compress_blob_xz(const void *src, uint64_t src_size,
|
||||
void *dst, size_t dst_alloc_size, size_t *dst_size);
|
||||
void *dst, size_t dst_alloc_size, size_t *dst_size, int level);
|
||||
int compress_blob_lz4(const void *src, uint64_t src_size,
|
||||
void *dst, size_t dst_alloc_size, size_t *dst_size);
|
||||
void *dst, size_t dst_alloc_size, size_t *dst_size, int level);
|
||||
int compress_blob_zstd(const void *src, uint64_t src_size,
|
||||
void *dst, size_t dst_alloc_size, size_t *dst_size);
|
||||
void *dst, size_t dst_alloc_size, size_t *dst_size, int level);
|
||||
|
||||
int decompress_blob_xz(const void *src, uint64_t src_size,
|
||||
void **dst, size_t* dst_size, size_t dst_max);
|
||||
@@ -90,15 +90,15 @@ int dlopen_lzma(void);
|
||||
static inline int compress_blob(
|
||||
Compression compression,
|
||||
const void *src, uint64_t src_size,
|
||||
void *dst, size_t dst_alloc_size, size_t *dst_size) {
|
||||
void *dst, size_t dst_alloc_size, size_t *dst_size, int level) {
|
||||
|
||||
switch (compression) {
|
||||
case COMPRESSION_ZSTD:
|
||||
return compress_blob_zstd(src, src_size, dst, dst_alloc_size, dst_size);
|
||||
return compress_blob_zstd(src, src_size, dst, dst_alloc_size, dst_size, level);
|
||||
case COMPRESSION_LZ4:
|
||||
return compress_blob_lz4(src, src_size, dst, dst_alloc_size, dst_size);
|
||||
return compress_blob_lz4(src, src_size, dst, dst_alloc_size, dst_size, level);
|
||||
case COMPRESSION_XZ:
|
||||
return compress_blob_xz(src, src_size, dst, dst_alloc_size, dst_size);
|
||||
return compress_blob_xz(src, src_size, dst, dst_alloc_size, dst_size, level);
|
||||
default:
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user