From 06b6835413fdc351ca425bbd4dc12dcb257ba425 Mon Sep 17 00:00:00 2001 From: Nate Straz Date: Thu, 25 Aug 2005 15:18:38 +0000 Subject: Generalize the signal setup and move it to its own function. We now propogate SIGTERM, SIGHUP, SIGUSR1, SIGUSR2, and SIGINT. --- qarsh/qarsh.c | 35 +++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/qarsh/qarsh.c b/qarsh/qarsh.c index 2c709c7..4a96147 100644 --- a/qarsh/qarsh.c +++ b/qarsh/qarsh.c @@ -30,6 +30,8 @@ /* Globals */ int qarsh_fd = -1; /* The control connection to qarshd */ int signal_to_send = 0; +int sigs_to_propogate[] = { SIGINT, SIGTERM, SIGHUP, SIGUSR1, SIGUSR2 }; +sigset_t pselect_sigmask; void usage() @@ -67,6 +69,27 @@ sig_handler(int sig) signal_to_send = sig; } +void +setup_signals(void) +{ + struct sigaction sa; + sigset_t sigmask; + int i, n; + + n = sizeof sigs_to_propogate / sizeof *sigs_to_propogate; + sigemptyset(&sigmask); + for (i = 0; i < n; i++) { + sigaddset(&sigmask, sigs_to_propogate[i]); + } + sigprocmask(SIG_BLOCK, &sigmask, &pselect_sigmask); + sa.sa_handler = sig_handler; + sa.sa_mask = sigmask; + sa.sa_flags = SA_RESTART; + for (i = 0; i < n; i++) { + sigaction(sigs_to_propogate[i], &sa, NULL); + } +} + void set_remote_user(char *user, char *group) { @@ -98,8 +121,6 @@ run_remote_cmd(char *cmdline) int l_in, l_out, l_err; /* listening sockets */ int c_in, c_out, c_err; /* client sockets */ fd_set readfds, testfds; - sigset_t sigmask, orig_sigmask; - struct sigaction sa; int nset; struct sockaddr_in caddr; socklen_t clen; @@ -171,13 +192,7 @@ run_remote_cmd(char *cmdline) FD_SET(c_err, &readfds); FD_SET(fileno(stdin), &readfds); /* Setup signal handling stuff so we can propogate signals */ - sigemptyset(&sigmask); - sigaddset(&sigmask, SIGINT); - sigprocmask(SIG_BLOCK, &sigmask, &orig_sigmask); - sa.sa_handler = sig_handler; - sa.sa_mask = sigmask; - sa.sa_flags = SA_RESTART; - sigaction(SIGINT, &sa, NULL); + setup_signals(); if (fcntl(fileno(stdin), F_SETFL, O_NONBLOCK) != 0) { fprintf(stderr, @@ -192,7 +207,7 @@ run_remote_cmd(char *cmdline) memset(buf, 0, 1024); nset = pselect(FD_SETSIZE, &testfds, NULL, NULL, NULL, - &orig_sigmask); + &pselect_sigmask); if (nset == -1 && errno == EINTR) { nset = 0; } -- cgit