diff --git a/src/basic/compress.c b/src/basic/compress.c index 5936a13f8e..2bc11f48bc 100644 --- a/src/basic/compress.c +++ b/src/basic/compress.c @@ -254,6 +254,19 @@ Compression compression_from_filename(const char *filename) { return c; } +bool compression_supported_journal(Compression c) { + static const unsigned supported = + (1U << COMPRESSION_NONE) | + (1U << COMPRESSION_XZ) * HAVE_XZ | + (1U << COMPRESSION_LZ4) * HAVE_LZ4 | + (1U << COMPRESSION_ZSTD) * HAVE_ZSTD; + + assert(c >= 0); + assert(c < _COMPRESSION_MAX); + + return BIT_SET(supported, c); +} + bool compression_supported(Compression c) { static const unsigned supported = (1U << COMPRESSION_NONE) | @@ -639,7 +652,7 @@ static int compress_blob_bzip2( #endif } -int compress_blob( +int compress_blob_journal( Compression compression, const void *src, uint64_t src_size, void *dst, size_t dst_alloc_size, size_t *dst_size, int level) { @@ -651,12 +664,23 @@ int compress_blob( return compress_blob_lz4(src, src_size, dst, dst_alloc_size, dst_size, level); case COMPRESSION_ZSTD: return compress_blob_zstd(src, src_size, dst, dst_alloc_size, dst_size, level); + default: + return -EOPNOTSUPP; + } +} + +int compress_blob( + Compression compression, + const void *src, uint64_t src_size, + void *dst, size_t dst_alloc_size, size_t *dst_size, int level) { + + switch (compression) { case COMPRESSION_GZIP: return compress_blob_gzip(src, src_size, dst, dst_alloc_size, dst_size, level); case COMPRESSION_BZIP2: return compress_blob_bzip2(src, src_size, dst, dst_alloc_size, dst_size, level); default: - return -EOPNOTSUPP; + return compress_blob_journal(compression, src, src_size, dst, dst_alloc_size, dst_size, level); } } @@ -1033,7 +1057,7 @@ static int decompress_blob_bzip2( #endif } -int decompress_blob( +int decompress_blob_journal( Compression compression, const void *src, uint64_t src_size, @@ -1054,6 +1078,20 @@ int decompress_blob( return decompress_blob_zstd( src, src_size, dst, dst_size, dst_max); + default: + return -EPROTONOSUPPORT; + } +} + +int decompress_blob( + Compression compression, + const void *src, + uint64_t src_size, + void **dst, + size_t *dst_size, + size_t dst_max) { + + switch (compression) { case COMPRESSION_GZIP: return decompress_blob_gzip( src, src_size, @@ -1063,7 +1101,10 @@ int decompress_blob( src, src_size, dst, dst_size, dst_max); default: - return -EPROTONOSUPPORT; + return decompress_blob_journal( + compression, + src, src_size, + dst, dst_size, dst_max); } } @@ -1452,7 +1493,7 @@ static int decompress_startswith_bzip2( #endif } -int decompress_startswith( +int decompress_startswith_journal( Compression compression, const void *src, uint64_t src_size, void **buffer, @@ -1466,12 +1507,25 @@ int decompress_startswith( return decompress_startswith_lz4(src, src_size, buffer, prefix, prefix_len, extra); case COMPRESSION_ZSTD: return decompress_startswith_zstd(src, src_size, buffer, prefix, prefix_len, extra); + default: + return -EOPNOTSUPP; + } +} + +int decompress_startswith( + Compression compression, + const void *src, uint64_t src_size, + void **buffer, + const void *prefix, size_t prefix_len, + uint8_t extra) { + + switch (compression) { case COMPRESSION_GZIP: return decompress_startswith_gzip(src, src_size, buffer, prefix, prefix_len, extra); case COMPRESSION_BZIP2: return decompress_startswith_bzip2(src, src_size, buffer, prefix, prefix_len, extra); default: - return -EOPNOTSUPP; + return decompress_startswith_journal(compression, src, src_size, buffer, prefix, prefix_len, extra); } } diff --git a/src/basic/compress.h b/src/basic/compress.h index 52fdf3aa27..e25ab6d9a4 100644 --- a/src/basic/compress.h +++ b/src/basic/compress.h @@ -27,6 +27,7 @@ Compression compression_from_string_harder(const char *s); * filename does not carry a recognized compression suffix. */ Compression compression_from_filename(const char *filename); +bool compression_supported_journal(Compression c); bool compression_supported(Compression c); /* Buffer size used by streaming compression APIs and pipeline stages that feed into them. Sized to @@ -59,9 +60,17 @@ Compression compressor_type(const Compressor *c); /* Blob compression/decompression */ +int compress_blob_journal( + Compression compression, + const void *src, uint64_t src_size, + void *dst, size_t dst_alloc_size, size_t *dst_size, int level); int compress_blob(Compression compression, const void *src, uint64_t src_size, void *dst, size_t dst_alloc_size, size_t *dst_size, int level); +int decompress_blob_journal( + Compression compression, + const void *src, uint64_t src_size, + void **dst, size_t *dst_size, size_t dst_max); int decompress_blob(Compression compression, const void *src, uint64_t src_size, void **dst, size_t *dst_size, size_t dst_max); @@ -69,6 +78,12 @@ int decompress_blob(Compression compression, int decompress_zlib_raw(const void *src, uint64_t src_size, void *dst, size_t dst_size, int wbits); +int decompress_startswith_journal( + Compression compression, + const void *src, uint64_t src_size, + void **buffer, + const void *prefix, size_t prefix_len, + uint8_t extra); int decompress_startswith(Compression compression, const void *src, uint64_t src_size, void **buffer, diff --git a/src/basic/dlopen-note.h b/src/basic/dlopen-note.h index 41661939a1..6d3bd5e2bc 100644 --- a/src/basic/dlopen-note.h +++ b/src/basic/dlopen-note.h @@ -94,8 +94,11 @@ LIBZSTD_NOTE(priority) #define COMPRESS_DEFAULT_NOTE \ + COMPRESS_JOURNAL_NOTE; \ LIBBZ2_NOTE(suggested); \ + LIBZ_NOTE(suggested) + +#define COMPRESS_JOURNAL_NOTE \ LIBLZ4_NOTE(COMPRESSION_PRIORITY_LZ4); \ LIBLZMA_NOTE(COMPRESSION_PRIORITY_XZ); \ - LIBZ_NOTE(suggested); \ LIBZSTD_NOTE(COMPRESSION_PRIORITY_ZSTD) diff --git a/src/journal-remote/journal-gatewayd.c b/src/journal-remote/journal-gatewayd.c index 9def4a3bc9..8a6e59c8d7 100644 --- a/src/journal-remote/journal-gatewayd.c +++ b/src/journal-remote/journal-gatewayd.c @@ -1259,7 +1259,7 @@ static int run(int argc, char *argv[]) { MHD_USE_THREAD_PER_CONNECTION; int r, n; - COMPRESS_DEFAULT_NOTE; + COMPRESS_JOURNAL_NOTE; LIBGNUTLS_NOTE(suggested); log_setup(); diff --git a/src/journal/bsod.c b/src/journal/bsod.c index 9a9067088c..78093844fa 100644 --- a/src/journal/bsod.c +++ b/src/journal/bsod.c @@ -288,7 +288,7 @@ static int run(int argc, char *argv[]) { _cleanup_free_ char *message = NULL; int r; - COMPRESS_DEFAULT_NOTE; + COMPRESS_JOURNAL_NOTE; LIBQRENCODE_NOTE(suggested); log_setup(); diff --git a/src/journal/journalctl.c b/src/journal/journalctl.c index bb5b376a93..b407a77d97 100644 --- a/src/journal/journalctl.c +++ b/src/journal/journalctl.c @@ -1022,7 +1022,7 @@ static int run(int argc, char *argv[]) { _cleanup_strv_free_ char **args = NULL; int r; - COMPRESS_DEFAULT_NOTE; + COMPRESS_JOURNAL_NOTE; LIBACL_NOTE(recommended); LIBBLKID_NOTE(recommended); LIBCRYPTSETUP_NOTE(suggested); diff --git a/src/journal/journald.c b/src/journal/journald.c index 3cab48f6b7..ec095684df 100644 --- a/src/journal/journald.c +++ b/src/journal/journald.c @@ -26,7 +26,7 @@ static int run(int argc, char *argv[]) { LogTarget log_target; int r; - COMPRESS_DEFAULT_NOTE; + COMPRESS_JOURNAL_NOTE; LIBACL_NOTE(recommended); LIBCRYPTO_NOTE(suggested); LIBPCRE2_NOTE(suggested); diff --git a/src/libsystemd/sd-journal/journal-file.c b/src/libsystemd/sd-journal/journal-file.c index 93b2c90c15..b0df06d75a 100644 --- a/src/libsystemd/sd-journal/journal-file.c +++ b/src/libsystemd/sd-journal/journal-file.c @@ -365,7 +365,7 @@ static Compression getenv_compression(void) { return DEFAULT_COMPRESSION; } - if (!compression_supported(c)) { + if (!compression_supported_journal(c)) { log_debug("Unsupported compression algorithm specified, ignoring: %s", e); return DEFAULT_COMPRESSION; } @@ -1861,7 +1861,7 @@ static int maybe_compress_payload( return 0; } - r = compress_blob(c, src, size, dst, size - 1, rsize, /* level= */ -1); + r = compress_blob_journal(c, src, size, dst, size - 1, rsize, /* level= */ -1); if (r < 0) return log_debug_errno(r, "Failed to compress data object using %s, ignoring: %m", compression_to_string(c)); @@ -1983,7 +1983,7 @@ static int maybe_decompress_payload( int r; if (field) { - r = decompress_startswith(compression, payload, size, &f->compress_buffer, field, + r = decompress_startswith_journal(compression, payload, size, &f->compress_buffer, field, field_length, '='); if (r < 0) return log_debug_errno(r, @@ -2003,7 +2003,7 @@ static int maybe_decompress_payload( return 1; } - r = decompress_blob(compression, payload, size, &f->compress_buffer, &rsize, DATA_SIZE_MAX); + r = decompress_blob_journal(compression, payload, size, &f->compress_buffer, &rsize, DATA_SIZE_MAX); if (r < 0) return r; diff --git a/src/libsystemd/sd-journal/journal-verify.c b/src/libsystemd/sd-journal/journal-verify.c index d214a68e68..79061940b3 100644 --- a/src/libsystemd/sd-journal/journal-verify.c +++ b/src/libsystemd/sd-journal/journal-verify.c @@ -125,7 +125,7 @@ static int hash_payload(JournalFile *f, Object *o, uint64_t offset, const uint8_ _cleanup_free_ void *b = NULL; size_t b_size; - r = decompress_blob(c, src, size, &b, &b_size, DATA_SIZE_MAX); + r = decompress_blob_journal(c, src, size, &b, &b_size, DATA_SIZE_MAX); if (r < 0) { error_errno(offset, r, "%s decompression failed: %m", compression_to_string(c)); diff --git a/src/login/loginctl.c b/src/login/loginctl.c index be67025421..566f4db877 100644 --- a/src/login/loginctl.c +++ b/src/login/loginctl.c @@ -1662,7 +1662,7 @@ static int run(int argc, char *argv[]) { char **args = NULL; int r; - COMPRESS_DEFAULT_NOTE; + COMPRESS_JOURNAL_NOTE; setlocale(LC_ALL, ""); log_setup(); diff --git a/src/machine/machinectl.c b/src/machine/machinectl.c index dc2381fc84..19ad385733 100644 --- a/src/machine/machinectl.c +++ b/src/machine/machinectl.c @@ -2635,7 +2635,7 @@ static int run(int argc, char *argv[]) { _cleanup_strv_free_ char **args = NULL; int r; - COMPRESS_DEFAULT_NOTE; + COMPRESS_JOURNAL_NOTE; LIBSELINUX_NOTE(recommended); setlocale(LC_ALL, ""); diff --git a/src/network/networkctl.c b/src/network/networkctl.c index f85c74b6af..f7a6e6eef7 100644 --- a/src/network/networkctl.c +++ b/src/network/networkctl.c @@ -209,7 +209,7 @@ static int run(int argc, char* argv[]) { char **args = NULL; int r; - COMPRESS_DEFAULT_NOTE; + COMPRESS_JOURNAL_NOTE; LIBSELINUX_NOTE(recommended); log_setup();