From 1b12a7b5896f94bdf33b3a6661ebabd761ea6adc Mon Sep 17 00:00:00 2001 From: Harald Hoyer Date: Thu, 7 Mar 2013 20:44:35 +0100 Subject: [PATCH 1/1] pager: introduce "jump to end" option $ journalctl -be is what you want :) https://bugzilla.redhat.com/show_bug.cgi?id=867841 --- man/journalctl.xml | 14 ++++++++++++++ src/cgls/cgls.c | 2 +- src/delta/delta.c | 2 +- src/journal/coredumpctl.c | 2 +- src/journal/journalctl.c | 11 +++++++++-- src/locale/localectl.c | 2 +- src/login/loginctl.c | 2 +- src/shared/pager.c | 7 +++++-- src/shared/pager.h | 2 +- src/systemctl/systemctl.c | 2 +- src/timedate/timedatectl.c | 2 +- 11 files changed, 36 insertions(+), 12 deletions(-) diff --git a/man/journalctl.xml b/man/journalctl.xml index e2740e421..201f66a3b 100644 --- a/man/journalctl.xml +++ b/man/journalctl.xml @@ -162,6 +162,20 @@ the journal. + + + + + Immediately jump to + the end of the journal inside the + implied pager tool. Very useful in + combination with the + option. Note that + this is only supported for the + less1 + pager. + + diff --git a/src/cgls/cgls.c b/src/cgls/cgls.c index a05f9795b..e649b75df 100644 --- a/src/cgls/cgls.c +++ b/src/cgls/cgls.c @@ -132,7 +132,7 @@ int main(int argc, char *argv[]) { } if (!arg_no_pager) { - r = pager_open(); + r = pager_open(false); if (r > 0) { if (arg_full == -1) arg_full = true; diff --git a/src/delta/delta.c b/src/delta/delta.c index 16b10021b..aec3dc899 100644 --- a/src/delta/delta.c +++ b/src/delta/delta.c @@ -454,7 +454,7 @@ int main(int argc, char *argv[]) { arg_flags |= SHOW_OVERRIDDEN; if (!arg_no_pager) - pager_open(); + pager_open(false); if (optind < argc) { int i; diff --git a/src/journal/coredumpctl.c b/src/journal/coredumpctl.c index b6e558186..8bfab0075 100644 --- a/src/journal/coredumpctl.c +++ b/src/journal/coredumpctl.c @@ -560,7 +560,7 @@ int main(int argc, char *argv[]) { case ACTION_LIST: if (!arg_no_pager) - pager_open(); + pager_open(false); r = dump_list(j); break; diff --git a/src/journal/journalctl.c b/src/journal/journalctl.c index c90fecd23..5fb2db3ba 100644 --- a/src/journal/journalctl.c +++ b/src/journal/journalctl.c @@ -56,6 +56,7 @@ #define DEFAULT_FSS_INTERVAL_USEC (15*USEC_PER_MINUTE) static OutputMode arg_output = OUTPUT_SHORT; +static bool arg_pager_end = false; static bool arg_follow = false; static bool arg_full = false; static bool arg_all = false; @@ -103,6 +104,7 @@ static int help(void) { " -u --unit=UNIT Show data only from the specified unit\n" " --user-unit=UNIT Show data only from the specified user session unit\n" " -p --priority=RANGE Show only messages within the specified priority range\n" + " -e --pager-end Immediately jump to end of the journal in the pager\n" " -f --follow Follow journal\n" " -n --lines[=INTEGER] Number of journal entries to show\n" " --no-tail Show all lines, even in follow mode\n" @@ -163,6 +165,7 @@ static int parse_argv(int argc, char *argv[]) { { "help", no_argument, NULL, 'h' }, { "version" , no_argument, NULL, ARG_VERSION }, { "no-pager", no_argument, NULL, ARG_NO_PAGER }, + { "pager-end", no_argument, NULL, 'e' }, { "follow", no_argument, NULL, 'f' }, { "output", required_argument, NULL, 'o' }, { "all", no_argument, NULL, 'a' }, @@ -199,7 +202,7 @@ static int parse_argv(int argc, char *argv[]) { assert(argc >= 0); assert(argv); - while ((c = getopt_long(argc, argv, "hfo:an::qmbD:p:c:u:F:xr", options, NULL)) >= 0) { + while ((c = getopt_long(argc, argv, "hefo:an::qmbD:p:c:u:F:xr", options, NULL)) >= 0) { switch (c) { @@ -216,6 +219,10 @@ static int parse_argv(int argc, char *argv[]) { arg_no_pager = true; break; + case 'e': + arg_pager_end = true; + break; + case 'f': arg_follow = true; break; @@ -1075,7 +1082,7 @@ int main(int argc, char *argv[]) { } if (!arg_no_pager && !arg_follow) - pager_open(); + pager_open(arg_pager_end); if (!arg_quiet) { usec_t start, end; diff --git a/src/locale/localectl.c b/src/locale/localectl.c index ce31e1ffc..9f996dbc9 100644 --- a/src/locale/localectl.c +++ b/src/locale/localectl.c @@ -53,7 +53,7 @@ static void pager_open_if_enabled(void) { if (arg_no_pager) return; - pager_open(); + pager_open(false); } static void polkit_agent_open_if_enabled(void) { diff --git a/src/login/loginctl.c b/src/login/loginctl.c index 473c77b92..fe27003a9 100644 --- a/src/login/loginctl.c +++ b/src/login/loginctl.c @@ -58,7 +58,7 @@ static void pager_open_if_enabled(void) { if (arg_no_pager) return; - pager_open(); + pager_open(false); } static void polkit_agent_open_if_enabled(void) { diff --git a/src/shared/pager.c b/src/shared/pager.c index 5165d2b1c..4ffb530e9 100644 --- a/src/shared/pager.c +++ b/src/shared/pager.c @@ -44,7 +44,7 @@ _noreturn_ static void pager_fallback(void) { _exit(EXIT_SUCCESS); } -int pager_open(void) { +int pager_open(bool jump_to_end) { int fd[2]; const char *pager; pid_t parent_pid; @@ -85,7 +85,10 @@ int pager_open(void) { dup2(fd[0], STDIN_FILENO); close_pipe(fd); - setenv("LESS", "FRSXK", 0); + if (jump_to_end) + setenv("LESS", "FRSXK+G", 0); + else + setenv("LESS", "FRSXK", 0); /* Make sure the pager goes away when the parent dies */ if (prctl(PR_SET_PDEATHSIG, SIGTERM) < 0) diff --git a/src/shared/pager.h b/src/shared/pager.h index 5e7b5ab91..325ca98f7 100644 --- a/src/shared/pager.h +++ b/src/shared/pager.h @@ -23,6 +23,6 @@ #include -int pager_open(void); +int pager_open(bool jump_to_end); void pager_close(void); bool pager_have(void); diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c index 72e9c5539..4a55c566e 100644 --- a/src/systemctl/systemctl.c +++ b/src/systemctl/systemctl.c @@ -136,7 +136,7 @@ static void pager_open_if_enabled(void) { if (arg_no_pager) return; - pager_open(); + pager_open(false); } static void ask_password_agent_open_if_enabled(void) { diff --git a/src/timedate/timedatectl.c b/src/timedate/timedatectl.c index f5b5f0ca8..ef2ea0830 100644 --- a/src/timedate/timedatectl.c +++ b/src/timedate/timedatectl.c @@ -51,7 +51,7 @@ static void pager_open_if_enabled(void) { if (arg_no_pager) return; - pager_open(); + pager_open(false); } static void polkit_agent_open_if_enabled(void) { -- 2.30.2