more tests
diff --git a/src/libthread/test/rdaemon.c b/src/libthread/test/rdaemon.c
new file mode 100644
index 0000000..dcb7727
--- /dev/null
+++ b/src/libthread/test/rdaemon.c
@@ -0,0 +1,96 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <sys/wait.h>
+#include <pthread.h>
+
+#undef waitpid
+#undef pipe
+#undef wait
+
+static int sigpid;
+static void
+sigenable(int sig, int enabled)
+{
+	sigset_t mask;
+	sigemptyset(&mask);
+	sigaddset(&mask, sig);
+	sigprocmask(enabled ? SIG_UNBLOCK : SIG_BLOCK, &mask, 0);
+}
+
+static void
+child(void)
+{
+	int status, pid;
+printf("wait %d in %d\n", sigpid, getpid());
+	pid = waitpid(sigpid, &status, __WALL);
+	if(pid < 0)
+		perror("wait");
+	else if(WIFEXITED(status))
+		 _exit(WEXITSTATUS(status));
+printf("pid %d if %d %d\n", pid, WIFEXITED(status), WEXITSTATUS(status));
+	_exit(97);
+}
+
+static void
+sigpass(int sig)
+{
+	if(sig == SIGCHLD){
+print("sig\n");
+		child();
+	}else
+		kill(sigpid, sig);
+}
+
+void
+_threadsetupdaemonize(void)
+{
+	int i, n, pid;
+	int p[2];
+	char buf[20];
+
+	sigpid = 1;
+
+	if(pipe(p) < 0)
+		abort();
+
+	signal(SIGCHLD, sigpass);
+	switch(pid = fork()){
+	case -1:
+		abort();
+	default:
+		close(p[1]);
+		break;
+	case 0:
+		close(p[0]);
+		return;
+	}
+
+	sigpid = pid;
+
+	read(p[0], buf, sizeof buf-1);
+print("pipe\n");
+	child();
+}
+
+void*
+sleeper(void *v)
+{
+	pthread_mutex_t m;
+	pthread_cond_t c;
+
+	pthread_mutex_init(&m, 0);
+	pthread_cond_init(&c, 0);
+	pthread_cond_wait(&c, &m);
+	return 0;
+}
+
+void
+main(int argc, char **argv)
+{
+	pthread_t pid;
+
+	_threadsetupdaemonize();
+	pthread_create(&pid, 0, sleeper, 0);
+	exit(1);
+}