sd-journal.c revision 1cdf717550971ea4e3c637dc964822062645eaed
7f3e62571a63ac90de6ac5eefeeb8d3e9aa6f49eLennart Poettering/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
7f3e62571a63ac90de6ac5eefeeb8d3e9aa6f49eLennart Poettering This file is part of systemd.
7f3e62571a63ac90de6ac5eefeeb8d3e9aa6f49eLennart Poettering Copyright 2011 Lennart Poettering
7f3e62571a63ac90de6ac5eefeeb8d3e9aa6f49eLennart Poettering systemd is free software; you can redistribute it and/or modify it
5430f7f2bc7330f3088b894166bf3524a067e3d8Lennart Poettering under the terms of the GNU Lesser General Public License as published by
5430f7f2bc7330f3088b894166bf3524a067e3d8Lennart Poettering the Free Software Foundation; either version 2.1 of the License, or
7f3e62571a63ac90de6ac5eefeeb8d3e9aa6f49eLennart Poettering (at your option) any later version.
7f3e62571a63ac90de6ac5eefeeb8d3e9aa6f49eLennart Poettering systemd is distributed in the hope that it will be useful, but
7f3e62571a63ac90de6ac5eefeeb8d3e9aa6f49eLennart Poettering WITHOUT ANY WARRANTY; without even the implied warranty of
7f3e62571a63ac90de6ac5eefeeb8d3e9aa6f49eLennart Poettering MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5430f7f2bc7330f3088b894166bf3524a067e3d8Lennart Poettering Lesser General Public License for more details.
5430f7f2bc7330f3088b894166bf3524a067e3d8Lennart Poettering You should have received a copy of the GNU Lesser General Public License
7f3e62571a63ac90de6ac5eefeeb8d3e9aa6f49eLennart Poettering along with systemd; If not, see <http://www.gnu.org/licenses/>.
7f3e62571a63ac90de6ac5eefeeb8d3e9aa6f49eLennart Poettering#define JOURNAL_FILES_RECHECK_USEC (2 * USEC_PER_SEC)
bb99a35a873c35e80b0b47fe045081022660374dLennart Poetteringstatic void remove_file_real(sd_journal *j, JournalFile *f);
7f3e62571a63ac90de6ac5eefeeb8d3e9aa6f49eLennart Poetteringstatic bool journal_pid_changed(sd_journal *j) {
7f3e62571a63ac90de6ac5eefeeb8d3e9aa6f49eLennart Poettering /* We don't support people creating a journal object and
7f3e62571a63ac90de6ac5eefeeb8d3e9aa6f49eLennart Poettering * keeping it around over a fork(). Let's complain. */
7f3e62571a63ac90de6ac5eefeeb8d3e9aa6f49eLennart Poettering/* We return an error here only if we didn't manage to
7f3e62571a63ac90de6ac5eefeeb8d3e9aa6f49eLennart Poettering memorize the real error. */
7f3e62571a63ac90de6ac5eefeeb8d3e9aa6f49eLennart Poetteringstatic int set_put_error(sd_journal *j, int r) {
7f3e62571a63ac90de6ac5eefeeb8d3e9aa6f49eLennart Poettering k = set_ensure_allocated(&j->errors, NULL);
18c7ed186be28800a2eeb37ad31c9c44480d3d9cLennart Poettering return set_put(j->errors, INT_TO_PTR(r));
18c7ed186be28800a2eeb37ad31c9c44480d3d9cLennart Poetteringstatic void detach_location(sd_journal *j) {
7f3e62571a63ac90de6ac5eefeeb8d3e9aa6f49eLennart Poetteringstatic void reset_location(sd_journal *j) {
7f3e62571a63ac90de6ac5eefeeb8d3e9aa6f49eLennart Poetteringstatic void init_location(Location *l, LocationType type, JournalFile *f, Object *o) {
b070e7f3c9ed680c821bd89d42506695f2438506Lennart Poettering assert(type == LOCATION_DISCRETE || type == LOCATION_SEEK);
b070e7f3c9ed680c821bd89d42506695f2438506Lennart Poettering l->realtime = le64toh(o->entry.realtime);
b070e7f3c9ed680c821bd89d42506695f2438506Lennart Poettering l->monotonic = le64toh(o->entry.monotonic);
b070e7f3c9ed680c821bd89d42506695f2438506Lennart Poettering l->xor_hash = le64toh(o->entry.xor_hash);
b070e7f3c9ed680c821bd89d42506695f2438506Lennart Poettering l->seqnum_set = l->realtime_set = l->monotonic_set = l->xor_hash_set = true;
b070e7f3c9ed680c821bd89d42506695f2438506Lennart Poetteringstatic void set_location(sd_journal *j, LocationType type, JournalFile *f, Object *o,
b070e7f3c9ed680c821bd89d42506695f2438506Lennart Poettering direction_t direction, uint64_t offset) {
7f3e62571a63ac90de6ac5eefeeb8d3e9aa6f49eLennart Poettering assert(type == LOCATION_DISCRETE || type == LOCATION_SEEK);
7f3e62571a63ac90de6ac5eefeeb8d3e9aa6f49eLennart Poettering init_location(&j->current_location, type, f, o);
7f3e62571a63ac90de6ac5eefeeb8d3e9aa6f49eLennart Poetteringstatic int match_is_valid(const void *data, size_t size) {
7f3e62571a63ac90de6ac5eefeeb8d3e9aa6f49eLennart Poettering const char *b, *p;
b070e7f3c9ed680c821bd89d42506695f2438506Lennart Poettering for (p = b; p < b + size; p++) {
b070e7f3c9ed680c821bd89d42506695f2438506Lennart Poettering if (*p == '=')
b070e7f3c9ed680c821bd89d42506695f2438506Lennart Poettering if (*p == '_')
b070e7f3c9ed680c821bd89d42506695f2438506Lennart Poetteringstatic bool same_field(const void *_a, size_t s, const void *_b, size_t t) {
7f3e62571a63ac90de6ac5eefeeb8d3e9aa6f49eLennart Poettering for (j = 0; j < s && j < t; j++) {
b070e7f3c9ed680c821bd89d42506695f2438506Lennart Poettering if (a[j] != b[j])
b070e7f3c9ed680c821bd89d42506695f2438506Lennart Poettering if (a[j] == '=')
7f3e62571a63ac90de6ac5eefeeb8d3e9aa6f49eLennart Poetteringstatic Match *match_new(Match *p, MatchType t) {
b070e7f3c9ed680c821bd89d42506695f2438506Lennart Poettering LIST_REMOVE(matches, m->parent->matches, m);
b070e7f3c9ed680c821bd89d42506695f2438506Lennart Poetteringstatic void match_free_if_empty(Match *m) {
7f3e62571a63ac90de6ac5eefeeb8d3e9aa6f49eLennart Poettering_public_ int sd_journal_add_match(sd_journal *j, const void *data, size_t size) {
a5344d2c3b0f14e954ce1c0ef905c5b44bc5bf0aLennart Poettering assert_return(!journal_pid_changed(j), -ECHILD);
7f3e62571a63ac90de6ac5eefeeb8d3e9aa6f49eLennart Poettering assert_return(match_is_valid(data, size), -EINVAL);
7f3e62571a63ac90de6ac5eefeeb8d3e9aa6f49eLennart Poettering /* level 0: AND term
b070e7f3c9ed680c821bd89d42506695f2438506Lennart Poettering * level 1: OR terms
b070e7f3c9ed680c821bd89d42506695f2438506Lennart Poettering * level 2: AND terms
b070e7f3c9ed680c821bd89d42506695f2438506Lennart Poettering * level 3: OR terms
b070e7f3c9ed680c821bd89d42506695f2438506Lennart Poettering * level 4: concrete matches */
7f3e62571a63ac90de6ac5eefeeb8d3e9aa6f49eLennart Poettering j->level0 = match_new(NULL, MATCH_AND_TERM);
7f3e62571a63ac90de6ac5eefeeb8d3e9aa6f49eLennart Poettering j->level1 = match_new(j->level0, MATCH_OR_TERM);
7f3e62571a63ac90de6ac5eefeeb8d3e9aa6f49eLennart Poettering j->level2 = match_new(j->level1, MATCH_AND_TERM);
7f3e62571a63ac90de6ac5eefeeb8d3e9aa6f49eLennart Poettering assert(j->level0->type == MATCH_AND_TERM);
7f3e62571a63ac90de6ac5eefeeb8d3e9aa6f49eLennart Poettering assert(j->level1->type == MATCH_OR_TERM);
7f3e62571a63ac90de6ac5eefeeb8d3e9aa6f49eLennart Poettering assert(j->level2->type == MATCH_AND_TERM);
7f3e62571a63ac90de6ac5eefeeb8d3e9aa6f49eLennart Poettering LIST_FOREACH(matches, l3, j->level2->matches) {
b070e7f3c9ed680c821bd89d42506695f2438506Lennart Poettering /* Exactly the same match already? Then ignore
b070e7f3c9ed680c821bd89d42506695f2438506Lennart Poettering * this addition */
7f3e62571a63ac90de6ac5eefeeb8d3e9aa6f49eLennart Poettering /* Same field? Then let's add this to this OR term */
7f3e62571a63ac90de6ac5eefeeb8d3e9aa6f49eLennart Poettering if (same_field(data, size, l4->data, l4->size)) {
0dad12c190b7493955cd60d2a1625199b1709f69Lennart Poettering add_here = match_new(j->level2, MATCH_OR_TERM);
0dad12c190b7493955cd60d2a1625199b1709f69Lennart Poettering_public_ int sd_journal_add_conjunction(sd_journal *j) {
0dad12c190b7493955cd60d2a1625199b1709f69Lennart Poettering assert_return(!journal_pid_changed(j), -ECHILD);
b070e7f3c9ed680c821bd89d42506695f2438506Lennart Poettering_public_ int sd_journal_add_disjunction(sd_journal *j) {
b070e7f3c9ed680c821bd89d42506695f2438506Lennart Poettering assert_return(!journal_pid_changed(j), -ECHILD);
18c7ed186be28800a2eeb37ad31c9c44480d3d9cLennart Poetteringstatic char *match_make_string(Match *m) {
18c7ed186be28800a2eeb37ad31c9c44480d3d9cLennart Poettering k = strjoin(p, m->type == MATCH_OR_TERM ? " OR " : " AND ", t, NULL);
18c7ed186be28800a2eeb37ad31c9c44480d3d9cLennart Poetteringchar *journal_make_match_string(sd_journal *j) {
fe6521272ba203ec8f0d5a94f0729960b3f90525Lennart Poettering_public_ void sd_journal_flush_matches(sd_journal *j) {
fe6521272ba203ec8f0d5a94f0729960b3f90525Lennart Poettering j->level0 = j->level1 = j->level2 = NULL;
fe6521272ba203ec8f0d5a94f0729960b3f90525Lennart Poetteringstatic int compare_entry_order(JournalFile *af, Object *_ao,
86b9b8e70d54e79db3ff4f67bbd5280ecfc82537Lennart Poettering /* The mmap cache might invalidate the object from the first
86b9b8e70d54e79db3ff4f67bbd5280ecfc82537Lennart Poettering * file if we look at the one from the second file. Hence
86b9b8e70d54e79db3ff4f67bbd5280ecfc82537Lennart Poettering * temporarily copy the header of the first one, and look at
86b9b8e70d54e79db3ff4f67bbd5280ecfc82537Lennart Poettering * that only. */
86b9b8e70d54e79db3ff4f67bbd5280ecfc82537Lennart Poettering ao = alloca(offsetof(EntryObject, items));
bb99a35a873c35e80b0b47fe045081022660374dLennart Poettering memcpy(ao, _ao, offsetof(EntryObject, items));
4cd9a9d9ecf3a8835e21930f3215a5f5b74144beLennart Poettering r = journal_file_move_to_object(bf, OBJECT_ENTRY, bp, &bo);
8b38f3cc3eb73adf9536cb73d0f319e60d42ea0cLennart Poettering /* We operate on two different files here, hence we can access
fe6521272ba203ec8f0d5a94f0729960b3f90525Lennart Poettering * two objects at the same time, which we normally can't.
fe6521272ba203ec8f0d5a94f0729960b3f90525Lennart Poettering * If contents and timestamps match, these entries are
8b38f3cc3eb73adf9536cb73d0f319e60d42ea0cLennart Poettering * identical, even if the seqnum does not match */
fe6521272ba203ec8f0d5a94f0729960b3f90525Lennart Poettering if (sd_id128_equal(ao->entry.boot_id, bo->entry.boot_id) &&
4cd9a9d9ecf3a8835e21930f3215a5f5b74144beLennart Poettering ao->entry.monotonic == bo->entry.monotonic &&
fe6521272ba203ec8f0d5a94f0729960b3f90525Lennart Poettering ao->entry.realtime == bo->entry.realtime &&
fe6521272ba203ec8f0d5a94f0729960b3f90525Lennart Poettering ao->entry.xor_hash == bo->entry.xor_hash)
224f2ee221e77c326d1d7761abb6e812432b2163Lennart Poettering if (sd_id128_equal(af->header->seqnum_id, bf->header->seqnum_id)) {
224f2ee221e77c326d1d7761abb6e812432b2163Lennart Poettering /* If this is from the same seqnum source, compare
fe6521272ba203ec8f0d5a94f0729960b3f90525Lennart Poettering /* Wow! This is weird, different data but the same
fe6521272ba203ec8f0d5a94f0729960b3f90525Lennart Poettering * seqnums? Something is borked, but let's make the
fe6521272ba203ec8f0d5a94f0729960b3f90525Lennart Poettering * best of it and compare by time. */
b070e7f3c9ed680c821bd89d42506695f2438506Lennart Poettering if (sd_id128_equal(ao->entry.boot_id, bo->entry.boot_id)) {
b070e7f3c9ed680c821bd89d42506695f2438506Lennart Poettering /* If the boot id matches, compare monotonic time */
b070e7f3c9ed680c821bd89d42506695f2438506Lennart Poettering /* Otherwise, compare UTC time */
b070e7f3c9ed680c821bd89d42506695f2438506Lennart Poettering /* Finally, compare by contents */
b070e7f3c9ed680c821bd89d42506695f2438506Lennart Poettering_pure_ static int compare_with_location(JournalFile *af, Object *ao, Location *l) {
b070e7f3c9ed680c821bd89d42506695f2438506Lennart Poettering assert(l->type == LOCATION_DISCRETE || l->type == LOCATION_SEEK);
b070e7f3c9ed680c821bd89d42506695f2438506Lennart Poettering sd_id128_equal(ao->entry.boot_id, l->boot_id) &&
b070e7f3c9ed680c821bd89d42506695f2438506Lennart Poettering le64toh(ao->entry.realtime) == l->realtime &&
b070e7f3c9ed680c821bd89d42506695f2438506Lennart Poettering le64toh(ao->entry.xor_hash) == l->xor_hash)
b070e7f3c9ed680c821bd89d42506695f2438506Lennart Poettering sd_id128_equal(af->header->seqnum_id, l->seqnum_id)) {
b070e7f3c9ed680c821bd89d42506695f2438506Lennart Poettering sd_id128_equal(ao->entry.boot_id, l->boot_id)) {
b070e7f3c9ed680c821bd89d42506695f2438506Lennart Poettering r = journal_file_find_data_object_with_hash(f, m->data, m->size, le64toh(m->le_hash), NULL, &dp);
18c7ed186be28800a2eeb37ad31c9c44480d3d9cLennart Poettering return journal_file_move_to_entry_by_offset_for_data(f, dp, after_offset, direction, ret, offset);
18c7ed186be28800a2eeb37ad31c9c44480d3d9cLennart Poettering /* Find the earliest match beyond after_offset */
18c7ed186be28800a2eeb37ad31c9c44480d3d9cLennart Poettering r = next_for_match(j, i, f, after_offset, direction, NULL, &cp);
18c7ed186be28800a2eeb37ad31c9c44480d3d9cLennart Poettering else if (r > 0) {
18c7ed186be28800a2eeb37ad31c9c44480d3d9cLennart Poettering if (np == 0 || (direction == DIRECTION_DOWN ? cp < np : cp > np))
if (np == 0)
if (!m->matches)
last_moved = i;
if (ret)
*ret = n;
if (offset)
static int find_location_for_match(
sd_journal *j,
Match *m,
JournalFile *f,
assert(j);
assert(m);
assert(f);
if (j->current_location.seqnum_set && sd_id128_equal(j->current_location.seqnum_id, f->header->seqnum_id))
return journal_file_move_to_entry_by_seqnum_for_data(f, dp, j->current_location.seqnum, direction, ret, offset);
r = journal_file_move_to_entry_by_monotonic_for_data(f, dp, j->current_location.boot_id, j->current_location.monotonic, direction, ret, offset);
if (r != -ENOENT)
return journal_file_move_to_entry_by_realtime_for_data(f, dp, j->current_location.realtime, direction, ret, offset);
Object *n;
Match *i;
if (np == 0)
if (ret)
*ret = n;
if (offset)
Match *i;
if (!m->matches)
static int find_location_with_matches(
sd_journal *j,
JournalFile *f,
assert(j);
assert(f);
if (!j->level0) {
if (j->current_location.seqnum_set && sd_id128_equal(j->current_location.seqnum_id, f->header->seqnum_id))
r = journal_file_move_to_entry_by_monotonic(f, j->current_location.boot_id, j->current_location.monotonic, direction, ret, offset);
if (r != -ENOENT)
return journal_file_move_to_entry_by_realtime(f, j->current_location.realtime, direction, ret, offset);
static int next_with_matches(
sd_journal *j,
JournalFile *f,
Object *c;
assert(j);
assert(f);
c = *ret;
if (!j->level0)
return next_for_match(j, j->level0, f, direction == DIRECTION_DOWN ? cp+1 : cp-1, direction, ret, offset);
static int next_beyond_location(sd_journal *j, JournalFile *f, direction_t direction, Object **ret, uint64_t *offset) {
Object *c;
assert(j);
assert(f);
bool found;
found = true;
if (found) {
if (ret)
*ret = c;
if (offset)
uint64_t p = 0;
Iterator i;
Object *o;
bool found;
remove_file_real(j, f);
if (!new_file)
found = true;
if (found) {
new_file = f;
new_offset = p;
if (!new_file)
if (skip == 0) {
skip--;
} while (skip > 0);
Object *o;
return -EADDRNOTAVAIL;
r = journal_file_move_to_object(j->current_file, OBJECT_ENTRY, j->current_file->current_offset, &o);
return -ENOMEM;
size_t l;
seqnum_id_set = false,
seqnum_set = false,
boot_id_set = false,
monotonic_set = false,
realtime_set = false,
xor_hash_set = false;
char *item;
return -EINVAL;
if (!item)
return -ENOMEM;
switch (word[0]) {
seqnum_id_set = true;
seqnum_set = true;
k = -EINVAL;
boot_id_set = true;
monotonic_set = true;
k = -EINVAL;
realtime_set = true;
k = -EINVAL;
xor_hash_set = true;
k = -EINVAL;
return -EINVAL;
reset_location(j);
if (realtime_set) {
if (xor_hash_set) {
size_t l;
Object *o;
return -EADDRNOTAVAIL;
r = journal_file_move_to_object(j->current_file, OBJECT_ENTRY, j->current_file->current_offset, &o);
unsigned long long ll;
return -EINVAL;
if (!item)
return -ENOMEM;
switch (word[0]) {
return -EINVAL;
return -EINVAL;
return -EINVAL;
return -EINVAL;
reset_location(j);
reset_location(j);
reset_location(j);
reset_location(j);
assert(j);
if (j->on_network)
j->on_network =
< (int) sizeof(prefix));
assert(j);
j->current_invalidate_counter ++;
assert(j);
if (j->no_new_files ||
if (!path)
return -ENOMEM;
if (r == -ENOENT)
JournalFile *f;
assert(j);
if (!path)
return -ENOMEM;
remove_file_real(j, f);
assert(j);
assert(f);
if (j->current_file == f) {
j->current_field = 0;
if (j->unique_file == f) {
j->unique_offset = 0;
if (!j->unique_file)
j->unique_file_lost = true;
j->current_invalidate_counter ++;
Directory *m;
assert(j);
if (!path)
return -ENOMEM;
return -errno;
return -ENOMEM;
m->is_root = false;
free(m);
return -ENOMEM;
j->current_invalidate_counter ++;
} else if (m->is_root)
errno = 0;
r = -errno;
if (!de)
r = set_put_error(j, r);
Directory *m;
assert(j);
assert(p);
return -EINVAL;
if (j->prefix)
d = opendir(p);
return -errno;
return -ENOMEM;
m->is_root = true;
if (!m->path) {
free(m);
return -ENOMEM;
free(m);
return -ENOMEM;
j->current_invalidate_counter ++;
} else if (!m->is_root)
if (j->no_new_files)
errno = 0;
r = -errno;
if (!de)
r = set_put_error(j, r);
assert(j);
if (d->wd > 0) {
if (j->inotify_fd >= 0)
if (d->is_root)
free(d);
const char search_paths[] =
assert(j);
r = add_root_directory(j, p);
if (r < 0 && r != -ENOENT) {
r = set_put_error(j, r);
Iterator i;
JournalFile *f;
assert(j);
if (!dir)
return -ENOMEM;
set_put_error(j, r);
assert(j);
if (j->inotify_fd < 0) {
if (j->inotify_fd < 0)
return -errno;
if (!j->directories_by_wd) {
if (!j->directories_by_wd)
return -ENOMEM;
sd_journal *j;
return NULL;
if (path) {
if (!j->path)
goto fail;
goto fail;
fail:
sd_journal_close(j);
return NULL;
sd_journal *j;
assert_return((flags & ~(SD_JOURNAL_LOCAL_ONLY|SD_JOURNAL_RUNTIME_ONLY|SD_JOURNAL_SYSTEM|SD_JOURNAL_CURRENT_USER)) == 0, -EINVAL);
return -ENOMEM;
r = add_search_paths(j);
goto fail;
*ret = j;
fail:
sd_journal_close(j);
sd_journal *j;
if (r == -ENOENT)
return -EHOSTDOWN;
if (!root)
return -ENODATA;
return -EIO;
return -ENOMEM;
r = add_search_paths(j);
goto fail;
*ret = j;
fail:
sd_journal_close(j);
sd_journal *j;
return -ENOMEM;
set_put_error(j, r);
goto fail;
*ret = j;
fail:
sd_journal_close(j);
sd_journal *j;
const char **path;
return -ENOMEM;
goto fail;
j->no_new_files = true;
*ret = j;
fail:
sd_journal_close(j);
Directory *d;
JournalFile *f;
remove_directory(j, d);
remove_directory(j, d);
if (j->mmap) {
log_debug("mmap cache statistics: %u hit, %u miss", mmap_cache_get_hit(j->mmap), mmap_cache_get_missed(j->mmap));
free(j);
Object *o;
JournalFile *f;
f = j->current_file;
return -EADDRNOTAVAIL;
if (f->current_offset <= 0)
return -EADDRNOTAVAIL;
Object *o;
JournalFile *f;
f = j->current_file;
return -EADDRNOTAVAIL;
if (f->current_offset <= 0)
return -EADDRNOTAVAIL;
if (ret_boot_id)
return -ESTALE;
if (ret)
for (p = field; *p; p++) {
_public_ int sd_journal_get_data(sd_journal *j, const char *field, const void **data, size_t *size) {
JournalFile *f;
uint64_t i, n;
Object *o;
f = j->current_file;
return -EADDRNOTAVAIL;
if (f->current_offset <= 0)
return -EADDRNOTAVAIL;
n = journal_file_entry_n_items(o);
uint64_t p, l;
size_t t;
int compression;
return -EBADMSG;
if (compression) {
j->data_threshold);
return -EPROTONOSUPPORT;
t = (size_t) l;
if ((uint64_t) t != l)
return -E2BIG;
*size = t;
return -ENOENT;
size_t t;
uint64_t l;
int compression;
t = (size_t) l;
if ((uint64_t) t != l)
return -E2BIG;
if (compression) {
return -EPROTONOSUPPORT;
*size = t;
JournalFile *f;
uint64_t p, n;
Object *o;
f = j->current_file;
return -EADDRNOTAVAIL;
if (f->current_offset <= 0)
return -EADDRNOTAVAIL;
n = journal_file_entry_n_items(o);
if (j->current_field >= n)
return -EBADMSG;
j->current_field ++;
j->current_field = 0;
if (j->inotify_fd >= 0)
return j->inotify_fd;
r = allocate_inotify(j);
if (j->no_new_files)
r = add_current_paths(j);
else if (j->path)
r = add_search_paths(j);
return j->inotify_fd;
int fd;
if (fd < 0)
return fd;
return POLLIN;
int fd;
if (fd < 0)
return fd;
if (!j->on_network) {
Directory *d;
assert(j);
assert(e);
set_put_error(j, r);
r = remove_directory(j, d);
} else if (d->is_root && (e->mask & IN_ISDIR) && e->len > 0 && sd_id128_from_string(e->name, &id) >= 0) {
assert(j);
bool got_something = false;
struct inotify_event *e;
ssize_t l;
return -errno;
got_something = true;
process_inotify_event(j, e);
l -= step;
uint64_t t;
if (j->inotify_fd < 0) {
r = sd_journal_get_fd(j);
return determine_change(j);
r = sd_journal_get_timeout(j, &t);
usec_t n;
timeout_usec = t;
} while (r == -EINTR);
return sd_journal_process(j);
Iterator i;
JournalFile *f;
bool first = true;
if (r == -ENOENT)
if (first) {
tmax = t;
first = false;
if (from)
if (to)
_public_ int sd_journal_get_cutoff_monotonic_usec(sd_journal *j, sd_id128_t boot_id, uint64_t *from, uint64_t *to) {
Iterator i;
JournalFile *f;
bool found = false;
if (r == -ENOENT)
if (found) {
if (from)
if (to)
if (from)
if (to)
*to = t;
found = true;
return found;
Iterator i;
JournalFile *f;
bool newline = false;
assert(j);
if (newline)
newline = true;
Iterator i;
JournalFile *f;
return -errno;
return -ENOMEM;
j->unique_field = f;
j->unique_offset = 0;
j->unique_file_lost = false;
size_t k;
if (!j->unique_file) {
if (j->unique_file_lost)
if (!j->unique_file)
j->unique_offset = 0;
Iterator i;
Object *o;
const void *odata;
bool found;
void *release_cookie;
if (j->unique_offset == 0) {
if (j->unique_offset == 0) {
if (!j->unique_file)
return -EBADMSG;
if (ol <= k) {
return -EBADMSG;
j->unique_field);
return -EBADMSG;
found = false;
found = true;
if (found)
j->unique_offset = 0;
j->unique_file_lost = false;
return !j->on_network;
const void *data;
assert(j);
const void *data;
if (!cid)
return -ENOMEM;
return -ENOMEM;
*ret = t;