From: Michal Schmidt Date: Mon, 26 Sep 2011 21:02:56 +0000 (+0200) Subject: pager: add a trivial internal pager X-Git-Tag: v37~39 X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4a8e40ebd0938850d326c33a3d563c6cd44d47b4;p=systemd pager: add a trivial internal pager In the very unlikely scenario where none of the external pagers is available, use an internal implementation to pass stdin to stdout. Don't bother with trying 'cat', because it's no more useful than the internal pager. https://bugzilla.redhat.com/show_bug.cgi?id=713707 --- diff --git a/src/pager.c b/src/pager.c index be284da9..6e2bb490 100644 --- a/src/pager.c +++ b/src/pager.c @@ -20,6 +20,7 @@ ***/ #include +#include #include #include #include @@ -31,6 +32,18 @@ static pid_t pager_pid = 0; +static void pager_fallback(void) { + ssize_t n; + do { + n = splice(STDIN_FILENO, NULL, STDOUT_FILENO, NULL, 64*1024, 0); + } while (n > 0); + if (n < 0) { + log_error("Internal pager failed: %m"); + _exit(EXIT_FAILURE); + } + _exit(EXIT_SUCCESS); +} + void pager_open(void) { int fd[2]; const char *pager; @@ -96,10 +109,9 @@ void pager_open(void) { execlp("less", "less", NULL); execlp("more", "more", NULL); - execlp("cat", "cat", NULL); - log_error("Unable to execute pager: %m"); - _exit(EXIT_FAILURE); + pager_fallback(); + /* not reached */ } /* Return in the parent */