summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNate Straz <nstraz@redhat.com>2005-08-25 15:18:38 +0000
committerNate Straz <nstraz@redhat.com>2005-08-25 15:18:38 +0000
commit06b6835413fdc351ca425bbd4dc12dcb257ba425 (patch)
treeb807334d87bca8c426b5cfb108e0f3e2b405e354
parent468d9d0d5dd436b6280639850449a38f48715894 (diff)
downloadqarsh-06b6835413fdc351ca425bbd4dc12dcb257ba425.tar.gz
qarsh-06b6835413fdc351ca425bbd4dc12dcb257ba425.tar.xz
qarsh-06b6835413fdc351ca425bbd4dc12dcb257ba425.zip
Generalize the signal setup and move it to its own function.
We now propogate SIGTERM, SIGHUP, SIGUSR1, SIGUSR2, and SIGINT.
-rw-r--r--qarsh/qarsh.c35
1 files 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()
@@ -68,6 +70,27 @@ sig_handler(int 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)
{
struct qa_packet *qp;
@@ -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;
}