]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/journal/journal-file.h
build-sys: use #if Y instead of #ifdef Y everywhere
[thirdparty/systemd.git] / src / journal / journal-file.h
CommitLineData
c2f1db8f 1#pragma once
87d2c1ff
LP
2
3/***
4 This file is part of systemd.
5
6 Copyright 2011 Lennart Poettering
7
8 systemd is free software; you can redistribute it and/or modify it
5430f7f2
LP
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
87d2c1ff
LP
11 (at your option) any later version.
12
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5430f7f2 16 Lesser General Public License for more details.
87d2c1ff 17
5430f7f2 18 You should have received a copy of the GNU Lesser General Public License
87d2c1ff
LP
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
20***/
21
22#include <inttypes.h>
23
349cc4a5 24#if HAVE_GCRYPT
7560fffc
LP
25#include <gcrypt.h>
26#endif
27
fa6ac760 28#include "sd-id128.h"
81527be1 29
71d35b6b 30#include "hashmap.h"
87d2c1ff 31#include "journal-def.h"
a2341f68 32#include "macro.h"
16e9f408 33#include "mmap-cache.h"
7a24f3bf 34#include "sd-event.h"
71d35b6b 35#include "sparse-endian.h"
de190aef 36
bc85bfee 37typedef struct JournalMetrics {
8580d1f7
LP
38 /* For all these: -1 means "pick automatically", and 0 means "no limit enforced" */
39 uint64_t max_size; /* how large journal files grow at max */
40 uint64_t min_size; /* how large journal files grow at least */
41 uint64_t max_use; /* how much disk space to use in total at max, keep_free permitting */
42 uint64_t min_use; /* how much disk space to use in total at least, even if keep_free says not to */
43 uint64_t keep_free; /* how much to keep free on disk */
44 uint64_t n_max_files; /* how many files to keep around at max */
bc85bfee
LP
45} JournalMetrics;
46
87011c25
ZJS
47typedef enum direction {
48 DIRECTION_UP,
49 DIRECTION_DOWN
50} direction_t;
51
99cc7653
MS
52typedef enum LocationType {
53 /* The first and last entries, resp. */
54 LOCATION_HEAD,
55 LOCATION_TAIL,
56
57 /* We already read the entry we currently point to, and the
58 * next one to read should probably not be this one again. */
59 LOCATION_DISCRETE,
60
61 /* We should seek to the precise location specified, and
62 * return it, as we haven't read it yet. */
63 LOCATION_SEEK
64} LocationType;
65
ac2e41f5
VC
66typedef enum OfflineState {
67 OFFLINE_JOINED,
68 OFFLINE_SYNCING,
69 OFFLINE_OFFLINING,
70 OFFLINE_CANCEL,
71 OFFLINE_AGAIN_FROM_SYNCING,
72 OFFLINE_AGAIN_FROM_OFFLINING,
73 OFFLINE_DONE
74} OfflineState;
75
f4b47811
LP
76typedef struct JournalFile {
77 int fd;
be7cdd8e 78 MMapFileDescriptor *cache_fd;
87011c25 79
0ac38b70 80 mode_t mode;
7560fffc 81
0ac38b70 82 int flags;
f4b47811 83 int prot;
b8e891e6 84 bool writable:1;
d89c8fdf
ZJS
85 bool compress_xz:1;
86 bool compress_lz4:1;
b8e891e6 87 bool seal:1;
f27a3864 88 bool defrag_on_close:1;
5d1ce257 89 bool close_fd:1;
8eb85171 90 bool archive:1;
7560fffc 91
b8e891e6 92 bool tail_entry_monotonic_valid:1;
f4b47811 93
87011c25 94 direction_t last_direction;
6573ef05 95 LocationType location_type;
6e693b42 96 uint64_t last_n_entries;
87011c25
ZJS
97
98 char *path;
99 struct stat last_stat;
2678031a 100 usec_t last_stat_usec;
87011c25 101
f4b47811 102 Header *header;
de190aef
LP
103 HashItem *data_hash_table;
104 HashItem *field_hash_table;
f4b47811 105
f4b47811 106 uint64_t current_offset;
6573ef05
MS
107 uint64_t current_seqnum;
108 uint64_t current_realtime;
109 uint64_t current_monotonic;
110 sd_id128_t current_boot_id;
111 uint64_t current_xor_hash;
bc85bfee
LP
112
113 JournalMetrics metrics;
16e9f408 114 MMapCache *mmap;
807e17f0 115
7a24f3bf
VC
116 sd_event_source *post_change_timer;
117 usec_t post_change_timer_period;
118
4743015d 119 OrderedHashmap *chain_cache;
a4bcff5b 120
ac2e41f5
VC
121 pthread_t offline_thread;
122 volatile OfflineState offline_state;
123
349cc4a5 124#if HAVE_XZ || HAVE_LZ4
807e17f0 125 void *compress_buffer;
fa1c4b51 126 size_t compress_buffer_size;
807e17f0 127#endif
7560fffc 128
349cc4a5 129#if HAVE_GCRYPT
7560fffc
LP
130 gcry_md_hd_t hmac;
131 bool hmac_running;
132
baed47c3
LP
133 FSSHeader *fss_file;
134 size_t fss_file_size;
135
136 uint64_t fss_start_usec;
137 uint64_t fss_interval_usec;
b7c9ae91
LP
138
139 void *fsprg_state;
140 size_t fsprg_state_size;
141
142 void *fsprg_seed;
143 size_t fsprg_seed_size;
7560fffc 144#endif
f4b47811
LP
145} JournalFile;
146
4a92baf3 147int journal_file_open(
5d1ce257 148 int fd,
4a92baf3
LP
149 const char *fname,
150 int flags,
151 mode_t mode,
7560fffc 152 bool compress,
baed47c3 153 bool seal,
4a92baf3 154 JournalMetrics *metrics,
27370278 155 MMapCache *mmap_cache,
b58c888f 156 Set *deferred_closes,
4a92baf3
LP
157 JournalFile *template,
158 JournalFile **ret);
159
ac2e41f5 160int journal_file_set_offline(JournalFile *f, bool wait);
b58c888f 161bool journal_file_is_offlining(JournalFile *f);
804ae586 162JournalFile* journal_file_close(JournalFile *j);
b58c888f 163void journal_file_close_set(Set *s);
87d2c1ff 164
4a92baf3
LP
165int journal_file_open_reliably(
166 const char *fname,
167 int flags,
168 mode_t mode,
7560fffc 169 bool compress,
baed47c3 170 bool seal,
4a92baf3 171 JournalMetrics *metrics,
27370278 172 MMapCache *mmap_cache,
b58c888f 173 Set *deferred_closes,
4a92baf3
LP
174 JournalFile *template,
175 JournalFile **ret);
9447a7f1 176
0284adc6 177#define ALIGN64(x) (((x) + 7ULL) & ~7ULL)
db11ac1a 178#define VALID64(x) (((x) & 7ULL) == 0ULL)
0284adc6 179
ae97089d
ZJS
180/* Use six characters to cover the offsets common in smallish journal
181 * files without adding too many zeros. */
182#define OFSfmt "%06"PRIx64
183
fc89a139
LP
184static inline bool VALID_REALTIME(uint64_t u) {
185 /* This considers timestamps until the year 3112 valid. That should be plenty room... */
186 return u > 0 && u < (1ULL << 55);
187}
188
189static inline bool VALID_MONOTONIC(uint64_t u) {
190 /* This considers timestamps until 1142 years of runtime valid. */
191 return u < (1ULL << 55);
192}
193
194static inline bool VALID_EPOCH(uint64_t u) {
195 /* This allows changing the key for 1142 years, every usec. */
196 return u < (1ULL << 55);
197}
198
0284adc6
LP
199#define JOURNAL_HEADER_CONTAINS(h, field) \
200 (le64toh((h)->header_size) >= offsetof(Header, field) + sizeof((h)->field))
201
8088cbd3
LP
202#define JOURNAL_HEADER_SEALED(h) \
203 (!!(le32toh((h)->compatible_flags) & HEADER_COMPATIBLE_SEALED))
204
d89c8fdf
ZJS
205#define JOURNAL_HEADER_COMPRESSED_XZ(h) \
206 (!!(le32toh((h)->incompatible_flags) & HEADER_INCOMPATIBLE_COMPRESSED_XZ))
207
208#define JOURNAL_HEADER_COMPRESSED_LZ4(h) \
209 (!!(le32toh((h)->incompatible_flags) & HEADER_INCOMPATIBLE_COMPRESSED_LZ4))
8088cbd3 210
78519831 211int journal_file_move_to_object(JournalFile *f, ObjectType type, uint64_t offset, Object **ret);
87d2c1ff 212
44a6b1b6
ZJS
213uint64_t journal_file_entry_n_items(Object *o) _pure_;
214uint64_t journal_file_entry_array_n_items(Object *o) _pure_;
215uint64_t journal_file_hash_table_n_items(Object *o) _pure_;
87d2c1ff 216
78519831 217int journal_file_append_object(JournalFile *f, ObjectType type, uint64_t size, Object **ret, uint64_t *offset);
c2373f84 218int journal_file_append_entry(JournalFile *f, const dual_timestamp *ts, const struct iovec iovec[], unsigned n_iovec, uint64_t *seqno, Object **ret, uint64_t *offset);
87d2c1ff 219
de190aef
LP
220int journal_file_find_data_object(JournalFile *f, const void *data, uint64_t size, Object **ret, uint64_t *offset);
221int journal_file_find_data_object_with_hash(JournalFile *f, const void *data, uint64_t size, uint64_t hash, Object **ret, uint64_t *offset);
87d2c1ff 222
3c1668da
LP
223int journal_file_find_field_object(JournalFile *f, const void *field, uint64_t size, Object **ret, uint64_t *offset);
224int journal_file_find_field_object_with_hash(JournalFile *f, const void *field, uint64_t size, uint64_t hash, Object **ret, uint64_t *offset);
225
1fc605b0 226void journal_file_reset_location(JournalFile *f);
950c07d4 227void journal_file_save_location(JournalFile *f, Object *o, uint64_t offset);
d8ae66d7 228int journal_file_compare_locations(JournalFile *af, JournalFile *bf);
f534928a 229int journal_file_next_entry(JournalFile *f, uint64_t p, direction_t direction, Object **ret, uint64_t *offset);
87d2c1ff 230
de190aef
LP
231int journal_file_next_entry_for_data(JournalFile *f, Object *o, uint64_t p, uint64_t data_offset, direction_t direction, Object **ret, uint64_t *offset);
232
233int journal_file_move_to_entry_by_seqnum(JournalFile *f, uint64_t seqnum, direction_t direction, Object **ret, uint64_t *offset);
234int journal_file_move_to_entry_by_realtime(JournalFile *f, uint64_t realtime, direction_t direction, Object **ret, uint64_t *offset);
235int journal_file_move_to_entry_by_monotonic(JournalFile *f, sd_id128_t boot_id, uint64_t monotonic, direction_t direction, Object **ret, uint64_t *offset);
236
cbdca852 237int journal_file_move_to_entry_by_offset_for_data(JournalFile *f, uint64_t data_offset, uint64_t p, direction_t direction, Object **ret, uint64_t *offset);
de190aef
LP
238int journal_file_move_to_entry_by_seqnum_for_data(JournalFile *f, uint64_t data_offset, uint64_t seqnum, direction_t direction, Object **ret, uint64_t *offset);
239int journal_file_move_to_entry_by_realtime_for_data(JournalFile *f, uint64_t data_offset, uint64_t realtime, direction_t direction, Object **ret, uint64_t *offset);
cbdca852 240int journal_file_move_to_entry_by_monotonic_for_data(JournalFile *f, uint64_t data_offset, sd_id128_t boot_id, uint64_t monotonic, direction_t direction, Object **ret, uint64_t *offset);
87d2c1ff 241
cf244689
LP
242int journal_file_copy_entry(JournalFile *from, JournalFile *to, Object *o, uint64_t p, uint64_t *seqnum, Object **ret, uint64_t *offset);
243
87d2c1ff 244void journal_file_dump(JournalFile *f);
dca6219e 245void journal_file_print_header(JournalFile *f);
87d2c1ff 246
b58c888f 247int journal_file_rotate(JournalFile **f, bool compress, bool seal, Set *deferred_closes);
0ac38b70 248
cf244689 249void journal_file_post_change(JournalFile *f);
7a24f3bf 250int journal_file_enable_post_change_timer(JournalFile *f, sd_event *e, usec_t t);
cf244689 251
8580d1f7 252void journal_reset_metrics(JournalMetrics *m);
babfc091
LP
253void journal_default_metrics(JournalMetrics *m, int fd);
254
08984293
LP
255int journal_file_get_cutoff_realtime_usec(JournalFile *f, usec_t *from, usec_t *to);
256int journal_file_get_cutoff_monotonic_usec(JournalFile *f, sd_id128_t boot, usec_t *from, usec_t *to);
257
fb0951b0 258bool journal_file_rotate_suggested(JournalFile *f, usec_t max_file_usec);
dade37d4
LP
259
260int journal_file_map_data_hash_table(JournalFile *f);
261int journal_file_map_field_hash_table(JournalFile *f);
d1afbcd2
LP
262
263static inline bool JOURNAL_FILE_COMPRESS(JournalFile *f) {
264 assert(f);
265 return f->compress_xz || f->compress_lz4;
266}