about summary refs log tree commit diff
path: root/sandman.m
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2018-12-01 10:28:00 -0500
committerJune McEnroe <june@causal.agency>2018-12-01 10:28:00 -0500
commite708b795b5f77969f2d3001c9382be01c8205006 (patch)
tree1229392d351ddd4e064a6864f591f7ccde883b70 /sandman.m
parentHandle signals consistently in the event loop (diff)
downloadcatgirl-e708b795b5f77969f2d3001c9382be01c8205006.tar.gz
catgirl-e708b795b5f77969f2d3001c9382be01c8205006.zip
Use sigaction in sandman
Diffstat (limited to 'sandman.m')
-rw-r--r--sandman.m13
1 files changed, 10 insertions, 3 deletions
diff --git a/sandman.m b/sandman.m
index 7d2f56a..44ab267 100644
--- a/sandman.m
+++ b/sandman.m
@@ -21,11 +21,11 @@
 #import <sysexits.h>
 #import <unistd.h>
 
-void sigchld(int sig) {
+void handler(int sig) {
 	(void)sig;
 	int status;
 	pid_t pid = wait(&status);
-	if (pid < 0) err(EX_OSERR, "wait");
+	if (pid < 0) _exit(EX_OSERR);
 	if (WIFSIGNALED(status)) {
 		_exit(128 + WTERMSIG(status));
 	} else {
@@ -36,7 +36,14 @@ void sigchld(int sig) {
 int main(int argc, char *argv[]) {
 	if (argc < 2) return EX_USAGE;
 
-	signal(SIGCHLD, sigchld);
+	sigset_t mask;
+	sigemptyset(&mask);
+	struct sigaction sa = {
+		.sa_handler = handler,
+		.sa_mask = mask,
+		.sa_flags = SA_RESTART,
+	};
+	sigaction(SIGCHLD, &sa, NULL);
 
 	pid_t pid = fork();
 	if (pid < 0) err(EX_OSERR, "fork");