]>
Commit | Line | Data |
---|---|---|
87d2c1ff LP |
1 | /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ |
2 | ||
c2f1db8f | 3 | #pragma once |
87d2c1ff LP |
4 | |
5 | /*** | |
6 | This file is part of systemd. | |
7 | ||
8 | Copyright 2011 Lennart Poettering | |
9 | ||
10 | systemd is free software; you can redistribute it and/or modify it | |
5430f7f2 LP |
11 | under the terms of the GNU Lesser General Public License as published by |
12 | the Free Software Foundation; either version 2.1 of the License, or | |
87d2c1ff LP |
13 | (at your option) any later version. |
14 | ||
15 | systemd is distributed in the hope that it will be useful, but | |
16 | WITHOUT ANY WARRANTY; without even the implied warranty of | |
17 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
5430f7f2 | 18 | Lesser General Public License for more details. |
87d2c1ff | 19 | |
5430f7f2 | 20 | You should have received a copy of the GNU Lesser General Public License |
87d2c1ff LP |
21 | along with systemd; If not, see <http://www.gnu.org/licenses/>. |
22 | ***/ | |
23 | ||
4fd052ae | 24 | #include "sparse-endian.h" |
87d2c1ff | 25 | |
81527be1 LP |
26 | #include <systemd/sd-id128.h> |
27 | ||
87d2c1ff | 28 | #include "macro.h" |
87d2c1ff | 29 | |
0962e09e LP |
30 | /* |
31 | * If you change this file you probably should also change its documentation: | |
32 | * | |
33 | * http://www.freedesktop.org/wiki/Software/systemd/journal-files | |
34 | * | |
35 | */ | |
36 | ||
87d2c1ff | 37 | typedef struct Header Header; |
8144056f | 38 | |
87d2c1ff LP |
39 | typedef struct ObjectHeader ObjectHeader; |
40 | typedef union Object Object; | |
8144056f | 41 | |
87d2c1ff | 42 | typedef struct DataObject DataObject; |
de190aef | 43 | typedef struct FieldObject FieldObject; |
87d2c1ff LP |
44 | typedef struct EntryObject EntryObject; |
45 | typedef struct HashTableObject HashTableObject; | |
de190aef | 46 | typedef struct EntryArrayObject EntryArrayObject; |
7560fffc | 47 | typedef struct TagObject TagObject; |
8144056f | 48 | |
87d2c1ff LP |
49 | typedef struct EntryItem EntryItem; |
50 | typedef struct HashItem HashItem; | |
51 | ||
baed47c3 | 52 | typedef struct FSSHeader FSSHeader; |
7560fffc | 53 | |
87d2c1ff LP |
54 | /* Object types */ |
55 | enum { | |
56 | OBJECT_UNUSED, | |
0962e09e | 57 | OBJECT_DATA, |
de190aef | 58 | OBJECT_FIELD, |
87d2c1ff | 59 | OBJECT_ENTRY, |
de190aef LP |
60 | OBJECT_DATA_HASH_TABLE, |
61 | OBJECT_FIELD_HASH_TABLE, | |
0962e09e | 62 | OBJECT_ENTRY_ARRAY, |
7560fffc | 63 | OBJECT_TAG, |
de190aef | 64 | _OBJECT_TYPE_MAX |
87d2c1ff LP |
65 | }; |
66 | ||
807e17f0 LP |
67 | /* Object flags */ |
68 | enum { | |
69 | OBJECT_COMPRESSED = 1 | |
70 | }; | |
71 | ||
80701564 | 72 | struct ObjectHeader { |
87d2c1ff | 73 | uint8_t type; |
807e17f0 LP |
74 | uint8_t flags; |
75 | uint8_t reserved[6]; | |
4fd052ae | 76 | le64_t size; |
87d2c1ff | 77 | uint8_t payload[]; |
80701564 | 78 | } _packed_; |
87d2c1ff | 79 | |
80701564 | 80 | struct DataObject { |
87d2c1ff | 81 | ObjectHeader object; |
4fd052ae FC |
82 | le64_t hash; |
83 | le64_t next_hash_offset; | |
84 | le64_t next_field_offset; | |
85 | le64_t entry_offset; /* the first array entry we store inline */ | |
86 | le64_t entry_array_offset; | |
87 | le64_t n_entries; | |
de190aef | 88 | uint8_t payload[]; |
80701564 | 89 | } _packed_; |
de190aef | 90 | |
80701564 | 91 | struct FieldObject { |
de190aef | 92 | ObjectHeader object; |
4fd052ae FC |
93 | le64_t hash; |
94 | le64_t next_hash_offset; | |
95 | le64_t head_data_offset; | |
87d2c1ff | 96 | uint8_t payload[]; |
80701564 | 97 | } _packed_; |
87d2c1ff | 98 | |
80701564 | 99 | struct EntryItem { |
4fd052ae FC |
100 | le64_t object_offset; |
101 | le64_t hash; | |
80701564 | 102 | } _packed_; |
87d2c1ff | 103 | |
80701564 | 104 | struct EntryObject { |
87d2c1ff | 105 | ObjectHeader object; |
4fd052ae FC |
106 | le64_t seqnum; |
107 | le64_t realtime; | |
108 | le64_t monotonic; | |
cec736d2 | 109 | sd_id128_t boot_id; |
4fd052ae | 110 | le64_t xor_hash; |
87d2c1ff | 111 | EntryItem items[]; |
80701564 | 112 | } _packed_; |
87d2c1ff | 113 | |
80701564 | 114 | struct HashItem { |
4fd052ae FC |
115 | le64_t head_hash_offset; |
116 | le64_t tail_hash_offset; | |
80701564 | 117 | } _packed_; |
87d2c1ff | 118 | |
80701564 | 119 | struct HashTableObject { |
87d2c1ff | 120 | ObjectHeader object; |
de190aef | 121 | HashItem items[]; |
80701564 | 122 | } _packed_; |
87d2c1ff | 123 | |
80701564 | 124 | struct EntryArrayObject { |
87d2c1ff | 125 | ObjectHeader object; |
4fd052ae FC |
126 | le64_t next_entry_array_offset; |
127 | le64_t items[]; | |
80701564 | 128 | } _packed_; |
87d2c1ff | 129 | |
7560fffc | 130 | #define TAG_LENGTH (256/8) |
8144056f | 131 | |
80701564 | 132 | struct TagObject { |
8144056f | 133 | ObjectHeader object; |
e8c61d7b LP |
134 | le64_t seqnum; |
135 | le64_t epoch; | |
7560fffc | 136 | uint8_t tag[TAG_LENGTH]; /* SHA-256 HMAC */ |
80701564 | 137 | } _packed_; |
8144056f | 138 | |
87d2c1ff LP |
139 | union Object { |
140 | ObjectHeader object; | |
141 | DataObject data; | |
de190aef | 142 | FieldObject field; |
87d2c1ff LP |
143 | EntryObject entry; |
144 | HashTableObject hash_table; | |
de190aef | 145 | EntryArrayObject entry_array; |
7560fffc | 146 | TagObject tag; |
87d2c1ff LP |
147 | }; |
148 | ||
149 | enum { | |
db11ac1a LP |
150 | STATE_OFFLINE = 0, |
151 | STATE_ONLINE = 1, | |
152 | STATE_ARCHIVED = 2, | |
153 | _STATE_MAX | |
87d2c1ff LP |
154 | }; |
155 | ||
807e17f0 LP |
156 | /* Header flags */ |
157 | enum { | |
158 | HEADER_INCOMPATIBLE_COMPRESSED = 1 | |
159 | }; | |
160 | ||
8144056f | 161 | enum { |
baed47c3 | 162 | HEADER_COMPATIBLE_SEALED = 1 |
8144056f LP |
163 | }; |
164 | ||
7560fffc LP |
165 | #define HEADER_SIGNATURE ((char[]) { 'L', 'P', 'K', 'S', 'H', 'H', 'R', 'H' }) |
166 | ||
80701564 | 167 | struct Header { |
87d2c1ff | 168 | uint8_t signature[8]; /* "LPKSHHRH" */ |
7560fffc LP |
169 | le32_t compatible_flags; |
170 | le32_t incompatible_flags; | |
de190aef LP |
171 | uint8_t state; |
172 | uint8_t reserved[7]; | |
87d2c1ff | 173 | sd_id128_t file_id; |
7560fffc | 174 | sd_id128_t machine_id; |
08984293 | 175 | sd_id128_t boot_id; /* last writer */ |
cec736d2 | 176 | sd_id128_t seqnum_id; |
23b0b2b2 | 177 | le64_t header_size; |
4fd052ae | 178 | le64_t arena_size; |
0962e09e | 179 | le64_t data_hash_table_offset; |
4fd052ae | 180 | le64_t data_hash_table_size; |
0962e09e | 181 | le64_t field_hash_table_offset; |
4fd052ae FC |
182 | le64_t field_hash_table_size; |
183 | le64_t tail_object_offset; | |
184 | le64_t n_objects; | |
185 | le64_t n_entries; | |
beec0085 LP |
186 | le64_t tail_entry_seqnum; |
187 | le64_t head_entry_seqnum; | |
4fd052ae FC |
188 | le64_t entry_array_offset; |
189 | le64_t head_entry_realtime; | |
190 | le64_t tail_entry_realtime; | |
191 | le64_t tail_entry_monotonic; | |
dca6219e LP |
192 | /* Added in 187 */ |
193 | le64_t n_data; | |
194 | le64_t n_fields; | |
d98cc1f2 LP |
195 | /* Added in 189 */ |
196 | le64_t n_tags; | |
2dee23eb | 197 | le64_t n_entry_arrays; |
fb9a24b6 LP |
198 | |
199 | /* Size: 224 */ | |
80701564 | 200 | } _packed_; |
7560fffc | 201 | |
baed47c3 | 202 | #define FSS_HEADER_SIGNATURE ((char[]) { 'K', 'S', 'H', 'H', 'R', 'H', 'L', 'P' }) |
7560fffc | 203 | |
80701564 | 204 | struct FSSHeader { |
7560fffc LP |
205 | uint8_t signature[8]; /* "KSHHRHLP" */ |
206 | le32_t compatible_flags; | |
207 | le32_t incompatible_flags; | |
208 | sd_id128_t machine_id; | |
209 | sd_id128_t boot_id; /* last writer */ | |
210 | le64_t header_size; | |
baed47c3 LP |
211 | le64_t start_usec; |
212 | le64_t interval_usec; | |
213 | le16_t fsprg_secpar; | |
7560fffc | 214 | le16_t reserved[3]; |
baed47c3 | 215 | le64_t fsprg_state_size; |
80701564 | 216 | } _packed_; |