+static void pager_open(void) {
+ pid_t pid;
+ int fd[2];
+ const char *pager = getenv("PAGER");
+
+ if (!on_tty() || arg_no_pager)
+ return;
+ if (!pager)
+ pager = "less";
+ else if (!*pager || !strcmp(pager, "cat"))
+ return;
+
+ if (pipe(fd) < 0)
+ return;
+ pid = fork();
+ if (pid < 0) {
+ close(fd[0]);
+ close(fd[1]);
+ return;
+ }
+
+ /* Return in the child */
+ if (!pid) {
+ dup2(fd[1], 1);
+ close(fd[0]);
+ close(fd[1]);
+ return;
+ }
+
+ /* The original process turns into the PAGER */
+ dup2(fd[0], 0);
+ close(fd[0]);
+ close(fd[1]);
+
+ setenv("LESS", "FRSX", 0);
+ execlp(pager, pager, NULL);
+ execl("/bin/sh", "sh", "-c", pager, NULL);
+
+ log_error("unable to execute pager '%s'", pager);
+ _exit(EXIT_FAILURE);
+}
+