don't rfork(RFNOTEG) because then you lose
the ability to read from the console.  damn.

also, handle case where child exits before
fork returns in parent.  have to record that
sigchld was seen and then run the handler later.
diff --git a/src/libthread/daemonize.c b/src/libthread/daemonize.c
index da8ec97..8f4d5ee 100644
--- a/src/libthread/daemonize.c
+++ b/src/libthread/daemonize.c
@@ -9,6 +9,7 @@
 
 static int sigpid;
 static int threadpassfd;
+static int gotsigchld;
 
 static void
 child(void)
@@ -44,12 +45,28 @@
 static void
 sigpass(int sig)
 {
+	if(sigpid == 1){
+		gotsigchld = 1;
+		return;
+	}
+
 	if(sig == SIGCHLD)
 		child();
 	else
 		kill(sigpid, sig);
 }
 
+static int sigs[] = 
+{
+	SIGHUP, SIGINT, SIGQUIT, SIGILL,
+	SIGTRAP, SIGABRT, SIGBUS, SIGFPE,
+	SIGUSR1, SIGSEGV, SIGUSR2, SIGPIPE,
+	SIGALRM, SIGTERM, SIGCHLD, SIGSTOP,
+	SIGTSTP, SIGTTIN, SIGTTOU, SIGURG, 
+	SIGXCPU, SIGXFSZ, SIGVTALRM, SIGPROF,
+	SIGWINCH, SIGIO, SIGPWR, SIGSYS
+};
+
 void
 _threadsetupdaemonize(void)
 {
@@ -88,20 +105,23 @@
 		for(i=0; i<100; i++) sched_yield();
 		notedisable("sys: child");
 		signal(SIGCHLD, SIG_DFL);
-		rfork(RFNOTEG);
+	/*	rfork(RFNOTEG); */
 		close(p[0]);
 		threadpassfd = p[1];
 		return;
 	}
 
 	sigpid = pid;
-	for(i=0; i<NSIG; i++){
+	if(gotsigchld)
+		sigpass(SIGCHLD);
+
+	for(i=0; i<nelem(sigs); i++){
 		struct sigaction sa;
 
 		memset(&sa, 0, sizeof sa);
 		sa.sa_handler = sigpass;
 		sa.sa_flags |= SA_RESTART;
-		sigaction(i, &sa, nil);
+		sigaction(sigs[i], &sa, nil);
 	}
 
 	for(;;){