From: Mike Yuan Date: Sat, 4 Mar 2023 11:06:00 +0000 (+0800) Subject: journalctl: fix output when --until is used with --lines X-Git-Tag: v254-rc1~1105^2~1 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=81fb5375b3b3bfc22d023d7908ad9eee4b3c1ffb;p=thirdparty%2Fsystemd.git journalctl: fix output when --until is used with --lines 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. --- diff --git a/src/journal/journalctl.c b/src/journal/journalctl.c index f148ea91442..76af3e35a0d 100644 --- a/src/journal/journalctl.c +++ b/src/journal/journalctl.c @@ -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);