diff options
Diffstat (limited to 'bin/nserver.c')
-rw-r--r-- | bin/nserver.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/bin/nserver.c b/bin/nserver.c index 8c05e7d..d2452be 100644 --- a/bin/nserver.c +++ b/bin/nserver.c @@ -1,13 +1,38 @@ /* SPDX-License-Identifier: BSD-3-Clause */ /* + * Copyright © 2010, Zed A. Shaw. * Copyright © 2020 rsiddharth <s@ricketyspace.net> */ #include <nserve.h> #include <nsocket.h> +#include <signal.h> +#include <sys/wait.h> #define BACKLOG 10 +void handle_sigchild(int sig) +{ + sig = 0; // ignore it + while(waitpid(-1, NULL, WNOHANG) > 0) { + } +} + +int setup_sigaction() +{ + struct sigaction sa = { + .sa_handler = handle_sigchild, + .sa_flags = SA_RESTART | SA_NOCLDSTOP + }; + sigemptyset(&sa.sa_mask); + int rc = sigaction(SIGCHLD, &sa, 0); + check(rc != -1, "signal handler setup failed."); + + return 0; + error: + return -1; +} + int main(void) { int rc = 0; @@ -16,6 +41,10 @@ int main(void) socklen_t sockaddr_c_len; pid_t pidc; + // create a sigaction that handles SIGCHLD + rc = setup_sigaction(); + check(rc != -1, "sigaction setup failed"); + sockfd_s = get_socket(); check(sockfd_s > 0, "nserver: unable to get socket"); @@ -30,6 +59,7 @@ int main(void) check(pidc != -1, "nserver: fork failed"); if (pidc == 0) { + close(sockfd_s); nserve(sockfd_c); } |