r = journal_file_move_to_entry_by_monotonic(f, j->current_location.boot_id, j->current_location.monotonic, direction, &o, &p);
if (r <= 0)
- return r;
+ return r == -ENOENT ? 0 : r;
}
LIST_FOREACH(matches, m, j->matches) {
else
r = journal_file_next_entry_for_data(f, NULL, 0, dp, direction, &c, &cp);
+ if (r < 0)
+ return r;
+
if (!term_match) {
term_match = m;
/* 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) {
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;
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) {
return r;
if (!sd_id128_equal(id, o->entry.boot_id))
- return -ENOENT;
+ return -ESTALE;
}
*ret = le64toh(o->entry.monotonic);