]>
Commit | Line | Data |
---|---|---|
db9ecf05 | 1 | /* SPDX-License-Identifier: LGPL-2.1-or-later */ |
c2f1db8f | 2 | #pragma once |
e4e61fdb | 3 | |
746ea80b | 4 | #include <errno.h> |
83f3d73d | 5 | #include <stdbool.h> |
746ea80b | 6 | #include <stdint.h> |
355b59e2 | 7 | #include <unistd.h> |
e4e61fdb | 8 | |
3fc72d54 MC |
9 | #if HAVE_LZ4 |
10 | #include <lz4.h> | |
11 | #include <lz4frame.h> | |
12 | #endif | |
13 | ||
14 | #include "dlfcn-util.h" | |
15 | ||
acc50c92 | 16 | typedef enum Compression { |
4d698d12 LP |
17 | COMPRESSION_NONE, |
18 | COMPRESSION_XZ, | |
19 | COMPRESSION_LZ4, | |
20 | COMPRESSION_ZSTD, | |
acc50c92 LP |
21 | _COMPRESSION_MAX, |
22 | _COMPRESSION_INVALID = -EINVAL, | |
23 | } Compression; | |
e4e61fdb | 24 | |
acc50c92 LP |
25 | const char* compression_to_string(Compression compression); |
26 | Compression compression_from_string(const char *compression); | |
e4e61fdb | 27 | |
83f3d73d YW |
28 | bool compression_supported(Compression c); |
29 | ||
5d6f46b6 ZJS |
30 | int compress_blob_xz(const void *src, uint64_t src_size, |
31 | void *dst, size_t dst_alloc_size, size_t *dst_size); | |
32 | int compress_blob_lz4(const void *src, uint64_t src_size, | |
33 | void *dst, size_t dst_alloc_size, size_t *dst_size); | |
8653185a LP |
34 | int compress_blob_zstd(const void *src, uint64_t src_size, |
35 | void *dst, size_t dst_alloc_size, size_t *dst_size); | |
355b59e2 | 36 | |
d89c8fdf | 37 | int decompress_blob_xz(const void *src, uint64_t src_size, |
319a4f4b | 38 | void **dst, size_t* dst_size, size_t dst_max); |
d89c8fdf | 39 | int decompress_blob_lz4(const void *src, uint64_t src_size, |
319a4f4b | 40 | void **dst, size_t* dst_size, size_t dst_max); |
8653185a | 41 | int decompress_blob_zstd(const void *src, uint64_t src_size, |
319a4f4b | 42 | void **dst, size_t* dst_size, size_t dst_max); |
acc50c92 | 43 | int decompress_blob(Compression compression, |
d89c8fdf | 44 | const void *src, uint64_t src_size, |
319a4f4b | 45 | void **dst, size_t* dst_size, size_t dst_max); |
d89c8fdf ZJS |
46 | |
47 | int decompress_startswith_xz(const void *src, uint64_t src_size, | |
319a4f4b | 48 | void **buffer, |
fa1c4b51 | 49 | const void *prefix, size_t prefix_len, |
d89c8fdf ZJS |
50 | uint8_t extra); |
51 | int decompress_startswith_lz4(const void *src, uint64_t src_size, | |
319a4f4b | 52 | void **buffer, |
fa1c4b51 | 53 | const void *prefix, size_t prefix_len, |
d89c8fdf | 54 | uint8_t extra); |
8653185a | 55 | int decompress_startswith_zstd(const void *src, uint64_t src_size, |
319a4f4b | 56 | void **buffer, |
8653185a LP |
57 | const void *prefix, size_t prefix_len, |
58 | uint8_t extra); | |
acc50c92 | 59 | int decompress_startswith(Compression compression, |
d89c8fdf | 60 | const void *src, uint64_t src_size, |
319a4f4b | 61 | void **buffer, |
fa1c4b51 | 62 | const void *prefix, size_t prefix_len, |
d89c8fdf ZJS |
63 | uint8_t extra); |
64 | ||
5b6f8e13 LB |
65 | int compress_stream_xz(int fdf, int fdt, uint64_t max_bytes, uint64_t *ret_uncompressed_size); |
66 | int compress_stream_lz4(int fdf, int fdt, uint64_t max_bytes, uint64_t *ret_uncompressed_size); | |
67 | int compress_stream_zstd(int fdf, int fdt, uint64_t max_bytes, uint64_t *ret_uncompressed_size); | |
d89c8fdf | 68 | |
59f448cf LP |
69 | int decompress_stream_xz(int fdf, int fdt, uint64_t max_size); |
70 | int decompress_stream_lz4(int fdf, int fdt, uint64_t max_size); | |
ef5924aa | 71 | int decompress_stream_zstd(int fdf, int fdt, uint64_t max_size); |
d89c8fdf | 72 | |
3fc72d54 MC |
73 | #if HAVE_LZ4 |
74 | DLSYM_PROTOTYPE(LZ4_compress_default); | |
75 | DLSYM_PROTOTYPE(LZ4_decompress_safe); | |
76 | DLSYM_PROTOTYPE(LZ4_decompress_safe_partial); | |
77 | DLSYM_PROTOTYPE(LZ4_versionNumber); | |
78 | ||
79 | int dlopen_lz4(void); | |
80 | #endif | |
81 | ||
82 | #if HAVE_ZSTD | |
83 | int dlopen_zstd(void); | |
84 | #endif | |
85 | ||
86 | #if HAVE_XZ | |
87 | int dlopen_lzma(void); | |
88 | #endif | |
89 | ||
90 | ||
bfeaa62d | 91 | static inline int compress_blob( |
acc50c92 LP |
92 | Compression compression, |
93 | const void *src, uint64_t src_size, | |
94 | void *dst, size_t dst_alloc_size, size_t *dst_size) { | |
95 | ||
96 | switch (compression) { | |
97 | case COMPRESSION_ZSTD: | |
ee00684c | 98 | return compress_blob_zstd(src, src_size, dst, dst_alloc_size, dst_size); |
acc50c92 | 99 | case COMPRESSION_LZ4: |
ee00684c | 100 | return compress_blob_lz4(src, src_size, dst, dst_alloc_size, dst_size); |
acc50c92 | 101 | case COMPRESSION_XZ: |
ee00684c ZJS |
102 | return compress_blob_xz(src, src_size, dst, dst_alloc_size, dst_size); |
103 | default: | |
104 | return -EOPNOTSUPP; | |
105 | } | |
1d997b81 ZJS |
106 | } |
107 | ||
108 | static inline int compress_stream(int fdf, int fdt, uint64_t max_bytes, uint64_t *ret_uncompressed_size) { | |
ee00684c | 109 | switch (DEFAULT_COMPRESSION) { |
acc50c92 | 110 | case COMPRESSION_ZSTD: |
ee00684c | 111 | return compress_stream_zstd(fdf, fdt, max_bytes, ret_uncompressed_size); |
acc50c92 | 112 | case COMPRESSION_LZ4: |
ee00684c | 113 | return compress_stream_lz4(fdf, fdt, max_bytes, ret_uncompressed_size); |
acc50c92 | 114 | case COMPRESSION_XZ: |
ee00684c ZJS |
115 | return compress_stream_xz(fdf, fdt, max_bytes, ret_uncompressed_size); |
116 | default: | |
117 | return -EOPNOTSUPP; | |
118 | } | |
1d997b81 ZJS |
119 | } |
120 | ||
ee00684c ZJS |
121 | static inline const char* default_compression_extension(void) { |
122 | switch (DEFAULT_COMPRESSION) { | |
acc50c92 | 123 | case COMPRESSION_ZSTD: |
ee00684c | 124 | return ".zst"; |
acc50c92 | 125 | case COMPRESSION_LZ4: |
ee00684c | 126 | return ".lz4"; |
acc50c92 | 127 | case COMPRESSION_XZ: |
ee00684c ZJS |
128 | return ".xz"; |
129 | default: | |
130 | return ""; | |
131 | } | |
132 | } | |
d89c8fdf | 133 | |
59f448cf | 134 | int decompress_stream(const char *filename, int fdf, int fdt, uint64_t max_bytes); |