aboutsummaryrefslogtreecommitdiff
path: root/main.c
diff options
context:
space:
mode:
authorMarc André Tanner <mat@brain-dump.org>2016-11-27 16:47:21 +0100
committerMarc André Tanner <mat@brain-dump.org>2016-11-27 16:47:21 +0100
commitce66ec2833143cc14eb6cffc6f16b736df9d1f31 (patch)
treef48ef5c733fbe0dfbdc10f41267e22990dce858f /main.c
parent81e20069163d7c0780d759d904149e247f97db86 (diff)
downloadvis-ce66ec2833143cc14eb6cffc6f16b736df9d1f31.tar.gz
vis-ce66ec2833143cc14eb6cffc6f16b736df9d1f31.tar.xz
vis: cleanup signal handling code
Move all signal handling code out of "library" code into user application.
Diffstat (limited to 'main.c')
-rw-r--r--main.c24
1 files changed, 20 insertions, 4 deletions
diff --git a/main.c b/main.c
index 7bab3cd..78a44c1 100644
--- a/main.c
+++ b/main.c
@@ -2237,16 +2237,32 @@ int main(int argc, char *argv[]) {
/* install signal handlers etc. */
struct sigaction sa;
memset(&sa, 0, sizeof sa);
+ sigfillset(&sa.sa_mask);
sa.sa_flags = SA_SIGINFO;
sa.sa_sigaction = signal_handler;
- if (sigaction(SIGBUS, &sa, NULL) || sigaction(SIGINT, &sa, NULL))
- vis_die(vis, "sigaction: %s", strerror(errno));
+ if (sigaction(SIGBUS, &sa, NULL) == -1 ||
+ sigaction(SIGINT, &sa, NULL) == -1 ||
+ sigaction(SIGCONT, &sa, NULL) == -1 ||
+ sigaction(SIGWINCH, &sa, NULL) == -1 ||
+ sigaction(SIGTERM, &sa, NULL) == -1 ||
+ sigaction(SIGHUP, &sa, NULL) == -1) {
+ vis_die(vis, "Failed to set signal handler: %s\n", strerror(errno));
+ }
+
+ sa.sa_handler = SIG_IGN;
+ if (sigaction(SIGPIPE, &sa, NULL) == -1)
+ vis_die(vis, "Failed to ignore SIGPIPE\n");
sigset_t blockset;
sigemptyset(&blockset);
+ sigaddset(&blockset, SIGBUS);
+ sigaddset(&blockset, SIGINT);
+ sigaddset(&blockset, SIGCONT);
sigaddset(&blockset, SIGWINCH);
- sigprocmask(SIG_BLOCK, &blockset, NULL);
- signal(SIGPIPE, SIG_IGN);
+ sigaddset(&blockset, SIGTERM);
+ sigaddset(&blockset, SIGHUP);
+ if (sigprocmask(SIG_BLOCK, &blockset, NULL) == -1)
+ vis_die(vis, "Failed to block signals\n");
for (int i = 1; i < argc; i++) {
if (argv[i][0] != '-') {