Commit Diff


commit - ddd8916a0e04baee417c2f71f73e45df9acf7c72
commit + df49b303431ef0b62c4f6fc4d790a1fd2d2f7e77
blob - a05fe6123710cd3739f2e7924e734072ee680e53
blob + 968953d6428f2caf2d481e40afb1767dd21aa2b2
--- src/cmd/plumb/plumber.c
+++ src/cmd/plumb/plumber.c
@@ -26,11 +26,24 @@ makeports(Ruleset *rules[])
 }
 
 void
+mainproc(void *v)
+{
+	Channel *c;
+
+	c = v;
+	printerrors = 0;
+	makeports(rules);
+	startfsys();
+	sendp(c, nil);
+}
+
+void
 threadmain(int argc, char *argv[])
 {
 	char buf[512];
 	int fd;
 	int volatile dofork;
+	Channel *c;
 
 	progname = "plumber";
 	dofork = 1;
@@ -73,9 +86,15 @@ threadmain(int argc, char *argv[])
 	if(dofork)
 		threaddaemonize();
 
-	printerrors = 0;
-	makeports(rules);
-	startfsys();
+	/*
+	 * Start all processes and threads from other proc
+	 * so we (main pid) can return to user.
+	 */
+	c = chancreate(sizeof(void*), 0);
+	proccreate(mainproc, c, 8192);
+	recvp(c);
+	chanfree(c);
+	threadexits(nil);
 }
 
 void