Commit Diff


commit - c66e8adfa3c56b87b8deb38cc8e0a0f997a9eded
commit + 230ead2fbe90864d309218048d5ad13070d536fa
blob - 1b6ae6f67193ece5035ae806a78574bcc7979a1a
blob + 3c408825c181163256731bac810b08c2dd5e6d18
--- src/libthread/daemonize.c
+++ src/libthread/daemonize.c
@@ -1,5 +1,6 @@
 #include "threadimpl.h"
 
+#undef waitpid
 #undef pipe
 #undef wait
 
@@ -10,13 +11,22 @@ static void
 child(void)
 {
 	int status, pid;
-	pid = wait(&status);
-	if(pid < 0)
-		fprint(2, "wait: %r\n");
-	else if(WIFEXITED(status))
+
+	notedisable("sys: child");
+	pid = waitpid(sigpid, &status, 0);
+	if(pid < 0){
+		fprint(2, "%s: wait: %r\n", argv0);
+		_exit(97);
+	}
+	if(WIFEXITED(status))
 		 _exit(WEXITSTATUS(status));
-print("pid %d if %d %d\n", pid, WIFEXITED(status), WEXITSTATUS(status));
-	_exit(97);
+	if(WIFSIGNALED(status)){
+		signal(WTERMSIG(status), SIG_DFL);
+		raise(WTERMSIG(status));
+		_exit(98);	/* not reached */
+	}
+	fprint(2, "%s: wait pid %d status 0x%ux\n", pid, status);
+	_exit(99);
 }
 
 static void
@@ -54,6 +64,7 @@ _threadsetupdaemonize(void)
 	if(fcntl(p[0], F_SETFD, 1) < 0 || fcntl(p[1], F_SETFD, 1) < 0)
 		sysfatal("passer pipe pipe fcntl: %r");
 
+	noteenable("sys: child");
 	signal(SIGCHLD, sigpass);
 	switch(pid = fork()){
 	case -1:
@@ -62,6 +73,8 @@ _threadsetupdaemonize(void)
 		close(p[1]);
 		break;
 	case 0:
+		for(i=0; i<100; i++) sched_yield();
+		notedisable("sys: child");
 		signal(SIGCHLD, SIG_DFL);
 		rfork(RFNOTEG);
 		close(p[0]);
@@ -81,8 +94,9 @@ _threadsetupdaemonize(void)
 
 	for(;;){
 		n = read(p[0], buf, sizeof buf-1);
-		if(n == 0)	/* program exited */
+		if(n == 0){	/* program exited */
 			child();
+		}
 		if(n > 0)
 			break;
 		print("passer read: %r\n");
@@ -92,7 +106,7 @@ _threadsetupdaemonize(void)
 }
 
 void
-threaddaemonize(void)
+_threaddaemonize(void)
 {
 	if(threadpassfd >= 0){
 		write(threadpassfd, "0", 1);