Fighting the good fight.

Move libfmt, libutf into subdirectories of lib9.

Add poll-based socket i/o to libthread, so that we can
avoid using multiple procs when possible, thus removing
dependence on crappy pthreads implementations.

Convert samterm, acme to the single-proc libthread.

Bring libcomplete, acme up-to-date w.r.t. Plan 9 distribution.
diff --git a/src/lib9/await.c b/src/lib9/await.c
index 5f2d58b..a97c6d1 100644
--- a/src/lib9/await.c
+++ b/src/lib9/await.c
@@ -71,8 +71,8 @@
 	return 0;
 }
 
-int
-await(char *str, int n)
+static int
+_await(char *str, int n, int opt)
 {
 	int pid, status, cd;
 	struct rusage ru;
@@ -80,8 +80,8 @@
 	ulong u, s;
 
 	for(;;){
-		pid = wait3(&status, 0, &ru);
-		if(pid < 0)
+		pid = wait3(&status, opt, &ru);
+		if(pid <= 0)
 			return -1;
 		u = ru.ru_utime.tv_sec*1000+((ru.ru_utime.tv_usec+500)/1000);
 		s = ru.ru_stime.tv_sec*1000+((ru.ru_stime.tv_usec+500)/1000);
@@ -103,3 +103,16 @@
 		}
 	}
 }
+
+int
+await(char *str, int n)
+{
+	return _await(str, n, 0);
+}
+
+int
+awaitnohang(char *str, int n)
+{
+	return _await(str, n, WNOHANG);
+}
+
diff --git a/src/lib9/mkfile b/src/lib9/mkfile
index a0e75fc..70b06a2 100644
--- a/src/lib9/mkfile
+++ b/src/lib9/mkfile
@@ -3,7 +3,71 @@
 
 LIB=lib9.a
 
+NUM=\
+	charstod.$O\
+	pow10.$O\
+
+# Could add errfmt, but we want to pick it up from lib9 instead.
+FMTOFILES=\
+	dofmt.$O\
+	errfmt.$O\
+	fltfmt.$O\
+	fmt.$O\
+	fmtfd.$O\
+	fmtfdflush.$O\
+	fmtlock.$O\
+	fmtprint.$O\
+	fmtquote.$O\
+	fmtrune.$O\
+	fmtstr.$O\
+	fmtvprint.$O\
+	fprint.$O\
+	nan64.$O\
+	print.$O\
+	runefmtstr.$O\
+	runeseprint.$O\
+	runesmprint.$O\
+	runesnprint.$O\
+	runesprint.$O\
+	runevseprint.$O\
+	runevsmprint.$O\
+	runevsnprint.$O\
+	seprint.$O\
+	smprint.$O\
+	snprint.$O\
+	sprint.$O\
+	strtod.$O\
+	vfprint.$O\
+	vseprint.$O\
+	vsmprint.$O\
+	vsnprint.$O\
+	$NUM\
+
+UTFOFILES=\
+	rune.$O\
+	runestrcat.$O\
+	runestrchr.$O\
+	runestrcmp.$O\
+	runestrcpy.$O\
+	runestrdup.$O\
+	runestrlen.$O\
+	runestrecpy.$O\
+	runestrncat.$O\
+	runestrncmp.$O\
+	runestrncpy.$O\
+	runestrrchr.$O\
+	runestrstr.$O\
+	runetype.$O\
+	utfecpy.$O\
+	utflen.$O\
+	utfnlen.$O\
+	utfrrune.$O\
+	utfrune.$O\
+	utfutf.$O\
+
 OFILES=\
+	$FMTOFILES\
+	$UTFOFILES\
 	_exits.$O\
 	_p9dialparse.$O\
 	_p9dir.$O\
@@ -85,3 +149,10 @@
 	$PLAN9/include/lib9.h\
 
 <$PLAN9/src/mksyslib
+
+%.$O: fmt/%.c
+	$CC $CFLAGS -Ifmt fmt/$stem.c
+
+%.$O: utf/%.c
+	$CC $CFLAGS utf/$stem.c
+
diff --git a/src/lib9/nan.c b/src/lib9/nan.c
index d9f6965..34feb15 100644
--- a/src/lib9/nan.c
+++ b/src/lib9/nan.c
@@ -1,6 +1,6 @@
 #include <u.h>
 #include <libc.h>
-#include "../libfmt/nan.h"
+#include "fmt/nan.h"
 
 double
 NaN(void)
diff --git a/src/lib9/wait.c b/src/lib9/wait.c
index 6dc137b..856f85c 100644
--- a/src/lib9/wait.c
+++ b/src/lib9/wait.c
@@ -1,15 +1,15 @@
 #include <u.h>
 #include <libc.h>
 
-Waitmsg*
-wait(void)
+static Waitmsg*
+_wait(int nohang)
 {
 	int n, l;
 	char buf[512], *fld[5];
 	Waitmsg *w;
 
-	n = await(buf, sizeof buf-1);
-	if(n < 0)
+	n = (nohang ? awaitnohang : await)(buf, sizeof buf-1);
+	if(n <= 0)
 		return nil;
 	buf[n] = '\0';
 	if(tokenize(buf, fld, nelem(fld)) != nelem(fld)){
@@ -29,3 +29,15 @@
 	return w;
 }
 
+Waitmsg*
+wait(void)
+{
+	return _wait(0);
+}
+
+Waitmsg*
+waitnohang(void)
+{
+	return _wait(1);
+}
+