]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/journal/journal-def.h
Merge pull request #11827 from keszybz/pkgconfig-variables
[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 {
d89c8fdf
ZJS
47 OBJECT_COMPRESSED_XZ = 1 << 0,
48 OBJECT_COMPRESSED_LZ4 = 1 << 1,
49 _OBJECT_COMPRESSED_MAX
807e17f0
LP
50};
51
d89c8fdf
ZJS
52#define OBJECT_COMPRESSION_MASK (OBJECT_COMPRESSED_XZ | OBJECT_COMPRESSED_LZ4)
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
80701564 77struct FieldObject {
de190aef 78 ObjectHeader object;
4fd052ae
FC
79 le64_t hash;
80 le64_t next_hash_offset;
81 le64_t head_data_offset;
87d2c1ff 82 uint8_t payload[];
80701564 83} _packed_;
87d2c1ff 84
80701564 85struct EntryItem {
4fd052ae
FC
86 le64_t object_offset;
87 le64_t hash;
80701564 88} _packed_;
87d2c1ff 89
62353f69
ZJS
90#define EntryObject__contents { \
91 ObjectHeader object; \
92 le64_t seqnum; \
93 le64_t realtime; \
94 le64_t monotonic; \
95 sd_id128_t boot_id; \
96 le64_t xor_hash; \
97 EntryItem items[]; \
98 }
99
100struct EntryObject EntryObject__contents;
101struct EntryObject__packed EntryObject__contents _packed_;
102assert_cc(sizeof(struct EntryObject) == sizeof(struct EntryObject__packed));
103
87d2c1ff 104
80701564 105struct HashItem {
4fd052ae
FC
106 le64_t head_hash_offset;
107 le64_t tail_hash_offset;
80701564 108} _packed_;
87d2c1ff 109
80701564 110struct HashTableObject {
87d2c1ff 111 ObjectHeader object;
de190aef 112 HashItem items[];
80701564 113} _packed_;
87d2c1ff 114
80701564 115struct EntryArrayObject {
87d2c1ff 116 ObjectHeader object;
4fd052ae
FC
117 le64_t next_entry_array_offset;
118 le64_t items[];
80701564 119} _packed_;
87d2c1ff 120
7560fffc 121#define TAG_LENGTH (256/8)
8144056f 122
80701564 123struct TagObject {
8144056f 124 ObjectHeader object;
e8c61d7b
LP
125 le64_t seqnum;
126 le64_t epoch;
7560fffc 127 uint8_t tag[TAG_LENGTH]; /* SHA-256 HMAC */
80701564 128} _packed_;
8144056f 129
87d2c1ff
LP
130union Object {
131 ObjectHeader object;
132 DataObject data;
de190aef 133 FieldObject field;
87d2c1ff
LP
134 EntryObject entry;
135 HashTableObject hash_table;
de190aef 136 EntryArrayObject entry_array;
7560fffc 137 TagObject tag;
87d2c1ff
LP
138};
139
140enum {
db11ac1a
LP
141 STATE_OFFLINE = 0,
142 STATE_ONLINE = 1,
143 STATE_ARCHIVED = 2,
144 _STATE_MAX
87d2c1ff
LP
145};
146
807e17f0
LP
147/* Header flags */
148enum {
d89c8fdf
ZJS
149 HEADER_INCOMPATIBLE_COMPRESSED_XZ = 1 << 0,
150 HEADER_INCOMPATIBLE_COMPRESSED_LZ4 = 1 << 1,
807e17f0
LP
151};
152
d89c8fdf
ZJS
153#define HEADER_INCOMPATIBLE_ANY (HEADER_INCOMPATIBLE_COMPRESSED_XZ|HEADER_INCOMPATIBLE_COMPRESSED_LZ4)
154
349cc4a5 155#if HAVE_XZ && HAVE_LZ4
d89c8fdf 156# define HEADER_INCOMPATIBLE_SUPPORTED HEADER_INCOMPATIBLE_ANY
349cc4a5 157#elif HAVE_XZ
d89c8fdf 158# define HEADER_INCOMPATIBLE_SUPPORTED HEADER_INCOMPATIBLE_COMPRESSED_XZ
349cc4a5 159#elif HAVE_LZ4
d89c8fdf
ZJS
160# define HEADER_INCOMPATIBLE_SUPPORTED HEADER_INCOMPATIBLE_COMPRESSED_LZ4
161#else
162# define HEADER_INCOMPATIBLE_SUPPORTED 0
163#endif
164
8144056f 165enum {
baed47c3 166 HEADER_COMPATIBLE_SEALED = 1
8144056f
LP
167};
168
d89c8fdf 169#define HEADER_COMPATIBLE_ANY HEADER_COMPATIBLE_SEALED
349cc4a5 170#if HAVE_GCRYPT
d89c8fdf
ZJS
171# define HEADER_COMPATIBLE_SUPPORTED HEADER_COMPATIBLE_SEALED
172#else
173# define HEADER_COMPATIBLE_SUPPORTED 0
174#endif
175
7560fffc
LP
176#define HEADER_SIGNATURE ((char[]) { 'L', 'P', 'K', 'S', 'H', 'H', 'R', 'H' })
177
62353f69
ZJS
178#define struct_Header__contents { \
179 uint8_t signature[8]; /* "LPKSHHRH" */ \
180 le32_t compatible_flags; \
181 le32_t incompatible_flags; \
182 uint8_t state; \
183 uint8_t reserved[7]; \
184 sd_id128_t file_id; \
185 sd_id128_t machine_id; \
186 sd_id128_t boot_id; /* last writer */ \
187 sd_id128_t seqnum_id; \
188 le64_t header_size; \
189 le64_t arena_size; \
190 le64_t data_hash_table_offset; \
191 le64_t data_hash_table_size; \
192 le64_t field_hash_table_offset; \
193 le64_t field_hash_table_size; \
194 le64_t tail_object_offset; \
195 le64_t n_objects; \
196 le64_t n_entries; \
197 le64_t tail_entry_seqnum; \
198 le64_t head_entry_seqnum; \
199 le64_t entry_array_offset; \
200 le64_t head_entry_realtime; \
201 le64_t tail_entry_realtime; \
202 le64_t tail_entry_monotonic; \
203 /* Added in 187 */ \
204 le64_t n_data; \
205 le64_t n_fields; \
206 /* Added in 189 */ \
207 le64_t n_tags; \
208 le64_t n_entry_arrays; \
209 }
210
211struct Header struct_Header__contents;
212struct Header__packed struct_Header__contents _packed_;
213assert_cc(sizeof(struct Header) == sizeof(struct Header__packed));
214assert_cc(sizeof(struct Header) == 240);
7560fffc 215
baed47c3 216#define FSS_HEADER_SIGNATURE ((char[]) { 'K', 'S', 'H', 'H', 'R', 'H', 'L', 'P' })
7560fffc 217
80701564 218struct FSSHeader {
7560fffc
LP
219 uint8_t signature[8]; /* "KSHHRHLP" */
220 le32_t compatible_flags;
221 le32_t incompatible_flags;
222 sd_id128_t machine_id;
223 sd_id128_t boot_id; /* last writer */
224 le64_t header_size;
baed47c3
LP
225 le64_t start_usec;
226 le64_t interval_usec;
227 le16_t fsprg_secpar;
7560fffc 228 le16_t reserved[3];
baed47c3 229 le64_t fsprg_state_size;
80701564 230} _packed_;