]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
journalctl: fix output when --until is used with --lines
authorMike Yuan <me@yhndnzj.com>
Sat, 4 Mar 2023 11:06:00 +0000 (19:06 +0800)
committerMike Yuan <me@yhndnzj.com>
Sun, 5 Mar 2023 03:53:03 +0000 (11:53 +0800)
Before this commit, when --lines is specified, we jump to the tail and
search afterwards from there, thus breaking --until if used together.

After this commit:
If both --until and any of --reverse and --lines is specified, things get
a little tricky. We seek to the place of --until first. If only --reverse or
--reverse and --lines is specified, we search backwards and let the output
counter handle --lines for us. If only --lines is used, we just jump backwards
arg_lines and search afterwards from there.

src/journal/journalctl.c

index f148ea91442b8e49ad4c0ddb2f87cf04077eb7d2..76af3e35a0d4219a32f598c962c4a5937f0a776c 100644 (file)
@@ -2482,12 +2482,21 @@ static int run(int argc, char *argv[]) {
 
                 r = sd_journal_next(j);
 
-        } else if (arg_until_set && arg_reverse) {
+        } else if (arg_until_set && (arg_reverse || arg_lines >= 0)) {
+                /* If both --until and any of --reverse and --lines is specified, things get
+                 * a little tricky. We seek to the place of --until first. If only --reverse or
+                 * --reverse and --lines is specified, we search backwards and let the output
+                 * counter handle --lines for us. If only --lines is used, we just jump backwards
+                 * arg_lines and search afterwards from there. */
+
                 r = sd_journal_seek_realtime_usec(j, arg_until);
                 if (r < 0)
                         return log_error_errno(r, "Failed to seek to date: %m");
 
-                r = sd_journal_previous(j);
+                if (arg_reverse)
+                        r = sd_journal_previous(j);
+                else /* arg_lines >= 0 */
+                        r = sd_journal_previous_skip(j, arg_lines);
 
         } else if (arg_reverse) {
                 r = sd_journal_seek_tail(j);
@@ -2552,7 +2561,7 @@ static int run(int argc, char *argv[]) {
                                         break;
                         }
 
-                        if (arg_until_set && !arg_reverse) {
+                        if (arg_until_set && !arg_reverse && arg_lines < 0) {
                                 usec_t usec;
 
                                 r = sd_journal_get_realtime_usec(j, &usec);