journal-file.h revision d89c8fdf48c7bad5816b9f2e77e8361721f22517
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen This file is part of systemd.
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen Copyright 2011 Lennart Poettering
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen systemd is free software; you can redistribute it and/or modify it
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen under the terms of the GNU Lesser General Public License as published by
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen the Free Software Foundation; either version 2.1 of the License, or
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen (at your option) any later version.
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen systemd is distributed in the hope that it will be useful, but
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen WITHOUT ANY WARRANTY; without even the implied warranty of
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen Lesser General Public License for more details.
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen You should have received a copy of the GNU Lesser General Public License
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen along with systemd; If not, see <http://www.gnu.org/licenses/>.
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersentypedef struct JournalMetrics {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen bool tail_entry_monotonic_valid:1;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen uint64_t compress_buffer_size;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersenint journal_file_set_offline(JournalFile *f);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersenvoid journal_file_close(JournalFile *j);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersenint journal_file_open_reliably(
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen#define ALIGN64(x) (((x) + 7ULL) & ~7ULL)
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen#define VALID64(x) (((x) & 7ULL) == 0ULL)
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen/* Use six characters to cover the offsets common in smallish journal
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen * files without adding too many zeros. */
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersenstatic inline bool VALID_REALTIME(uint64_t u) {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen /* This considers timestamps until the year 3112 valid. That should be plenty room... */
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen return u > 0 && u < (1ULL << 55);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersenstatic inline bool VALID_MONOTONIC(uint64_t u) {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen /* This considers timestamps until 1142 years of runtime valid. */
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersenstatic inline bool VALID_EPOCH(uint64_t u) {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen /* This allows changing the key for 1142 years, every usec. */
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen#define JOURNAL_HEADER_CONTAINS(h, field) \
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen (le64toh((h)->header_size) >= offsetof(Header, field) + sizeof((h)->field))
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen#define JOURNAL_HEADER_SEALED(h) \
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen (!!(le32toh((h)->compatible_flags) & HEADER_COMPATIBLE_SEALED))
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen#define JOURNAL_HEADER_COMPRESSED_XZ(h) \
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen (!!(le32toh((h)->incompatible_flags) & HEADER_INCOMPATIBLE_COMPRESSED_XZ))
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen#define JOURNAL_HEADER_COMPRESSED_LZ4(h) \
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen (!!(le32toh((h)->incompatible_flags) & HEADER_INCOMPATIBLE_COMPRESSED_LZ4))
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersenint journal_file_move_to_object(JournalFile *f, int type, uint64_t offset, Object **ret);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersenuint64_t journal_file_entry_n_items(Object *o) _pure_;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersenuint64_t journal_file_entry_array_n_items(Object *o) _pure_;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersenuint64_t journal_file_hash_table_n_items(Object *o) _pure_;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersenint journal_file_append_object(JournalFile *f, int type, uint64_t size, Object **ret, uint64_t *offset);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersenint 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);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersenint journal_file_find_data_object(JournalFile *f, const void *data, uint64_t size, Object **ret, uint64_t *offset);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersenint journal_file_find_data_object_with_hash(JournalFile *f, const void *data, uint64_t size, uint64_t hash, Object **ret, uint64_t *offset);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersenint journal_file_find_field_object(JournalFile *f, const void *field, uint64_t size, Object **ret, uint64_t *offset);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersenint journal_file_find_field_object_with_hash(JournalFile *f, const void *field, uint64_t size, uint64_t hash, Object **ret, uint64_t *offset);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersenint journal_file_next_entry(JournalFile *f, Object *o, uint64_t p, direction_t direction, Object **ret, uint64_t *offset);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersenint journal_file_skip_entry(JournalFile *f, Object *o, uint64_t p, int64_t skip, Object **ret, uint64_t *offset);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersenint 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);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersenint journal_file_move_to_entry_by_offset(JournalFile *f, uint64_t seqnum, direction_t direction, Object **ret, uint64_t *offset);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersenint journal_file_move_to_entry_by_seqnum(JournalFile *f, uint64_t seqnum, direction_t direction, Object **ret, uint64_t *offset);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersenint journal_file_move_to_entry_by_realtime(JournalFile *f, uint64_t realtime, direction_t direction, Object **ret, uint64_t *offset);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersenint 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);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersenint 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);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersenint 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);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersenint 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);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersenint 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);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersenint journal_file_copy_entry(JournalFile *from, JournalFile *to, Object *o, uint64_t p, uint64_t *seqnum, Object **ret, uint64_t *offset);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersenvoid journal_file_dump(JournalFile *f);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersenvoid journal_file_print_header(JournalFile *f);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersenint journal_file_rotate(JournalFile **f, bool compress, bool seal);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersenvoid journal_file_post_change(JournalFile *f);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersenvoid journal_default_metrics(JournalMetrics *m, int fd);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersenint journal_file_get_cutoff_realtime_usec(JournalFile *f, usec_t *from, usec_t *to);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersenint journal_file_get_cutoff_monotonic_usec(JournalFile *f, sd_id128_t boot, usec_t *from, usec_t *to);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersenbool journal_file_rotate_suggested(JournalFile *f, usec_t max_file_usec);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersenstatic unsigned type_to_context(int type) {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen /* One context for each type, plus one catch-all for the rest */
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen return type > 0 && type < _OBJECT_TYPE_MAX ? type : 0;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersenstatic inline int journal_file_object_keep(JournalFile *f, Object *o, uint64_t offset) {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen unsigned context = type_to_context(o->object.type);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen return mmap_cache_get(f->mmap, f->fd, f->prot, context, true,
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen offset, o->object.size, &f->last_stat, NULL);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersenstatic inline int journal_file_object_release(JournalFile *f, Object *o, uint64_t offset) {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen unsigned context = type_to_context(o->object.type);