From: Lennart Poettering Date: Wed, 4 Jan 2012 03:00:14 +0000 (+0100) Subject: journalctl: fix counting of -n parameter X-Git-Tag: v38~78 X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6f003b43043da7b57c0ebe15b86856c8248fea4a;p=systemd journalctl: fix counting of -n parameter --- diff --git a/src/journal/journalctl.c b/src/journal/journalctl.c index fc1fed27..0e1fb66d 100644 --- a/src/journal/journalctl.c +++ b/src/journal/journalctl.c @@ -148,6 +148,7 @@ int main(int argc, char *argv[]) { int r, i, fd; sd_journal *j = NULL; unsigned line = 0; + bool need_seek = false; log_parse_environment(); log_open(); @@ -184,16 +185,19 @@ int main(int argc, char *argv[]) { } r = sd_journal_previous_skip(j, arg_lines); - if (r < 0) { - log_error("Failed to iterate through journal: %s", strerror(-r)); - goto finish; - } } else { r = sd_journal_seek_head(j); if (r < 0) { log_error("Failed to seek to head: %s", strerror(-r)); goto finish; } + + r = sd_journal_next(j); + } + + if (r < 0) { + log_error("Failed to iterate through journal: %s", strerror(-r)); + goto finish; } if (!arg_no_pager && !arg_follow) { @@ -210,11 +214,12 @@ int main(int argc, char *argv[]) { struct pollfd pollfd; for (;;) { - r = sd_journal_next(j); - - if (r < 0) { - log_error("Failed to iterate through journal: %s", strerror(-r)); - goto finish; + if (need_seek) { + r = sd_journal_next(j); + if (r < 0) { + log_error("Failed to iterate through journal: %s", strerror(-r)); + goto finish; + } } if (r == 0) @@ -225,6 +230,8 @@ int main(int argc, char *argv[]) { r = output_journal(j, arg_output, line, arg_show_all); if (r < 0) goto finish; + + need_seek = true; } if (!arg_follow) diff --git a/src/journal/sd-journal.c b/src/journal/sd-journal.c index 78a91a3e..05c0d96c 100644 --- a/src/journal/sd-journal.c +++ b/src/journal/sd-journal.c @@ -683,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; @@ -699,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) { diff --git a/src/systemctl.c b/src/systemctl.c index 10e39917..6f87b06d 100644 --- a/src/systemctl.c +++ b/src/systemctl.c @@ -2262,8 +2262,10 @@ static void print_status_info(UnitStatusInfo *i) { } } - if (i->id && arg_transport != TRANSPORT_SSH) + if (i->id && arg_transport != TRANSPORT_SSH) { + printf("\n"); show_journal_by_service(i->id, OUTPUT_SHORT, NULL, 0, 0, 0, arg_all); + } if (i->need_daemon_reload) printf("\n%sWarning:%s Unit file changed on disk, 'systemctl %s daemon-reload' recommended.\n",