summaryrefslogtreecommitdiffstats
path: root/bin/nserver.c
diff options
context:
space:
mode:
Diffstat (limited to 'bin/nserver.c')
-rw-r--r--bin/nserver.c30
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);
}