summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKarel Zak2016-08-26 13:02:37 +0200
committerKarel Zak2016-08-26 13:02:37 +0200
commita9fcbf6f6a892c872a57b9d24e9ceb28e6e3c032 (patch)
tree2705ac1412e051d4938b3ca6922f1af0db71668f
parentfdisk: use PAGER for 'l' command. (diff)
downloadkernel-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.c28
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));
}