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