diff options
author | Karel Zak | 2016-08-26 13:02:37 +0200 |
---|---|---|
committer | Karel Zak | 2016-08-26 13:02:37 +0200 |
commit | a9fcbf6f6a892c872a57b9d24e9ceb28e6e3c032 (patch) | |
tree | 2705ac1412e051d4938b3ca6922f1af0db71668f | |
parent | fdisk: use PAGER for 'l' command. (diff) | |
download | kernel-qcow2-util-linux-a9fcbf6f6a892c872a57b9d24e9ceb28e6e3c032.tar.gz kernel-qcow2-util-linux-a9fcbf6f6a892c872a57b9d24e9ceb28e6e3c032.tar.xz kernel-qcow2-util-linux-a9fcbf6f6a892c872a57b9d24e9ceb28e6e3c032.zip |
lib/pager: restore signals setting by pager_close()
Signed-off-by: Karel Zak <kzak@redhat.com>
-rw-r--r-- | lib/pager.c | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/lib/pager.c b/lib/pager.c index fb2c2d9d8..07f9c6aeb 100644 --- a/lib/pager.c +++ b/lib/pager.c @@ -33,6 +33,11 @@ struct child_process { int org_err; int org_out; + struct sigaction orig_sigint; + struct sigaction orig_sighup; + struct sigaction orig_sigterm; + struct sigaction orig_sigquit; + struct sigaction orig_sigpipe; unsigned no_stdin:1; void (*preexec_cb)(void); @@ -168,6 +173,7 @@ static void wait_for_pager_signal(int signo) static void __setup_pager(void) { const char *pager = getenv("PAGER"); + struct sigaction sa; if (!isatty(STDOUT_FILENO)) return; @@ -192,12 +198,15 @@ static void __setup_pager(void) dup2(pager_process.in, STDERR_FILENO); close(pager_process.in); + memset(&sa, 0, sizeof(sa)); + sa.sa_handler = wait_for_pager_signal; + /* this makes sure that the parent terminates after the pager */ - signal(SIGINT, wait_for_pager_signal); - signal(SIGHUP, wait_for_pager_signal); - signal(SIGTERM, wait_for_pager_signal); - signal(SIGQUIT, wait_for_pager_signal); - signal(SIGPIPE, wait_for_pager_signal); + sigaction(SIGINT, &sa, &pager_process.orig_sigint); + sigaction(SIGHUP, &sa, &pager_process.orig_sighup); + sigaction(SIGTERM, &sa, &pager_process.orig_sigterm); + sigaction(SIGQUIT, &sa, &pager_process.orig_sigquit); + sigaction(SIGPIPE, &sa, &pager_process.orig_sigpipe); } /* Setup pager and redirects output to the $PAGER. The pager is closed at exit. @@ -233,12 +242,21 @@ void pager_close(void) return; wait_for_pager(); + + /* restore original output */ dup2(pager_process.org_out, STDOUT_FILENO); dup2(pager_process.org_err, STDERR_FILENO); close(pager_process.org_out); close(pager_process.org_err); + /* restore original segnals setting */ + sigaction(SIGINT, &pager_process.orig_sigint, NULL); + sigaction(SIGHUP, &pager_process.orig_sighup, NULL); + sigaction(SIGTERM, &pager_process.orig_sigterm, NULL); + sigaction(SIGQUIT, &pager_process.orig_sigquit, NULL); + sigaction(SIGPIPE, &pager_process.orig_sigpipe, NULL); + memset(&pager_process, 0, sizeof(pager_process)); } |