]>
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 | |
0962e09e LP |
13 | */ |
14 | ||
87d2c1ff | 15 | typedef struct Header Header; |
8144056f | 16 | |
87d2c1ff LP |
17 | typedef struct ObjectHeader ObjectHeader; |
18 | typedef union Object Object; | |
8144056f | 19 | |
87d2c1ff | 20 | typedef struct DataObject DataObject; |
de190aef | 21 | typedef struct FieldObject FieldObject; |
87d2c1ff LP |
22 | typedef struct EntryObject EntryObject; |
23 | typedef struct HashTableObject HashTableObject; | |
de190aef | 24 | typedef struct EntryArrayObject EntryArrayObject; |
7560fffc | 25 | typedef struct TagObject TagObject; |
8144056f | 26 | |
87d2c1ff LP |
27 | typedef struct EntryItem EntryItem; |
28 | typedef struct HashItem HashItem; | |
29 | ||
baed47c3 | 30 | typedef struct FSSHeader FSSHeader; |
7560fffc | 31 | |
87d2c1ff | 32 | /* Object types */ |
78519831 | 33 | typedef 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 */ |
46 | enum { | |
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 | 54 | struct 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 | ||
73 | struct DataObject DataObject__contents; | |
74 | struct DataObject__packed DataObject__contents _packed_; | |
75 | assert_cc(sizeof(struct DataObject) == sizeof(struct DataObject__packed)); | |
de190aef | 76 | |
80701564 | 77 | struct 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 | 85 | struct 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 | ||
100 | struct EntryObject EntryObject__contents; | |
101 | struct EntryObject__packed EntryObject__contents _packed_; | |
102 | assert_cc(sizeof(struct EntryObject) == sizeof(struct EntryObject__packed)); | |
103 | ||
87d2c1ff | 104 | |
80701564 | 105 | struct HashItem { |
4fd052ae FC |
106 | le64_t head_hash_offset; |
107 | le64_t tail_hash_offset; | |
80701564 | 108 | } _packed_; |
87d2c1ff | 109 | |
80701564 | 110 | struct HashTableObject { |
87d2c1ff | 111 | ObjectHeader object; |
de190aef | 112 | HashItem items[]; |
80701564 | 113 | } _packed_; |
87d2c1ff | 114 | |
80701564 | 115 | struct 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 | 123 | struct 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 |
130 | union 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 | ||
140 | enum { | |
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 */ |
148 | enum { | |
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 | 165 | enum { |
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 | ||
211 | struct Header struct_Header__contents; | |
212 | struct Header__packed struct_Header__contents _packed_; | |
213 | assert_cc(sizeof(struct Header) == sizeof(struct Header__packed)); | |
214 | assert_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 | 218 | struct 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_; |