]>
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 LP |
29 | |
30 | typedef struct Header Header; | |
8144056f | 31 | |
87d2c1ff LP |
32 | typedef struct ObjectHeader ObjectHeader; |
33 | typedef union Object Object; | |
8144056f | 34 | |
87d2c1ff | 35 | typedef struct DataObject DataObject; |
de190aef | 36 | typedef struct FieldObject FieldObject; |
87d2c1ff LP |
37 | typedef struct EntryObject EntryObject; |
38 | typedef struct HashTableObject HashTableObject; | |
de190aef | 39 | typedef struct EntryArrayObject EntryArrayObject; |
7560fffc | 40 | typedef struct TagObject TagObject; |
8144056f | 41 | |
87d2c1ff LP |
42 | typedef struct EntryItem EntryItem; |
43 | typedef struct HashItem HashItem; | |
44 | ||
7560fffc LP |
45 | typedef struct FSPRGHeader FSPRGHeader; |
46 | ||
87d2c1ff LP |
47 | /* Object types */ |
48 | enum { | |
49 | OBJECT_UNUSED, | |
50 | OBJECT_DATA, | |
de190aef | 51 | OBJECT_FIELD, |
87d2c1ff | 52 | OBJECT_ENTRY, |
de190aef LP |
53 | OBJECT_DATA_HASH_TABLE, |
54 | OBJECT_FIELD_HASH_TABLE, | |
55 | OBJECT_ENTRY_ARRAY, | |
7560fffc | 56 | OBJECT_TAG, |
de190aef | 57 | _OBJECT_TYPE_MAX |
87d2c1ff LP |
58 | }; |
59 | ||
807e17f0 LP |
60 | /* Object flags */ |
61 | enum { | |
62 | OBJECT_COMPRESSED = 1 | |
63 | }; | |
64 | ||
87d2c1ff LP |
65 | _packed_ struct ObjectHeader { |
66 | uint8_t type; | |
807e17f0 LP |
67 | uint8_t flags; |
68 | uint8_t reserved[6]; | |
4fd052ae | 69 | le64_t size; |
87d2c1ff LP |
70 | uint8_t payload[]; |
71 | }; | |
72 | ||
73 | _packed_ struct DataObject { | |
74 | ObjectHeader object; | |
4fd052ae FC |
75 | le64_t hash; |
76 | le64_t next_hash_offset; | |
77 | le64_t next_field_offset; | |
78 | le64_t entry_offset; /* the first array entry we store inline */ | |
79 | le64_t entry_array_offset; | |
80 | le64_t n_entries; | |
de190aef LP |
81 | uint8_t payload[]; |
82 | }; | |
83 | ||
84 | _packed_ struct FieldObject { | |
85 | ObjectHeader object; | |
4fd052ae FC |
86 | le64_t hash; |
87 | le64_t next_hash_offset; | |
88 | le64_t head_data_offset; | |
87d2c1ff LP |
89 | uint8_t payload[]; |
90 | }; | |
91 | ||
92 | _packed_ struct EntryItem { | |
4fd052ae FC |
93 | le64_t object_offset; |
94 | le64_t hash; | |
87d2c1ff LP |
95 | }; |
96 | ||
97 | _packed_ struct EntryObject { | |
98 | ObjectHeader object; | |
4fd052ae FC |
99 | le64_t seqnum; |
100 | le64_t realtime; | |
101 | le64_t monotonic; | |
cec736d2 | 102 | sd_id128_t boot_id; |
4fd052ae | 103 | le64_t xor_hash; |
87d2c1ff LP |
104 | EntryItem items[]; |
105 | }; | |
106 | ||
107 | _packed_ struct HashItem { | |
4fd052ae FC |
108 | le64_t head_hash_offset; |
109 | le64_t tail_hash_offset; | |
87d2c1ff LP |
110 | }; |
111 | ||
112 | _packed_ struct HashTableObject { | |
113 | ObjectHeader object; | |
de190aef | 114 | HashItem items[]; |
87d2c1ff LP |
115 | }; |
116 | ||
de190aef | 117 | _packed_ struct EntryArrayObject { |
87d2c1ff | 118 | ObjectHeader object; |
4fd052ae FC |
119 | le64_t next_entry_array_offset; |
120 | le64_t items[]; | |
87d2c1ff LP |
121 | }; |
122 | ||
7560fffc | 123 | #define TAG_LENGTH (256/8) |
8144056f | 124 | |
7560fffc | 125 | _packed_ struct TagObject { |
8144056f | 126 | ObjectHeader object; |
7560fffc | 127 | uint8_t tag[TAG_LENGTH]; /* SHA-256 HMAC */ |
8144056f LP |
128 | }; |
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 { | |
141 | STATE_OFFLINE, | |
142 | STATE_ONLINE, | |
143 | STATE_ARCHIVED | |
144 | }; | |
145 | ||
807e17f0 LP |
146 | /* Header flags */ |
147 | enum { | |
148 | HEADER_INCOMPATIBLE_COMPRESSED = 1 | |
149 | }; | |
150 | ||
8144056f | 151 | enum { |
7560fffc | 152 | HEADER_COMPATIBLE_AUTHENTICATED = 1 |
8144056f LP |
153 | }; |
154 | ||
7560fffc LP |
155 | #define HEADER_SIGNATURE ((char[]) { 'L', 'P', 'K', 'S', 'H', 'H', 'R', 'H' }) |
156 | ||
87d2c1ff LP |
157 | _packed_ struct Header { |
158 | uint8_t signature[8]; /* "LPKSHHRH" */ | |
7560fffc LP |
159 | le32_t compatible_flags; |
160 | le32_t incompatible_flags; | |
de190aef LP |
161 | uint8_t state; |
162 | uint8_t reserved[7]; | |
87d2c1ff | 163 | sd_id128_t file_id; |
7560fffc | 164 | sd_id128_t machine_id; |
08984293 | 165 | sd_id128_t boot_id; /* last writer */ |
cec736d2 | 166 | sd_id128_t seqnum_id; |
23b0b2b2 | 167 | le64_t header_size; |
4fd052ae FC |
168 | le64_t arena_size; |
169 | le64_t data_hash_table_offset; /* for looking up data objects */ | |
170 | le64_t data_hash_table_size; | |
171 | le64_t field_hash_table_offset; /* for looking up field objects */ | |
172 | le64_t field_hash_table_size; | |
173 | le64_t tail_object_offset; | |
174 | le64_t n_objects; | |
175 | le64_t n_entries; | |
dca6219e LP |
176 | le64_t tail_seqnum; |
177 | le64_t head_seqnum; | |
4fd052ae FC |
178 | le64_t entry_array_offset; |
179 | le64_t head_entry_realtime; | |
180 | le64_t tail_entry_realtime; | |
181 | le64_t tail_entry_monotonic; | |
dca6219e LP |
182 | /* Added in 187 */ |
183 | le64_t n_data; | |
184 | le64_t n_fields; | |
87d2c1ff | 185 | }; |
7560fffc LP |
186 | |
187 | #define FSPRG_HEADER_SIGNATURE ((char[]) { 'K', 'S', 'H', 'H', 'R', 'H', 'L', 'P' }) | |
188 | ||
189 | _packed_ struct FSPRGHeader { | |
190 | uint8_t signature[8]; /* "KSHHRHLP" */ | |
191 | le32_t compatible_flags; | |
192 | le32_t incompatible_flags; | |
193 | sd_id128_t machine_id; | |
194 | sd_id128_t boot_id; /* last writer */ | |
195 | le64_t header_size; | |
196 | le64_t fsprg_start_usec; | |
197 | le64_t fsprg_interval_usec; | |
198 | le16_t secpar; | |
199 | le16_t reserved[3]; | |
200 | le64_t state_size; | |
201 | }; |