X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fjournal%2Fsd-journal.c;h=baf51db1a89ede6bed135e3957fb134778557a62;hb=09b967eaa51a39dabb7f238927f67bd682466dbc;hp=1833c75340311fc217d789192041b818ed825af3;hpb=b4e5f9201706cbd0c83645175649119e87c2c91c;p=elogind.git diff --git a/src/journal/sd-journal.c b/src/journal/sd-journal.c index 1833c7534..baf51db1a 100644 --- a/src/journal/sd-journal.c +++ b/src/journal/sd-journal.c @@ -66,7 +66,7 @@ static void init_location(Location *l, JournalFile *f, Object *o) { l->seqnum_id = f->header->seqnum_id; l->realtime = le64toh(o->entry.realtime); l->monotonic = le64toh(o->entry.monotonic); - l->boot_id = le64toh(o->entry.boot_id); + l->boot_id = o->entry.boot_id; l->xor_hash = le64toh(o->entry.xor_hash); l->seqnum_set = l->realtime_set = l->monotonic_set = l->xor_hash_set = true; @@ -488,7 +488,7 @@ static int next_with_matches(sd_journal *j, JournalFile *f, direction_t directio /* Make sure we don't match the entry we are starting * from. */ - found = cp > *offset; + found = cp != *offset; np = 0; LIST_FOREACH(matches, m, j->matches) { @@ -683,14 +683,23 @@ _public_ int sd_journal_previous(sd_journal *j) { return real_journal_next(j, DIRECTION_UP); } -_public_ int sd_journal_next_skip(sd_journal *j, uint64_t skip) { +static int real_journal_next_skip(sd_journal *j, direction_t direction, uint64_t skip) { int c = 0, r; if (!j) return -EINVAL; - while (skip > 0) { - r = sd_journal_next(j); + if (skip == 0) { + /* If this is not a discrete skip, then at least + * resolve the current location */ + if (j->current_location.type != LOCATION_DISCRETE) + return real_journal_next(j, direction); + + return 0; + } + + do { + r = real_journal_next(j, direction); if (r < 0) return r; @@ -699,30 +708,17 @@ _public_ int sd_journal_next_skip(sd_journal *j, uint64_t skip) { skip--; c++; - } + } while (skip > 0); return c; } -_public_ int sd_journal_previous_skip(sd_journal *j, uint64_t skip) { - int c = 0, r; - - if (!j) - return -EINVAL; - - while (skip > 0) { - r = sd_journal_previous(j); - if (r < 0) - return r; - - if (r == 0) - return c; - - skip--; - c++; - } +_public_ int sd_journal_next_skip(sd_journal *j, uint64_t skip) { + return real_journal_next_skip(j, DIRECTION_DOWN, skip); +} - return 1; +_public_ int sd_journal_previous_skip(sd_journal *j, uint64_t skip) { + return real_journal_next_skip(j, DIRECTION_UP, skip); } _public_ int sd_journal_get_cursor(sd_journal *j, char **cursor) { @@ -1302,7 +1298,7 @@ _public_ int sd_journal_get_monotonic_usec(sd_journal *j, uint64_t *ret, sd_id12 return r; if (!sd_id128_equal(id, o->entry.boot_id)) - return -ENOENT; + return -ESTALE; } *ret = le64toh(o->entry.monotonic); @@ -1594,27 +1590,27 @@ _public_ int sd_journal_process(sd_journal *j) { } } -_public_ int sd_journal_query_unique(sd_journal *j, const char *field) { - if (!j) - return -EINVAL; - if (!field) - return -EINVAL; - - return -ENOTSUP; -} - -_public_ int sd_journal_enumerate_unique(sd_journal *j, const void **data, size_t *l) { - if (!j) - return -EINVAL; - if (!data) - return -EINVAL; - if (!l) - return -EINVAL; - - return -ENOTSUP; -} - -_public_ void sd_journal_restart_unique(sd_journal *j) { - if (!j) - return; -} +/* _public_ int sd_journal_query_unique(sd_journal *j, const char *field) { */ +/* if (!j) */ +/* return -EINVAL; */ +/* if (!field) */ +/* return -EINVAL; */ + +/* return -ENOTSUP; */ +/* } */ + +/* _public_ int sd_journal_enumerate_unique(sd_journal *j, const void **data, size_t *l) { */ +/* if (!j) */ +/* return -EINVAL; */ +/* if (!data) */ +/* return -EINVAL; */ +/* if (!l) */ +/* return -EINVAL; */ + +/* return -ENOTSUP; */ +/* } */ + +/* _public_ void sd_journal_restart_unique(sd_journal *j) { */ +/* if (!j) */ +/* return; */ +/* } */