/* No matches is simple */
if (j->current_location.type == LOCATION_HEAD)
- return journal_file_next_entry(f, NULL, 0, DIRECTION_DOWN, ret, offset);
+ return journal_file_next_entry(f, 0, DIRECTION_DOWN, ret, offset);
if (j->current_location.type == LOCATION_TAIL)
- return journal_file_next_entry(f, NULL, 0, DIRECTION_UP, ret, offset);
+ return journal_file_next_entry(f, 0, DIRECTION_UP, ret, offset);
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(f, j->current_location.seqnum, direction, ret, offset);
if (j->current_location.monotonic_set) {
if (j->current_location.realtime_set)
return journal_file_move_to_entry_by_realtime(f, j->current_location.realtime, direction, ret, offset);
- return journal_file_next_entry(f, NULL, 0, direction, ret, offset);
+ return journal_file_next_entry(f, 0, direction, ret, offset);
} else
return find_location_for_match(j, j->level0, f, direction, ret, offset);
}
Object **ret,
uint64_t *offset) {
- Object *c;
uint64_t cp;
assert(j);
assert(ret);
assert(offset);
- c = *ret;
cp = *offset;
/* No matches is easy. We simple advance the file
* pointer by one. */
if (!j->level0)
- return journal_file_next_entry(f, c, cp, direction, ret, offset);
+ return journal_file_next_entry(f, cp, direction, ret, offset);
/* If we have a match then we look for the next matching entry
* with an offset at least one step larger */
static int next_beyond_location(sd_journal *j, JournalFile *f, direction_t direction) {
Object *c;
- uint64_t cp;
+ uint64_t cp, n_entries;
int r;
assert(j);
assert(f);
+ /* If we hit EOF before, recheck if any new entries arrived. */
+ n_entries = le64toh(f->header->n_entries);
+ if (f->location_type == LOCATION_TAIL && n_entries == f->last_n_entries)
+ return 0;
+ f->last_n_entries = n_entries;
+
if (f->last_direction == direction && f->current_offset > 0) {
+ /* LOCATION_SEEK here means we did the work in a previous
+ * iteration and the current location already points to a
+ * candidate entry. */
+ if (f->location_type == LOCATION_SEEK)
+ return 1;
+
cp = f->current_offset;
r = journal_file_move_to_object(f, OBJECT_ENTRY, cp, &c);