chiark / gitweb /
pager: add a trivial internal pager
authorMichal Schmidt <mschmidt@redhat.com>
Mon, 26 Sep 2011 21:02:56 +0000 (23:02 +0200)
committerMichal Schmidt <mschmidt@redhat.com>
Tue, 27 Sep 2011 09:57:24 +0000 (11:57 +0200)
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

src/pager.c

index be284da9622b7a66776fc168928553748d325c7c..6e2bb4901ecd5dcc855c00163fd3d61fc24b3df7 100644 (file)
@@ -20,6 +20,7 @@
 ***/
 
 #include <sys/types.h>
+#include <fcntl.h>
 #include <stdlib.h>
 #include <unistd.h>
 #include <string.h>
 
 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 */