pager: do wait_for_pager on signal death
[gitweb.git] / pager.c
diff --git a/pager.c b/pager.c
index aa0966c9c55566382bf32c946c0a1846f004125a..4921843577e42b774457a61277b9bc3441d3ab6b 100644 (file)
--- a/pager.c
+++ b/pager.c
@@ -1,5 +1,6 @@
 #include "cache.h"
 #include "run-command.h"
+#include "sigchain.h"
 
 /*
  * This is split up from the rest of git so that we can do
@@ -38,6 +39,13 @@ static void wait_for_pager(void)
        finish_command(&pager_process);
 }
 
+static void wait_for_pager_signal(int signo)
+{
+       wait_for_pager();
+       sigchain_pop(signo);
+       raise(signo);
+}
+
 void setup_pager(void)
 {
        const char *pager = getenv("GIT_PAGER");
@@ -70,10 +78,12 @@ void setup_pager(void)
 
        /* original process continues, but writes to the pipe */
        dup2(pager_process.in, 1);
-       dup2(pager_process.in, 2);
+       if (isatty(2))
+               dup2(pager_process.in, 2);
        close(pager_process.in);
 
        /* this makes sure that the parent terminates after the pager */
+       sigchain_push_common(wait_for_pager_signal);
        atexit(wait_for_pager);
 }