journalctl: fix counting of -n parameter

This commit is contained in:
Lennart Poettering 2012-01-04 04:00:14 +01:00
parent cf5eb6a110
commit 6f003b4304
3 changed files with 37 additions and 32 deletions

View file

@ -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)

View file

@ -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_next_skip(sd_journal *j, uint64_t skip) {
return real_journal_next_skip(j, DIRECTION_DOWN, skip);
}
_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++;
}
return 1;
return real_journal_next_skip(j, DIRECTION_UP, skip);
}
_public_ int sd_journal_get_cursor(sd_journal *j, char **cursor) {

View file

@ -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",