-int sd_journal_previous(sd_journal *j) {
- JournalFile *f, *new_current = NULL;
- Iterator i;
- int r;
- uint64_t new_offset = 0;
- Object *new_entry = NULL;
-
- assert(j);
-
- HASHMAP_FOREACH(f, j->files, i) {
- Object *o;
- uint64_t p;
-
- if (f->current_offset > 0) {
- r = journal_file_move_to_object(f, f->current_offset, OBJECT_ENTRY, &o);
- if (r < 0)
- return r;
- } else
- o = NULL;
-
- r = journal_file_prev_entry(f, o, &o, &p);
- if (r < 0)
- return r;
- else if (r == 0)
- continue;
-
- if (!new_current || compare_order(new_current, new_entry, new_offset, f, o, p) > 0) {
- new_current = f;
- new_entry = o;
- new_offset = p;
- }
- }
-
- if (new_current) {
- j->current_file = new_current;
- j->current_file->current_offset = new_offset;
- j->current_field = 0;
-
- /* Skip over any identical entries in the other files too */
-
- HASHMAP_FOREACH(f, j->files, i) {
- Object *o;
- uint64_t p;
-
- if (j->current_file == f)
- continue;
-
- if (f->current_offset > 0) {
- r = journal_file_move_to_object(f, f->current_offset, OBJECT_ENTRY, &o);
- if (r < 0)
- return r;
- } else
- o = NULL;
-
- r = journal_file_prev_entry(f, o, &o, &p);
- if (r < 0)
- return r;
- else if (r == 0)
- continue;
-
- if (compare_order(new_current, new_entry, new_offset, f, o, p) == 0)
- f->current_offset = p;
- }
-
- return 1;
- }