]>
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 | ||
24 | #include <inttypes.h> | |
25 | ||
7560fffc LP |
26 | #ifdef HAVE_GCRYPT |
27 | #include <gcrypt.h> | |
28 | #endif | |
29 | ||
81527be1 LP |
30 | #include <systemd/sd-id128.h> |
31 | ||
4fd052ae | 32 | #include "sparse-endian.h" |
87d2c1ff LP |
33 | #include "journal-def.h" |
34 | #include "util.h" | |
16e9f408 | 35 | #include "mmap-cache.h" |
de190aef | 36 | |
bc85bfee | 37 | typedef struct JournalMetrics { |
babfc091 | 38 | uint64_t max_use; |
bc85bfee LP |
39 | uint64_t max_size; |
40 | uint64_t min_size; | |
41 | uint64_t keep_free; | |
42 | } JournalMetrics; | |
43 | ||
f4b47811 LP |
44 | typedef struct JournalFile { |
45 | int fd; | |
46 | char *path; | |
47 | struct stat last_stat; | |
0ac38b70 | 48 | mode_t mode; |
7560fffc | 49 | |
0ac38b70 | 50 | int flags; |
f4b47811 LP |
51 | int prot; |
52 | bool writable; | |
7560fffc LP |
53 | bool compress; |
54 | bool authenticate; | |
55 | ||
de190aef | 56 | bool tail_entry_monotonic_valid; |
f4b47811 LP |
57 | |
58 | Header *header; | |
de190aef LP |
59 | HashItem *data_hash_table; |
60 | HashItem *field_hash_table; | |
f4b47811 | 61 | |
f4b47811 | 62 | uint64_t current_offset; |
bc85bfee LP |
63 | |
64 | JournalMetrics metrics; | |
16e9f408 | 65 | MMapCache *mmap; |
807e17f0 | 66 | |
807e17f0 LP |
67 | #ifdef HAVE_XZ |
68 | void *compress_buffer; | |
b785c858 | 69 | uint64_t compress_buffer_size; |
807e17f0 | 70 | #endif |
7560fffc LP |
71 | |
72 | #ifdef HAVE_GCRYPT | |
73 | gcry_md_hd_t hmac; | |
74 | bool hmac_running; | |
75 | ||
76 | FSPRGHeader *fsprg_header; | |
77 | size_t fsprg_size; | |
78 | #endif | |
f4b47811 LP |
79 | } JournalFile; |
80 | ||
e892bd17 LP |
81 | typedef enum direction { |
82 | DIRECTION_UP, | |
83 | DIRECTION_DOWN | |
84 | } direction_t; | |
85 | ||
4a92baf3 LP |
86 | int journal_file_open( |
87 | const char *fname, | |
88 | int flags, | |
89 | mode_t mode, | |
7560fffc LP |
90 | bool compress, |
91 | bool authenticate, | |
4a92baf3 | 92 | JournalMetrics *metrics, |
16e9f408 | 93 | MMapCache *mmap, |
4a92baf3 LP |
94 | JournalFile *template, |
95 | JournalFile **ret); | |
96 | ||
87d2c1ff LP |
97 | void journal_file_close(JournalFile *j); |
98 | ||
4a92baf3 LP |
99 | int journal_file_open_reliably( |
100 | const char *fname, | |
101 | int flags, | |
102 | mode_t mode, | |
7560fffc LP |
103 | bool compress, |
104 | bool authenticate, | |
4a92baf3 | 105 | JournalMetrics *metrics, |
16e9f408 | 106 | MMapCache *mmap, |
4a92baf3 LP |
107 | JournalFile *template, |
108 | JournalFile **ret); | |
9447a7f1 | 109 | |
de190aef | 110 | int journal_file_move_to_object(JournalFile *f, int type, uint64_t offset, Object **ret); |
87d2c1ff LP |
111 | |
112 | uint64_t journal_file_entry_n_items(Object *o); | |
113 | ||
c2373f84 | 114 | int 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 | 115 | |
de190aef LP |
116 | int journal_file_find_data_object(JournalFile *f, const void *data, uint64_t size, Object **ret, uint64_t *offset); |
117 | int journal_file_find_data_object_with_hash(JournalFile *f, const void *data, uint64_t size, uint64_t hash, Object **ret, uint64_t *offset); | |
87d2c1ff | 118 | |
de190aef LP |
119 | int journal_file_next_entry(JournalFile *f, Object *o, uint64_t p, direction_t direction, Object **ret, uint64_t *offset); |
120 | int journal_file_skip_entry(JournalFile *f, Object *o, uint64_t p, int64_t skip, Object **ret, uint64_t *offset); | |
87d2c1ff | 121 | |
de190aef LP |
122 | int 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); |
123 | ||
cbdca852 | 124 | int journal_file_move_to_entry_by_offset(JournalFile *f, uint64_t seqnum, direction_t direction, Object **ret, uint64_t *offset); |
de190aef LP |
125 | int journal_file_move_to_entry_by_seqnum(JournalFile *f, uint64_t seqnum, direction_t direction, Object **ret, uint64_t *offset); |
126 | int journal_file_move_to_entry_by_realtime(JournalFile *f, uint64_t realtime, direction_t direction, Object **ret, uint64_t *offset); | |
127 | int 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); | |
128 | ||
cbdca852 | 129 | int 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 |
130 | int 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); |
131 | int 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 | 132 | int 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 | 133 | |
cf244689 LP |
134 | int journal_file_copy_entry(JournalFile *from, JournalFile *to, Object *o, uint64_t p, uint64_t *seqnum, Object **ret, uint64_t *offset); |
135 | ||
87d2c1ff | 136 | void journal_file_dump(JournalFile *f); |
dca6219e | 137 | void journal_file_print_header(JournalFile *f); |
87d2c1ff | 138 | |
7560fffc | 139 | int journal_file_rotate(JournalFile **f, bool compress, bool authenticate); |
0ac38b70 LP |
140 | |
141 | int journal_directory_vacuum(const char *directory, uint64_t max_use, uint64_t min_free); | |
142 | ||
cf244689 LP |
143 | void journal_file_post_change(JournalFile *f); |
144 | ||
babfc091 LP |
145 | void journal_default_metrics(JournalMetrics *m, int fd); |
146 | ||
08984293 LP |
147 | int journal_file_get_cutoff_realtime_usec(JournalFile *f, usec_t *from, usec_t *to); |
148 | int journal_file_get_cutoff_monotonic_usec(JournalFile *f, sd_id128_t boot, usec_t *from, usec_t *to); | |
149 | ||
dca6219e | 150 | bool journal_file_rotate_suggested(JournalFile *f); |
b0af6f41 LP |
151 | |
152 | int journal_file_append_tag(JournalFile *f); |