]>
Commit | Line | Data |
---|---|---|
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 | |
13 | * | |
14 | */ | |
15 | ||
87d2c1ff | 16 | typedef struct Header Header; |
8144056f | 17 | |
87d2c1ff LP |
18 | typedef struct ObjectHeader ObjectHeader; |
19 | typedef union Object Object; | |
8144056f | 20 | |
87d2c1ff | 21 | typedef struct DataObject DataObject; |
de190aef | 22 | typedef struct FieldObject FieldObject; |
87d2c1ff LP |
23 | typedef struct EntryObject EntryObject; |
24 | typedef struct HashTableObject HashTableObject; | |
de190aef | 25 | typedef struct EntryArrayObject EntryArrayObject; |
7560fffc | 26 | typedef struct TagObject TagObject; |
8144056f | 27 | |
87d2c1ff LP |
28 | typedef struct EntryItem EntryItem; |
29 | typedef struct HashItem HashItem; | |
30 | ||
baed47c3 | 31 | typedef struct FSSHeader FSSHeader; |
7560fffc | 32 | |
87d2c1ff | 33 | /* Object types */ |
78519831 | 34 | typedef enum ObjectType { |
d05089d8 | 35 | OBJECT_UNUSED, /* also serves as "any type" or "additional context" */ |
0962e09e | 36 | OBJECT_DATA, |
de190aef | 37 | OBJECT_FIELD, |
87d2c1ff | 38 | OBJECT_ENTRY, |
de190aef LP |
39 | OBJECT_DATA_HASH_TABLE, |
40 | OBJECT_FIELD_HASH_TABLE, | |
0962e09e | 41 | OBJECT_ENTRY_ARRAY, |
7560fffc | 42 | OBJECT_TAG, |
de190aef | 43 | _OBJECT_TYPE_MAX |
78519831 | 44 | } ObjectType; |
87d2c1ff | 45 | |
807e17f0 LP |
46 | /* Object flags */ |
47 | enum { | |
d89c8fdf ZJS |
48 | OBJECT_COMPRESSED_XZ = 1 << 0, |
49 | OBJECT_COMPRESSED_LZ4 = 1 << 1, | |
50 | _OBJECT_COMPRESSED_MAX | |
807e17f0 LP |
51 | }; |
52 | ||
d89c8fdf ZJS |
53 | #define OBJECT_COMPRESSION_MASK (OBJECT_COMPRESSED_XZ | OBJECT_COMPRESSED_LZ4) |
54 | ||
80701564 | 55 | struct ObjectHeader { |
87d2c1ff | 56 | uint8_t type; |
807e17f0 LP |
57 | uint8_t flags; |
58 | uint8_t reserved[6]; | |
4fd052ae | 59 | le64_t size; |
87d2c1ff | 60 | uint8_t payload[]; |
80701564 | 61 | } _packed_; |
87d2c1ff | 62 | |
80701564 | 63 | struct DataObject { |
87d2c1ff | 64 | ObjectHeader object; |
4fd052ae FC |
65 | le64_t hash; |
66 | le64_t next_hash_offset; | |
67 | le64_t next_field_offset; | |
68 | le64_t entry_offset; /* the first array entry we store inline */ | |
69 | le64_t entry_array_offset; | |
70 | le64_t n_entries; | |
de190aef | 71 | uint8_t payload[]; |
80701564 | 72 | } _packed_; |
de190aef | 73 | |
80701564 | 74 | struct FieldObject { |
de190aef | 75 | ObjectHeader object; |
4fd052ae FC |
76 | le64_t hash; |
77 | le64_t next_hash_offset; | |
78 | le64_t head_data_offset; | |
87d2c1ff | 79 | uint8_t payload[]; |
80701564 | 80 | } _packed_; |
87d2c1ff | 81 | |
80701564 | 82 | struct EntryItem { |
4fd052ae FC |
83 | le64_t object_offset; |
84 | le64_t hash; | |
80701564 | 85 | } _packed_; |
87d2c1ff | 86 | |
80701564 | 87 | struct EntryObject { |
87d2c1ff | 88 | ObjectHeader object; |
4fd052ae FC |
89 | le64_t seqnum; |
90 | le64_t realtime; | |
91 | le64_t monotonic; | |
cec736d2 | 92 | sd_id128_t boot_id; |
4fd052ae | 93 | le64_t xor_hash; |
87d2c1ff | 94 | EntryItem items[]; |
80701564 | 95 | } _packed_; |
87d2c1ff | 96 | |
80701564 | 97 | struct HashItem { |
4fd052ae FC |
98 | le64_t head_hash_offset; |
99 | le64_t tail_hash_offset; | |
80701564 | 100 | } _packed_; |
87d2c1ff | 101 | |
80701564 | 102 | struct HashTableObject { |
87d2c1ff | 103 | ObjectHeader object; |
de190aef | 104 | HashItem items[]; |
80701564 | 105 | } _packed_; |
87d2c1ff | 106 | |
80701564 | 107 | struct EntryArrayObject { |
87d2c1ff | 108 | ObjectHeader object; |
4fd052ae FC |
109 | le64_t next_entry_array_offset; |
110 | le64_t items[]; | |
80701564 | 111 | } _packed_; |
87d2c1ff | 112 | |
7560fffc | 113 | #define TAG_LENGTH (256/8) |
8144056f | 114 | |
80701564 | 115 | struct TagObject { |
8144056f | 116 | ObjectHeader object; |
e8c61d7b LP |
117 | le64_t seqnum; |
118 | le64_t epoch; | |
7560fffc | 119 | uint8_t tag[TAG_LENGTH]; /* SHA-256 HMAC */ |
80701564 | 120 | } _packed_; |
8144056f | 121 | |
87d2c1ff LP |
122 | union Object { |
123 | ObjectHeader object; | |
124 | DataObject data; | |
de190aef | 125 | FieldObject field; |
87d2c1ff LP |
126 | EntryObject entry; |
127 | HashTableObject hash_table; | |
de190aef | 128 | EntryArrayObject entry_array; |
7560fffc | 129 | TagObject tag; |
87d2c1ff LP |
130 | }; |
131 | ||
132 | enum { | |
db11ac1a LP |
133 | STATE_OFFLINE = 0, |
134 | STATE_ONLINE = 1, | |
135 | STATE_ARCHIVED = 2, | |
136 | _STATE_MAX | |
87d2c1ff LP |
137 | }; |
138 | ||
807e17f0 LP |
139 | /* Header flags */ |
140 | enum { | |
d89c8fdf ZJS |
141 | HEADER_INCOMPATIBLE_COMPRESSED_XZ = 1 << 0, |
142 | HEADER_INCOMPATIBLE_COMPRESSED_LZ4 = 1 << 1, | |
807e17f0 LP |
143 | }; |
144 | ||
d89c8fdf ZJS |
145 | #define HEADER_INCOMPATIBLE_ANY (HEADER_INCOMPATIBLE_COMPRESSED_XZ|HEADER_INCOMPATIBLE_COMPRESSED_LZ4) |
146 | ||
349cc4a5 | 147 | #if HAVE_XZ && HAVE_LZ4 |
d89c8fdf | 148 | # define HEADER_INCOMPATIBLE_SUPPORTED HEADER_INCOMPATIBLE_ANY |
349cc4a5 | 149 | #elif HAVE_XZ |
d89c8fdf | 150 | # define HEADER_INCOMPATIBLE_SUPPORTED HEADER_INCOMPATIBLE_COMPRESSED_XZ |
349cc4a5 | 151 | #elif HAVE_LZ4 |
d89c8fdf ZJS |
152 | # define HEADER_INCOMPATIBLE_SUPPORTED HEADER_INCOMPATIBLE_COMPRESSED_LZ4 |
153 | #else | |
154 | # define HEADER_INCOMPATIBLE_SUPPORTED 0 | |
155 | #endif | |
156 | ||
8144056f | 157 | enum { |
baed47c3 | 158 | HEADER_COMPATIBLE_SEALED = 1 |
8144056f LP |
159 | }; |
160 | ||
d89c8fdf | 161 | #define HEADER_COMPATIBLE_ANY HEADER_COMPATIBLE_SEALED |
349cc4a5 | 162 | #if HAVE_GCRYPT |
d89c8fdf ZJS |
163 | # define HEADER_COMPATIBLE_SUPPORTED HEADER_COMPATIBLE_SEALED |
164 | #else | |
165 | # define HEADER_COMPATIBLE_SUPPORTED 0 | |
166 | #endif | |
167 | ||
7560fffc LP |
168 | #define HEADER_SIGNATURE ((char[]) { 'L', 'P', 'K', 'S', 'H', 'H', 'R', 'H' }) |
169 | ||
80701564 | 170 | struct Header { |
87d2c1ff | 171 | uint8_t signature[8]; /* "LPKSHHRH" */ |
7560fffc LP |
172 | le32_t compatible_flags; |
173 | le32_t incompatible_flags; | |
de190aef LP |
174 | uint8_t state; |
175 | uint8_t reserved[7]; | |
87d2c1ff | 176 | sd_id128_t file_id; |
7560fffc | 177 | sd_id128_t machine_id; |
08984293 | 178 | sd_id128_t boot_id; /* last writer */ |
cec736d2 | 179 | sd_id128_t seqnum_id; |
23b0b2b2 | 180 | le64_t header_size; |
4fd052ae | 181 | le64_t arena_size; |
0962e09e | 182 | le64_t data_hash_table_offset; |
4fd052ae | 183 | le64_t data_hash_table_size; |
0962e09e | 184 | le64_t field_hash_table_offset; |
4fd052ae FC |
185 | le64_t field_hash_table_size; |
186 | le64_t tail_object_offset; | |
187 | le64_t n_objects; | |
188 | le64_t n_entries; | |
beec0085 LP |
189 | le64_t tail_entry_seqnum; |
190 | le64_t head_entry_seqnum; | |
4fd052ae FC |
191 | le64_t entry_array_offset; |
192 | le64_t head_entry_realtime; | |
193 | le64_t tail_entry_realtime; | |
194 | le64_t tail_entry_monotonic; | |
dca6219e LP |
195 | /* Added in 187 */ |
196 | le64_t n_data; | |
197 | le64_t n_fields; | |
d98cc1f2 LP |
198 | /* Added in 189 */ |
199 | le64_t n_tags; | |
2dee23eb | 200 | le64_t n_entry_arrays; |
fb9a24b6 | 201 | |
b4a855e9 | 202 | /* Size: 240 */ |
80701564 | 203 | } _packed_; |
7560fffc | 204 | |
baed47c3 | 205 | #define FSS_HEADER_SIGNATURE ((char[]) { 'K', 'S', 'H', 'H', 'R', 'H', 'L', 'P' }) |
7560fffc | 206 | |
80701564 | 207 | struct FSSHeader { |
7560fffc LP |
208 | uint8_t signature[8]; /* "KSHHRHLP" */ |
209 | le32_t compatible_flags; | |
210 | le32_t incompatible_flags; | |
211 | sd_id128_t machine_id; | |
212 | sd_id128_t boot_id; /* last writer */ | |
213 | le64_t header_size; | |
baed47c3 LP |
214 | le64_t start_usec; |
215 | le64_t interval_usec; | |
216 | le16_t fsprg_secpar; | |
7560fffc | 217 | le16_t reserved[3]; |
baed47c3 | 218 | le64_t fsprg_state_size; |
80701564 | 219 | } _packed_; |