From d0d42dc4cbe3fd3969662cb9e36766050af08f03 Mon Sep 17 00:00:00 2001 From: nicm Date: Wed, 12 Jul 2017 09:07:52 +0000 Subject: proc_send_s now seems unnecessary. --- proc.c | 6 ------ 1 file changed, 6 deletions(-) (limited to 'proc.c') diff --git a/proc.c b/proc.c index ea2c8a31..fc8db304 100644 --- a/proc.c +++ b/proc.c @@ -161,12 +161,6 @@ proc_send(struct tmuxpeer *peer, enum msgtype type, int fd, const void *buf, return (0); } -int -proc_send_s(struct tmuxpeer *peer, enum msgtype type, const char *s) -{ - return (proc_send(peer, type, -1, s, strlen(s) + 1)); -} - struct tmuxproc * proc_start(const char *name, struct event_base *base, int forkflag, void (*signalcb)(int)) -- cgit v1.2.3 From 0453ad01468460d5fca09457ed7c862685076931 Mon Sep 17 00:00:00 2001 From: nicm Date: Wed, 12 Jul 2017 09:24:17 +0000 Subject: Move signal code into proc.c. --- proc.c | 89 +++++++++++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 67 insertions(+), 22 deletions(-) (limited to 'proc.c') diff --git a/proc.c b/proc.c index fc8db304..81fced50 100644 --- a/proc.c +++ b/proc.c @@ -24,6 +24,7 @@ #include #include #include +#include #include #include #include @@ -35,6 +36,14 @@ struct tmuxproc { int exit; void (*signalcb)(int); + + struct event ev_sighup; + struct event ev_sigchld; + struct event ev_sigcont; + struct event ev_sigterm; + struct event ev_sigusr1; + struct event ev_sigusr2; + struct event ev_sigwinch; }; struct tmuxpeer { @@ -162,29 +171,11 @@ proc_send(struct tmuxpeer *peer, enum msgtype type, int fd, const void *buf, } struct tmuxproc * -proc_start(const char *name, struct event_base *base, int forkflag, - void (*signalcb)(int)) +proc_start(const char *name) { struct tmuxproc *tp; struct utsname u; - if (forkflag) { - switch (fork()) { - case -1: - fatal("fork failed"); - case 0: - break; - default: - return (NULL); - } - if (daemon(1, 0) != 0) - fatal("daemon failed"); - - clear_signals(0); - if (event_reinit(base) != 0) - fatalx("event_reinit failed"); - } - log_open(name); setproctitle("%s (%s)", name, socket_path); @@ -199,9 +190,6 @@ proc_start(const char *name, struct event_base *base, int forkflag, tp = xcalloc(1, sizeof *tp); tp->name = xstrdup(name); - tp->signalcb = signalcb; - set_signals(proc_signal_cb, tp); - return (tp); } @@ -221,6 +209,63 @@ proc_exit(struct tmuxproc *tp) tp->exit = 1; } +void +proc_set_signals(struct tmuxproc *tp, void (*signalcb)(int)) +{ + struct sigaction sa; + + tp->signalcb = signalcb; + + memset(&sa, 0, sizeof sa); + sigemptyset(&sa.sa_mask); + sa.sa_flags = SA_RESTART; + sa.sa_handler = SIG_IGN; + + sigaction(SIGINT, &sa, NULL); + sigaction(SIGPIPE, &sa, NULL); + sigaction(SIGUSR2, &sa, NULL); + sigaction(SIGTSTP, &sa, NULL); + + signal_set(&tp->ev_sighup, SIGHUP, proc_signal_cb, tp); + signal_add(&tp->ev_sighup, NULL); + signal_set(&tp->ev_sigchld, SIGCHLD, proc_signal_cb, tp); + signal_add(&tp->ev_sigchld, NULL); + signal_set(&tp->ev_sigcont, SIGCONT, proc_signal_cb, tp); + signal_add(&tp->ev_sigcont, NULL); + signal_set(&tp->ev_sigterm, SIGTERM, proc_signal_cb, tp); + signal_add(&tp->ev_sigterm, NULL); + signal_set(&tp->ev_sigusr1, SIGUSR1, proc_signal_cb, tp); + signal_add(&tp->ev_sigusr1, NULL); + signal_set(&tp->ev_sigusr2, SIGUSR2, proc_signal_cb, tp); + signal_add(&tp->ev_sigusr2, NULL); + signal_set(&tp->ev_sigwinch, SIGWINCH, proc_signal_cb, tp); + signal_add(&tp->ev_sigwinch, NULL); +} + +void +proc_clear_signals(struct tmuxproc *tp) +{ + struct sigaction sa; + + memset(&sa, 0, sizeof sa); + sigemptyset(&sa.sa_mask); + sa.sa_flags = SA_RESTART; + sa.sa_handler = SIG_DFL; + + sigaction(SIGINT, &sa, NULL); + sigaction(SIGPIPE, &sa, NULL); + sigaction(SIGUSR2, &sa, NULL); + sigaction(SIGTSTP, &sa, NULL); + + event_del(&tp->ev_sighup); + event_del(&tp->ev_sigchld); + event_del(&tp->ev_sigcont); + event_del(&tp->ev_sigterm); + event_del(&tp->ev_sigusr1); + event_del(&tp->ev_sigusr2); + event_del(&tp->ev_sigwinch); +} + struct tmuxpeer * proc_add_peer(struct tmuxproc *tp, int fd, void (*dispatchcb)(struct imsg *, void *), void *arg) -- cgit v1.2.3