diff options
Diffstat (limited to 'src/pager.c')
-rw-r--r-- | src/pager.c | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/src/pager.c b/src/pager.c index be284da962..6e2bb4901e 100644 --- a/src/pager.c +++ b/src/pager.c @@ -20,6 +20,7 @@ ***/ #include <sys/types.h> +#include <fcntl.h> #include <stdlib.h> #include <unistd.h> #include <string.h> @@ -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 */ |