make work with new thread library
diff --git a/src/cmd/9term/9term.c b/src/cmd/9term/9term.c
index ffaf529..7d79cc3 100644
--- a/src/cmd/9term/9term.c
+++ b/src/cmd/9term/9term.c
@@ -20,7 +20,7 @@
 int noecho = 0;
 
 void servedevtext(void);
-void listenthread(void*);
+void listenproc(void*);
 void textthread(void*);
 
 typedef struct Text	Text;
@@ -249,7 +249,7 @@
 
 	initdraw(0, nil, "9term");
 	notify(hangupnote);
-	notifyatsig(SIGCHLD, 1);
+	noteenable("sys: child");
 	servedevtext();
 
 	mc = initmouse(nil, screen);
@@ -322,7 +322,7 @@
 		yield();
 
 		i = 1-i;	/* toggle */
-		n = threadread(rcfd, rcbuf[i].data, sizeof rcbuf[i].data);
+		n = read(rcfd, rcbuf[i].data, sizeof rcbuf[i].data);
 		if(n <= 0){
 			if(n < 0)
 				fprint(2, "9term: host read error: %r\n");
@@ -338,7 +338,7 @@
 hoststart(void)
 {
 	hostc = chancreate(sizeof(int), 0);
-	threadcreate(hostproc, hostc, 32*1024);
+	proccreate(hostproc, hostc, 32*1024);
 }
 
 void
@@ -1868,25 +1868,25 @@
 	}
 
 	putenv("text9term", buf);
-	threadcreate(listenthread, nil, STACK);
+	proccreate(listenproc, nil, STACK);
 	strcpy(thesocket, buf+5);
 	atexit(removethesocket);
 }
 
 void
-listenthread(void *arg)
+listenproc(void *arg)
 {
 	int fd;
 	char dir[100];
 
 	USED(arg);
 	for(;;){
-		fd = threadlisten(adir, dir);
+		fd = listen(adir, dir);
 		if(fd < 0){
 			close(afd);
 			return;
 		}
-		threadcreate(textthread, (void*)fd, STACK);
+		proccreate(textthread, (void*)fd, STACK);
 	}
 }
 
diff --git a/src/cmd/9term/rcstart.c b/src/cmd/9term/rcstart.c
index ddaadb5..1aa46dc 100644
--- a/src/cmd/9term/rcstart.c
+++ b/src/cmd/9term/rcstart.c
@@ -4,19 +4,24 @@
 #include "term.h"
 
 static void
-sys(char *buf)
+sys(char *buf, int devnull)
 {
 	char buf2[100];
 	char *f[20];
 	int nf, pid;
 
+	notedisable("sys: child");
 	strcpy(buf2, buf);
 	nf = tokenize(buf2, f, nelem(f));
 	f[nf] = nil;
 	switch(pid = fork()){
 	case 0:
+		close(1);
+		open("/dev/null", OREAD);
+		close(2);
+		open("/dev/null", OREAD);
 		execvp(f[0], f);
-		_exits("oops");
+		_exit(2);
 	default:
 		waitpid();
 	}
@@ -43,18 +48,23 @@
 	 * fd0 is slave (tty), fd1 is master (pty)
 	 */
 	fd[0] = fd[1] = -1;
-	if(getpts(fd, slave) < 0)
+	if(getpts(fd, slave) < 0){
+		exit(3);
 		sysfatal("getpts: %r\n");
-	switch(pid = fork()) {
+	}
+	notedisable("sys: window size change");
+	pid = fork();
+	switch(pid){
 	case 0:
 		putenv("TERM", "9term");
 		sfd = childpty(fd, slave);
 		dup(sfd, 0);
 		dup(sfd, 1);
 		dup(sfd, 2);
-		sys("stty tabs -onlcr onocr icanon echo erase '^h' intr '^?'");
+		sys("stty tabs -onlcr icanon echo erase '^h' intr '^?'", 0);
+		sys("stty onocr", 1);	/* not available on mac */
 		if(noecho)
-			sys("stty -echo");
+			sys("stty -echo", 0);
 		for(i=3; i<100; i++)
 			close(i);
 		signal(SIGINT, SIG_DFL);
@@ -62,7 +72,7 @@
 		signal(SIGTERM, SIG_DFL);
 		execvp(argv[0], argv);
 		fprint(2, "exec %s failed: %r\n", argv[0]);
-		_exits("oops");
+		_exit(2);
 		break;
 	case -1:
 		sysfatal("proc failed: %r");
diff --git a/src/cmd/9term/win.c b/src/cmd/9term/win.c
index a92c165..d471f98 100644
--- a/src/cmd/9term/win.c
+++ b/src/cmd/9term/win.c
@@ -110,6 +110,20 @@
 }
 
 void
+hangupnote(void *a, char *msg)
+{
+	if(strcmp(msg, "hangup") == 0 && pid != 0){
+		postnote(PNGROUP, pid, "hangup");
+		noted(NDFLT);
+	}
+	if(strstr(msg, "child")){
+		/* bug: do better */
+		threadexitsall(0);
+	}
+	noted(NDFLT);
+}
+
+void
 threadmain(int argc, char **argv)
 {
 	int fd, id;
@@ -140,7 +154,10 @@
 		}
 	}
 
-	threadnotify(nopipes, 1);
+	notedisable("sys: write on closed pipe");
+	noteenable("sys: child");
+	notify(hangupnote);
+
 	if((fs = nsmount("acme", "")) == 0)
 		sysfatal("nsmount acme: %r");
 	ctlfd = fsopen(fs, "new/ctl", ORDWR|OCEXEC);
@@ -184,7 +201,7 @@
 	fswrite(ctlfd, buf, strlen(buf));
 	
 	updatewinsize(25, 80, 0, 0);
-	threadcreate(stdoutproc, nil, STACK);
+	proccreate(stdoutproc, nil, STACK);
 	stdinproc(nil);
 }
 
@@ -420,13 +437,12 @@
 	char x[16], hold[UTFmax];
 
 	USED(v);
-	threadnotify(nopipes, 1);
 	buf = malloc(8192+UTFmax+1);
 	npart = 0;
 	for(;;){
 		/* Let typing have a go -- maybe there's a rubout waiting. */
 		yield();
-		n = threadread(fd1, buf+npart, 8192);
+		n = read(fd1, buf+npart, 8192);
 		if(n < 0)
 			error(nil);
 		if(n == 0)