1 /* SPDX-License-Identifier: LGPL-2.1+ */
7 #include "sparse-endian.h"
10 * If you change this file you probably should also change its documentation:
12 * http://www.freedesktop.org/wiki/Software/systemd/journal-files
15 typedef struct Header Header
;
17 typedef struct ObjectHeader ObjectHeader
;
18 typedef union Object Object
;
20 typedef struct DataObject DataObject
;
21 typedef struct FieldObject FieldObject
;
22 typedef struct EntryObject EntryObject
;
23 typedef struct HashTableObject HashTableObject
;
24 typedef struct EntryArrayObject EntryArrayObject
;
25 typedef struct TagObject TagObject
;
27 typedef struct EntryItem EntryItem
;
28 typedef struct HashItem HashItem
;
30 typedef struct FSSHeader FSSHeader
;
33 typedef enum ObjectType
{
34 OBJECT_UNUSED
, /* also serves as "any type" or "additional context" */
38 OBJECT_DATA_HASH_TABLE
,
39 OBJECT_FIELD_HASH_TABLE
,
47 OBJECT_COMPRESSED_XZ
= 1 << 0,
48 OBJECT_COMPRESSED_LZ4
= 1 << 1,
49 OBJECT_COMPRESSED_ZSTD
= 1 << 2,
50 OBJECT_COMPRESSION_MASK
= (OBJECT_COMPRESSED_XZ
| OBJECT_COMPRESSED_LZ4
| OBJECT_COMPRESSED_ZSTD
),
51 _OBJECT_COMPRESSED_MAX
= OBJECT_COMPRESSION_MASK
,
62 #define DataObject__contents { \
63 ObjectHeader object; \
65 le64_t next_hash_offset; \
66 le64_t next_field_offset; \
67 le64_t entry_offset; /* the first array entry we store inline */ \
68 le64_t entry_array_offset; \
73 struct DataObject DataObject__contents
;
74 struct DataObject__packed DataObject__contents _packed_
;
75 assert_cc(sizeof(struct DataObject
) == sizeof(struct DataObject__packed
));
77 #define FieldObject__contents { \
78 ObjectHeader object; \
80 le64_t next_hash_offset; \
81 le64_t head_data_offset; \
85 struct FieldObject FieldObject__contents
;
86 struct FieldObject__packed FieldObject__contents _packed_
;
87 assert_cc(sizeof(struct FieldObject
) == sizeof(struct FieldObject__packed
));
94 #define EntryObject__contents { \
95 ObjectHeader object; \
104 struct EntryObject EntryObject__contents
;
105 struct EntryObject__packed EntryObject__contents _packed_
;
106 assert_cc(sizeof(struct EntryObject
) == sizeof(struct EntryObject__packed
));
109 le64_t head_hash_offset
;
110 le64_t tail_hash_offset
;
113 struct HashTableObject
{
118 struct EntryArrayObject
{
120 le64_t next_entry_array_offset
;
124 #define TAG_LENGTH (256/8)
130 uint8_t tag
[TAG_LENGTH
]; /* SHA-256 HMAC */
138 HashTableObject hash_table
;
139 EntryArrayObject entry_array
;
152 HEADER_INCOMPATIBLE_COMPRESSED_XZ
= 1 << 0,
153 HEADER_INCOMPATIBLE_COMPRESSED_LZ4
= 1 << 1,
154 HEADER_INCOMPATIBLE_KEYED_HASH
= 1 << 2,
155 HEADER_INCOMPATIBLE_COMPRESSED_ZSTD
= 1 << 3,
158 #define HEADER_INCOMPATIBLE_ANY \
159 (HEADER_INCOMPATIBLE_COMPRESSED_XZ | \
160 HEADER_INCOMPATIBLE_COMPRESSED_LZ4 | \
161 HEADER_INCOMPATIBLE_KEYED_HASH | \
162 HEADER_INCOMPATIBLE_COMPRESSED_ZSTD)
164 #if HAVE_XZ && HAVE_LZ4 && HAVE_ZSTD
165 # define HEADER_INCOMPATIBLE_SUPPORTED HEADER_INCOMPATIBLE_ANY
166 #elif HAVE_XZ && HAVE_LZ4
167 # define HEADER_INCOMPATIBLE_SUPPORTED (HEADER_INCOMPATIBLE_COMPRESSED_XZ|HEADER_INCOMPATIBLE_COMPRESSED_LZ4|HEADER_INCOMPATIBLE_KEYED_HASH)
168 #elif HAVE_XZ && HAVE_ZSTD
169 # define HEADER_INCOMPATIBLE_SUPPORTED (HEADER_INCOMPATIBLE_COMPRESSED_XZ|HEADER_INCOMPATIBLE_COMPRESSED_ZSTD|HEADER_INCOMPATIBLE_KEYED_HASH)
170 #elif HAVE_LZ4 && HAVE_ZSTD
171 # define HEADER_INCOMPATIBLE_SUPPORTED (HEADER_INCOMPATIBLE_COMPRESSED_LZ4|HEADER_INCOMPATIBLE_COMPRESSED_ZSTD|HEADER_INCOMPATIBLE_KEYED_HASH)
173 # define HEADER_INCOMPATIBLE_SUPPORTED (HEADER_INCOMPATIBLE_COMPRESSED_XZ|HEADER_INCOMPATIBLE_KEYED_HASH)
175 # define HEADER_INCOMPATIBLE_SUPPORTED (HEADER_INCOMPATIBLE_COMPRESSED_LZ4|HEADER_INCOMPATIBLE_KEYED_HASH)
177 # define HEADER_INCOMPATIBLE_SUPPORTED (HEADER_INCOMPATIBLE_COMPRESSED_ZSTD|HEADER_INCOMPATIBLE_KEYED_HASH)
179 # define HEADER_INCOMPATIBLE_SUPPORTED HEADER_INCOMPATIBLE_KEYED_HASH
183 HEADER_COMPATIBLE_SEALED
= 1 << 0,
186 #define HEADER_COMPATIBLE_ANY HEADER_COMPATIBLE_SEALED
188 # define HEADER_COMPATIBLE_SUPPORTED HEADER_COMPATIBLE_SEALED
190 # define HEADER_COMPATIBLE_SUPPORTED 0
193 #define HEADER_SIGNATURE \
194 ((const char[]) { 'L', 'P', 'K', 'S', 'H', 'H', 'R', 'H' })
196 #define struct_Header__contents { \
197 uint8_t signature[8]; /* "LPKSHHRH" */ \
198 le32_t compatible_flags; \
199 le32_t incompatible_flags; \
201 uint8_t reserved[7]; \
202 sd_id128_t file_id; \
203 sd_id128_t machine_id; \
204 sd_id128_t boot_id; /* last writer */ \
205 sd_id128_t seqnum_id; \
206 le64_t header_size; \
208 le64_t data_hash_table_offset; \
209 le64_t data_hash_table_size; \
210 le64_t field_hash_table_offset; \
211 le64_t field_hash_table_size; \
212 le64_t tail_object_offset; \
215 le64_t tail_entry_seqnum; \
216 le64_t head_entry_seqnum; \
217 le64_t entry_array_offset; \
218 le64_t head_entry_realtime; \
219 le64_t tail_entry_realtime; \
220 le64_t tail_entry_monotonic; \
226 le64_t n_entry_arrays; \
228 le64_t data_hash_chain_depth; \
229 le64_t field_hash_chain_depth; \
232 struct Header struct_Header__contents
;
233 struct Header__packed struct_Header__contents _packed_
;
234 assert_cc(sizeof(struct Header
) == sizeof(struct Header__packed
));
235 assert_cc(sizeof(struct Header
) == 256);
237 #define FSS_HEADER_SIGNATURE \
238 ((const char[]) { 'K', 'S', 'H', 'H', 'R', 'H', 'L', 'P' })
241 uint8_t signature
[8]; /* "KSHHRHLP" */
242 le32_t compatible_flags
;
243 le32_t incompatible_flags
;
244 sd_id128_t machine_id
;
245 sd_id128_t boot_id
; /* last writer */
248 le64_t interval_usec
;
251 le64_t fsprg_state_size
;