]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/basic/compress.h
dynamically load compression libraries
[thirdparty/systemd.git] / src / basic / compress.h
CommitLineData
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 16typedef 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
25const char* compression_to_string(Compression compression);
26Compression compression_from_string(const char *compression);
e4e61fdb 27
83f3d73d
YW
28bool compression_supported(Compression c);
29
5d6f46b6
ZJS
30int compress_blob_xz(const void *src, uint64_t src_size,
31 void *dst, size_t dst_alloc_size, size_t *dst_size);
32int compress_blob_lz4(const void *src, uint64_t src_size,
33 void *dst, size_t dst_alloc_size, size_t *dst_size);
8653185a
LP
34int 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 37int decompress_blob_xz(const void *src, uint64_t src_size,
319a4f4b 38 void **dst, size_t* dst_size, size_t dst_max);
d89c8fdf 39int decompress_blob_lz4(const void *src, uint64_t src_size,
319a4f4b 40 void **dst, size_t* dst_size, size_t dst_max);
8653185a 41int decompress_blob_zstd(const void *src, uint64_t src_size,
319a4f4b 42 void **dst, size_t* dst_size, size_t dst_max);
acc50c92 43int 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
47int 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);
51int 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 55int 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 59int 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
65int compress_stream_xz(int fdf, int fdt, uint64_t max_bytes, uint64_t *ret_uncompressed_size);
66int compress_stream_lz4(int fdf, int fdt, uint64_t max_bytes, uint64_t *ret_uncompressed_size);
67int compress_stream_zstd(int fdf, int fdt, uint64_t max_bytes, uint64_t *ret_uncompressed_size);
d89c8fdf 68
59f448cf
LP
69int decompress_stream_xz(int fdf, int fdt, uint64_t max_size);
70int decompress_stream_lz4(int fdf, int fdt, uint64_t max_size);
ef5924aa 71int decompress_stream_zstd(int fdf, int fdt, uint64_t max_size);
d89c8fdf 72
3fc72d54
MC
73#if HAVE_LZ4
74DLSYM_PROTOTYPE(LZ4_compress_default);
75DLSYM_PROTOTYPE(LZ4_decompress_safe);
76DLSYM_PROTOTYPE(LZ4_decompress_safe_partial);
77DLSYM_PROTOTYPE(LZ4_versionNumber);
78
79int dlopen_lz4(void);
80#endif
81
82#if HAVE_ZSTD
83int dlopen_zstd(void);
84#endif
85
86#if HAVE_XZ
87int dlopen_lzma(void);
88#endif
89
90
bfeaa62d 91static 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
108static 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
121static 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 134int decompress_stream(const char *filename, int fdf, int fdt, uint64_t max_bytes);