Merge branch 'master' into next
[git] / pager.c
1 #include "cache.h"
2
3 /*
4  * This is split up from the rest of git so that we might do
5  * something different on Windows, for example.
6  */
7
8 static void run_pager(void)
9 {
10         const char *prog = getenv("PAGER");
11         if (!prog)
12                 prog = "less";
13         setenv("LESS", "-S", 0);
14         execlp(prog, prog, NULL);
15 }
16
17 void setup_pager(void)
18 {
19         pid_t pid;
20         int fd[2];
21
22         if (!isatty(1))
23                 return;
24         if (pipe(fd) < 0)
25                 return;
26         pid = fork();
27         if (pid < 0) {
28                 close(fd[0]);
29                 close(fd[1]);
30                 return;
31         }
32
33         /* return in the child */
34         if (!pid) {
35                 dup2(fd[1], 1);
36                 close(fd[0]);
37                 close(fd[1]);
38                 return;
39         }
40
41         /* The original process turns into the PAGER */
42         dup2(fd[0], 0);
43         close(fd[0]);
44         close(fd[1]);
45
46         run_pager();
47         exit(255);
48 }