chiark / gitweb /
journalctl: fix counting of -n parameter
[elogind.git] / src / journal / sd-journal.c
index fde1a0be881bd9694fd2842cf33a9f402b48b5c6..05c0d96ce180165f225a872398090e2366e09660 100644 (file)
@@ -372,6 +372,9 @@ static int find_location(sd_journal *j, JournalFile *f, direction_t direction, O
                         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;
 
@@ -485,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) {
@@ -680,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;
 
@@ -696,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) {