]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/journal/journal-def.h
journal-file: when individual hash chains grow too large, rotate
[thirdparty/systemd.git] / src / journal / journal-def.h
CommitLineData
53e1b683 1/* SPDX-License-Identifier: LGPL-2.1+ */
c2f1db8f 2#pragma once
87d2c1ff 3
3ffd4af2 4#include "sd-id128.h"
81527be1 5
87d2c1ff 6#include "macro.h"
3ffd4af2 7#include "sparse-endian.h"
87d2c1ff 8
0962e09e
LP
9/*
10 * If you change this file you probably should also change its documentation:
11 *
12 * http://www.freedesktop.org/wiki/Software/systemd/journal-files
0962e09e
LP
13 */
14
87d2c1ff 15typedef struct Header Header;
8144056f 16
87d2c1ff
LP
17typedef struct ObjectHeader ObjectHeader;
18typedef union Object Object;
8144056f 19
87d2c1ff 20typedef struct DataObject DataObject;
de190aef 21typedef struct FieldObject FieldObject;
87d2c1ff
LP
22typedef struct EntryObject EntryObject;
23typedef struct HashTableObject HashTableObject;
de190aef 24typedef struct EntryArrayObject EntryArrayObject;
7560fffc 25typedef struct TagObject TagObject;
8144056f 26
87d2c1ff
LP
27typedef struct EntryItem EntryItem;
28typedef struct HashItem HashItem;
29
baed47c3 30typedef struct FSSHeader FSSHeader;
7560fffc 31
87d2c1ff 32/* Object types */
78519831 33typedef enum ObjectType {
d05089d8 34 OBJECT_UNUSED, /* also serves as "any type" or "additional context" */
0962e09e 35 OBJECT_DATA,
de190aef 36 OBJECT_FIELD,
87d2c1ff 37 OBJECT_ENTRY,
de190aef
LP
38 OBJECT_DATA_HASH_TABLE,
39 OBJECT_FIELD_HASH_TABLE,
0962e09e 40 OBJECT_ENTRY_ARRAY,
7560fffc 41 OBJECT_TAG,
de190aef 42 _OBJECT_TYPE_MAX
78519831 43} ObjectType;
87d2c1ff 44
807e17f0
LP
45/* Object flags */
46enum {
e9ece6a0
LP
47 OBJECT_COMPRESSED_XZ = 1 << 0,
48 OBJECT_COMPRESSED_LZ4 = 1 << 1,
49 OBJECT_COMPRESSION_MASK = (OBJECT_COMPRESSED_XZ | OBJECT_COMPRESSED_LZ4),
50 _OBJECT_COMPRESSED_MAX = OBJECT_COMPRESSION_MASK,
807e17f0
LP
51};
52
d89c8fdf 53
80701564 54struct ObjectHeader {
87d2c1ff 55 uint8_t type;
807e17f0
LP
56 uint8_t flags;
57 uint8_t reserved[6];
4fd052ae 58 le64_t size;
87d2c1ff 59 uint8_t payload[];
80701564 60} _packed_;
87d2c1ff 61
62353f69
ZJS
62#define DataObject__contents { \
63 ObjectHeader object; \
64 le64_t hash; \
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; \
69 le64_t n_entries; \
70 uint8_t payload[]; \
71 }
72
73struct DataObject DataObject__contents;
74struct DataObject__packed DataObject__contents _packed_;
75assert_cc(sizeof(struct DataObject) == sizeof(struct DataObject__packed));
de190aef 76
0dbe57ee
LP
77#define FieldObject__contents { \
78 ObjectHeader object; \
79 le64_t hash; \
80 le64_t next_hash_offset; \
81 le64_t head_data_offset; \
82 uint8_t payload[]; \
83}
84
85struct FieldObject FieldObject__contents;
86struct FieldObject__packed FieldObject__contents _packed_;
87assert_cc(sizeof(struct FieldObject) == sizeof(struct FieldObject__packed));
87d2c1ff 88
80701564 89struct EntryItem {
4fd052ae
FC
90 le64_t object_offset;
91 le64_t hash;
80701564 92} _packed_;
87d2c1ff 93
62353f69
ZJS
94#define EntryObject__contents { \
95 ObjectHeader object; \
96 le64_t seqnum; \
97 le64_t realtime; \
98 le64_t monotonic; \
99 sd_id128_t boot_id; \
100 le64_t xor_hash; \
101 EntryItem items[]; \
102 }
103
104struct EntryObject EntryObject__contents;
105struct EntryObject__packed EntryObject__contents _packed_;
106assert_cc(sizeof(struct EntryObject) == sizeof(struct EntryObject__packed));
107
80701564 108struct HashItem {
4fd052ae
FC
109 le64_t head_hash_offset;
110 le64_t tail_hash_offset;
80701564 111} _packed_;
87d2c1ff 112
80701564 113struct HashTableObject {
87d2c1ff 114 ObjectHeader object;
de190aef 115 HashItem items[];
80701564 116} _packed_;
87d2c1ff 117
80701564 118struct EntryArrayObject {
87d2c1ff 119 ObjectHeader object;
4fd052ae
FC
120 le64_t next_entry_array_offset;
121 le64_t items[];
80701564 122} _packed_;
87d2c1ff 123
7560fffc 124#define TAG_LENGTH (256/8)
8144056f 125
80701564 126struct TagObject {
8144056f 127 ObjectHeader object;
e8c61d7b
LP
128 le64_t seqnum;
129 le64_t epoch;
7560fffc 130 uint8_t tag[TAG_LENGTH]; /* SHA-256 HMAC */
80701564 131} _packed_;
8144056f 132
87d2c1ff
LP
133union Object {
134 ObjectHeader object;
135 DataObject data;
de190aef 136 FieldObject field;
87d2c1ff
LP
137 EntryObject entry;
138 HashTableObject hash_table;
de190aef 139 EntryArrayObject entry_array;
7560fffc 140 TagObject tag;
87d2c1ff
LP
141};
142
143enum {
db11ac1a
LP
144 STATE_OFFLINE = 0,
145 STATE_ONLINE = 1,
146 STATE_ARCHIVED = 2,
147 _STATE_MAX
87d2c1ff
LP
148};
149
807e17f0
LP
150/* Header flags */
151enum {
e9ece6a0
LP
152 HEADER_INCOMPATIBLE_COMPRESSED_XZ = 1 << 0,
153 HEADER_INCOMPATIBLE_COMPRESSED_LZ4 = 1 << 1,
4ce534f4 154 HEADER_INCOMPATIBLE_KEYED_HASH = 1 << 2,
807e17f0
LP
155};
156
4ce534f4
LP
157#define HEADER_INCOMPATIBLE_ANY \
158 (HEADER_INCOMPATIBLE_COMPRESSED_XZ| \
159 HEADER_INCOMPATIBLE_COMPRESSED_LZ4| \
160 HEADER_INCOMPATIBLE_KEYED_HASH)
d89c8fdf 161
349cc4a5 162#if HAVE_XZ && HAVE_LZ4
d89c8fdf 163# define HEADER_INCOMPATIBLE_SUPPORTED HEADER_INCOMPATIBLE_ANY
349cc4a5 164#elif HAVE_XZ
4ce534f4 165# define HEADER_INCOMPATIBLE_SUPPORTED (HEADER_INCOMPATIBLE_COMPRESSED_XZ|HEADER_INCOMPATIBLE_KEYED_HASH)
349cc4a5 166#elif HAVE_LZ4
4ce534f4 167# define HEADER_INCOMPATIBLE_SUPPORTED (HEADER_INCOMPATIBLE_COMPRESSED_LZ4|HEADER_INCOMPATIBLE_KEYED_HASH)
d89c8fdf 168#else
4ce534f4 169# define HEADER_INCOMPATIBLE_SUPPORTED HEADER_INCOMPATIBLE_KEYED_HASH
d89c8fdf
ZJS
170#endif
171
8144056f 172enum {
e9ece6a0 173 HEADER_COMPATIBLE_SEALED = 1 << 0,
8144056f
LP
174};
175
d89c8fdf 176#define HEADER_COMPATIBLE_ANY HEADER_COMPATIBLE_SEALED
349cc4a5 177#if HAVE_GCRYPT
d89c8fdf
ZJS
178# define HEADER_COMPATIBLE_SUPPORTED HEADER_COMPATIBLE_SEALED
179#else
180# define HEADER_COMPATIBLE_SUPPORTED 0
181#endif
182
7851ec66
LP
183#define HEADER_SIGNATURE \
184 ((const char[]) { 'L', 'P', 'K', 'S', 'H', 'H', 'R', 'H' })
7560fffc 185
62353f69
ZJS
186#define struct_Header__contents { \
187 uint8_t signature[8]; /* "LPKSHHRH" */ \
188 le32_t compatible_flags; \
189 le32_t incompatible_flags; \
190 uint8_t state; \
191 uint8_t reserved[7]; \
192 sd_id128_t file_id; \
193 sd_id128_t machine_id; \
194 sd_id128_t boot_id; /* last writer */ \
195 sd_id128_t seqnum_id; \
196 le64_t header_size; \
197 le64_t arena_size; \
198 le64_t data_hash_table_offset; \
199 le64_t data_hash_table_size; \
200 le64_t field_hash_table_offset; \
201 le64_t field_hash_table_size; \
202 le64_t tail_object_offset; \
203 le64_t n_objects; \
204 le64_t n_entries; \
205 le64_t tail_entry_seqnum; \
206 le64_t head_entry_seqnum; \
207 le64_t entry_array_offset; \
208 le64_t head_entry_realtime; \
209 le64_t tail_entry_realtime; \
210 le64_t tail_entry_monotonic; \
211 /* Added in 187 */ \
212 le64_t n_data; \
213 le64_t n_fields; \
214 /* Added in 189 */ \
215 le64_t n_tags; \
216 le64_t n_entry_arrays; \
0dbe57ee
LP
217 /* Added in 246 */ \
218 le64_t data_hash_chain_depth; \
219 le64_t field_hash_chain_depth; \
62353f69
ZJS
220 }
221
222struct Header struct_Header__contents;
223struct Header__packed struct_Header__contents _packed_;
224assert_cc(sizeof(struct Header) == sizeof(struct Header__packed));
0dbe57ee 225assert_cc(sizeof(struct Header) == 256);
7560fffc 226
7851ec66
LP
227#define FSS_HEADER_SIGNATURE \
228 ((const char[]) { 'K', 'S', 'H', 'H', 'R', 'H', 'L', 'P' })
7560fffc 229
80701564 230struct FSSHeader {
7560fffc
LP
231 uint8_t signature[8]; /* "KSHHRHLP" */
232 le32_t compatible_flags;
233 le32_t incompatible_flags;
234 sd_id128_t machine_id;
235 sd_id128_t boot_id; /* last writer */
236 le64_t header_size;
baed47c3
LP
237 le64_t start_usec;
238 le64_t interval_usec;
239 le16_t fsprg_secpar;
7560fffc 240 le16_t reserved[3];
baed47c3 241 le64_t fsprg_state_size;
80701564 242} _packed_;