diff options
author | Laurent Bercot <ska-skaware@skarnet.org> | 2023-10-01 17:37:13 +0000 |
---|---|---|
committer | Laurent Bercot <ska@appnovation.com> | 2023-10-01 17:37:13 +0000 |
commit | e6c5053c71fe506c59e4717faa8a8aa3a2685ac7 (patch) | |
tree | c86a858cb34335ea48cbaa6e20207cb3056839a5 | |
parent | 95c2e7fb17f6baf37f1d2c5229ebb35938b64aa2 (diff) | |
download | s6-networking-e6c5053c71fe506c59e4717faa8a8aa3a2685ac7.tar.xz |
Better iteration when sending signals in s6-tcpserverd
Signed-off-by: Laurent Bercot <ska@appnovation.com>
-rw-r--r-- | src/conn-tools/s6-tcpserverd.c | 61 |
1 files changed, 33 insertions, 28 deletions
diff --git a/src/conn-tools/s6-tcpserverd.c b/src/conn-tools/s6-tcpserverd.c index 9f540f9..7b42bcc 100644 --- a/src/conn-tools/s6-tcpserverd.c +++ b/src/conn-tools/s6-tcpserverd.c @@ -151,15 +151,30 @@ static inline void log_close (pid_t pid, char const *ip, int w, uint32_t num) strerr_warni7x("end pid ", fmtpid, WIFSIGNALED(w) ? " signal " : " exitcode ", fmtw, " count ", fmtnum, fmtlocalmaxconn) ; } -static int killthem_iter (void *data, void *aux) +static int send_termcont_iter (void *data, void *aux) { - kill(((pidi *)data)->pid, *(int *)aux) ; + (void)aux ; + pid_t pid = ((pidi *)data)->pid ; + kill(pid, SIGTERM) ; + kill(pid, SIGCONT) ; return 1 ; } -static void killthem (int sig) +static int send_kill_iter (void *data, void *aux) { - genset_iter(pidis, &killthem_iter, &sig) ; + (void)aux ; + kill(((pidi *)data)->pid, SIGKILL) ; + return 1 ; +} + +static inline void send_termcont (void) +{ + genset_iter(pidis, &send_termcont_iter, 0) ; +} + +static inline void send_kill (void) +{ + genset_iter(pidis, &send_kill_iter, 0) ; } static inline void end_connection (pid_t pid, int wstat) @@ -207,21 +222,19 @@ static inline void handle_signals (void) case SIGHUP : if (verbosity >= 2) strerr_warni5x("received ", "SIGHUP,", " sending ", "SIGTERM and SIGCONT", " to all connections") ; - killthem(SIGTERM) ; - killthem(SIGCONT) ; + send_termcont() ; break ; case SIGQUIT : if (verbosity >= 2) strerr_warni6x("received ", "SIGQUIT,", " sending ", "SIGTERM and SIGCONT", " to all connections", " and quitting") ; cont = 0 ; - killthem(SIGTERM) ; - killthem(SIGCONT) ; + send_termcont() ; break ; case SIGABRT : if (verbosity >= 2) strerr_warni6x("received ", "SIGABRT,", " sending ", "SIGKILL", " to all connections", " and quitting") ; cont = 0 ; - killthem(SIGKILL) ; + send_kill() ; break ; default : X() ; } @@ -397,27 +410,19 @@ int main (int argc, char const *const *argv) if (iopause_g(x, 1 + (numconn < maxconn), 0) == -1) strerr_diefu1sys(111, "iopause") ; - if (x[0].revents & IOPAUSE_EXCEPT) strerr_dief1x(111, "trouble with selfpipe") ; - if (x[0].revents & IOPAUSE_READ) - { - handle_signals() ; - continue ; - } - if (numconn < maxconn) + if (x[0].revents & (IOPAUSE_READ | IOPAUSE_EXCEPT)) { handle_signals() ; continue ; } + if (numconn >= maxconn) continue ; + if (x[1].revents & (IOPAUSE_READ | IOPAUSE_EXCEPT)) { - if (x[1].revents & IOPAUSE_EXCEPT) strerr_dief1x(111, "trouble with socket") ; - if (x[1].revents & IOPAUSE_READ) + int fd = is6 ? socket_accept6(x[1].fd, ip, &port) : socket_accept4(x[1].fd, ip, &port) ; + if (fd == -1) + { + if (verbosity) strerr_warnwu1sys("accept") ; + } + else { - int fd = is6 ? socket_accept6(x[1].fd, ip, &port) : socket_accept4(x[1].fd, ip, &port) ; - if (fd == -1) - { - if (verbosity) strerr_warnwu1sys("accept") ; - } - else - { - new_connection(fd, ip, port, argv, (char const *const *)environ, modifs, m, envlen) ; - fd_close(fd) ; - } + new_connection(fd, ip, port, argv, (char const *const *)environ, modifs, m, envlen) ; + fd_close(fd) ; } } } |