Today's changes.
More changes.
diff --git a/src/lib9/_p9translate.c b/src/lib9/_p9translate.c
index 4eb6eac..84cd65c 100644
--- a/src/lib9/_p9translate.c
+++ b/src/lib9/_p9translate.c
@@ -14,7 +14,7 @@
 };
 
 char*
-_p9translate(char *old)
+plan9translate(char *old)
 {
 	char *new;
 	int i, olen, nlen, len;
@@ -36,7 +36,7 @@
 		len = strlen(old)+nlen-olen;
 		new = malloc(len+1);
 		if(new == nil)
-			return nil;
+			return "<out of memory>";
 		strcpy(new, replace[i].new);
 		strcpy(new+nlen, old+olen);
 		assert(strlen(new) == len);
diff --git a/src/lib9/access.c b/src/lib9/access.c
deleted file mode 100644
index 20b00c3..0000000
--- a/src/lib9/access.c
+++ /dev/null
@@ -1,19 +0,0 @@
-#include <u.h>
-#define NOPLAN9DEFINES
-#include <libc.h>
-
-char *_p9translate(char*);
-
-int
-p9access(char *xname, int what)
-{
-	int ret;
-	char *name;
-
-	if((name = _p9translate(xname)) == nil)
-		return -1;
-	ret = access(name, what);
-	if(name != xname)
-		free(name);
-	return ret;
-}
diff --git a/src/lib9/announce.c b/src/lib9/announce.c
index 9f07bd2..8fdf1d4 100644
--- a/src/lib9/announce.c
+++ b/src/lib9/announce.c
@@ -40,7 +40,8 @@
 	char *net;
 	u32int host;
 	int port, s;
-	int n, sn;
+	int n;
+	socklen_t sn;
 	struct sockaddr_in sa;
 	struct sockaddr_un sun;
 
@@ -72,7 +73,7 @@
 	if((s = socket(AF_INET, proto, 0)) < 0)
 		return -1;
 	sn = sizeof n;
-	if(port && getsockopt(s, SOL_SOCKET, SO_TYPE, (char*)&n, &sn) >= 0
+	if(port && getsockopt(s, SOL_SOCKET, SO_TYPE, (void*)&n, &sn) >= 0
 	&& n == SOCK_STREAM){
 		n = 1;
 		setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char*)&n, sizeof n);
diff --git a/src/lib9/create.c b/src/lib9/create.c
index bdad5f6..97f6e7e 100644
--- a/src/lib9/create.c
+++ b/src/lib9/create.c
@@ -3,16 +3,10 @@
 #include <libc.h>
 #include <sys/stat.h>
 
-extern char *_p9translate(char*);
-
 int
-p9create(char *xpath, int mode, ulong perm)
+p9create(char *path, int mode, ulong perm)
 {
 	int fd, cexec, umode, rclose;
-	char *path;
-
-	if((path = _p9translate(xpath)) == nil)
-		return -1;
 
 	cexec = mode&OCEXEC;
 	rclose = mode&ORCLOSE;
@@ -48,7 +42,5 @@
 		if(rclose)
 			remove(path);
 	}
-	if(path != xpath)
-		free(path);
 	return fd;
 }
diff --git a/src/lib9/ctime.c b/src/lib9/ctime.c
index e9d971b..0782d09 100644
--- a/src/lib9/ctime.c
+++ b/src/lib9/ctime.c
@@ -15,6 +15,7 @@
 char*
 asctime(Tm *t)
 {
+	int i;
 	char *ncp;
 	static char cbuf[30];
 
@@ -32,6 +33,12 @@
 	ct_numb(cbuf+14, t->min+100);
 	ct_numb(cbuf+17, t->sec+100);
 	ncp = t->zone;
+	for(i=0; i<3; i++)
+		if(ncp[i] == 0)
+			break;
+	for(; i<3; i++)
+		ncp[i] = '?';
+	ncp = t->zone;
 	cbuf[20] = *ncp++;
 	cbuf[21] = *ncp++;
 	cbuf[22] = *ncp;
diff --git a/src/lib9/date.c b/src/lib9/date.c
index 8ece0c6..8f852de 100644
--- a/src/lib9/date.c
+++ b/src/lib9/date.c
@@ -1,6 +1,5 @@
-#include <stdlib.h> /* setenv etc. */
-
 #include <u.h>
+#include <stdlib.h> /* setenv etc. */
 #define NOPLAN9DEFINES
 #include <libc.h>
 #include <time.h>
@@ -25,6 +24,8 @@
 static void
 tm2Tm(struct tm *tm, Tm *bigtm)
 {
+	char *s;
+
 	memset(bigtm, 0, sizeof *bigtm);
 	bigtm->sec = tm->tm_sec;
 	bigtm->min = tm->tm_min;
@@ -39,6 +40,13 @@
 #ifdef _HAVETZOFF
 	bigtm->tzoff = tm->tm_gmtoff;
 #endif
+	if(bigtm->zone[0] == 0){
+		s = getenv("TIMEZONE");
+		if(s){
+			strecpy(bigtm->zone, bigtm->zone+4, tm->tm_zone);
+			free(s);
+		}
+	}
 }
 
 static void
diff --git a/src/lib9/dirread.c b/src/lib9/dirread.c
index aef0102..0a72d62 100644
--- a/src/lib9/dirread.c
+++ b/src/lib9/dirread.c
@@ -18,7 +18,7 @@
 	nn = getdirentries(fd, (void*)buf, n, &off);
 	return nn;
 }
-#elif defined(__APPLE__) || defined(__FreeBSD__)
+#elif defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__)
 static int
 mygetdents(int fd, struct dirent *buf, int n)
 {
@@ -171,7 +171,7 @@
 		ts += n;
 	}
 	if(ts >= 0)
-		ts = dirpackage(fd, buf, ts, d);
+		ts = dirpackage(fd, (char*)buf, ts, d);
 	free(buf);
 	if(ts == 0 && n < 0)
 		return -1;
diff --git a/src/lib9/errstr.c b/src/lib9/errstr.c
index 0c6ab31..578f489 100644
--- a/src/lib9/errstr.c
+++ b/src/lib9/errstr.c
@@ -5,9 +5,10 @@
  * okay.
  */
 
+#include <u.h>
 #include <errno.h>
 #include <string.h>
-#include <lib9.h>
+#include <libc.h>
 
 enum
 {
diff --git a/src/lib9/ffork-OpenBSD.c b/src/lib9/ffork-OpenBSD.c
new file mode 100644
index 0000000..5e677f7
--- /dev/null
+++ b/src/lib9/ffork-OpenBSD.c
@@ -0,0 +1 @@
+#include "ffork-pthread.c"
diff --git a/src/lib9/getuser.c b/src/lib9/getuser.c
index b53a389..09c0704 100644
--- a/src/lib9/getuser.c
+++ b/src/lib9/getuser.c
@@ -1,6 +1,5 @@
-#include <pwd.h>
-
 #include <u.h>
+#include <pwd.h>
 #include <libc.h>
 
 char*
diff --git a/src/lib9/lock.c b/src/lib9/lock.c
index 5d6f2f3..e97b967 100644
--- a/src/lib9/lock.c
+++ b/src/lib9/lock.c
@@ -1,6 +1,7 @@
+#include <u.h>
 #include <unistd.h>
 #include <sched.h>
-#include <lib9.h>
+#include <libc.h>
 
 int _ntas;
 static int
diff --git a/src/lib9/mallocz.c b/src/lib9/mallocz.c
index c631300..a3e9151 100644
--- a/src/lib9/mallocz.c
+++ b/src/lib9/mallocz.c
@@ -1,6 +1,7 @@
+#include <u.h>
 #include <unistd.h>
 #include <string.h>
-#include <lib9.h>
+#include <libc.h>
 
 void*
 mallocz(unsigned long n, int clr)
diff --git a/src/lib9/mkfile b/src/lib9/mkfile
index d388d22..4dda2e1 100644
--- a/src/lib9/mkfile
+++ b/src/lib9/mkfile
@@ -69,8 +69,6 @@
 	_p9dialparse.$O\
 	_p9dir.$O\
 	_p9proc.$O\
-	_p9translate.$O\
-	access.$O\
 	announce.$O\
 	argv0.$O\
 	atexit.$O\
@@ -100,6 +98,7 @@
 	exec.$O\
 	fcallfmt.$O\
 	ffork-$SYSNAME.$O\
+	get9root.$O\
 	getcallerpc-$OBJTYPE.$O\
 	getenv.$O\
 	getfields.$O\
@@ -142,6 +141,7 @@
 	u16.$O\
 	u32.$O\
 	u64.$O\
+	unsharp.$O\
 	wait.$O\
 	waitpid.$O\
 
diff --git a/src/lib9/notify.c b/src/lib9/notify.c
index 2e589de..4d2a79e 100644
--- a/src/lib9/notify.c
+++ b/src/lib9/notify.c
@@ -1,6 +1,5 @@
-#include <signal.h>
-
 #include <u.h>
+#include <signal.h>
 #define NOPLAN9DEFINES
 #include <libc.h>
 #include "9proc.h"
diff --git a/src/lib9/open.c b/src/lib9/open.c
index bb597e8..0356a7d 100644
--- a/src/lib9/open.c
+++ b/src/lib9/open.c
@@ -2,12 +2,9 @@
 #define NOPLAN9DEFINES
 #include <libc.h>
 
-extern char* _p9translate(char*);
-
 int
-p9open(char *xname, int mode)
+p9open(char *name, int mode)
 {
-	char *name;
 	int cexec, rclose;
 	int fd, umode;
 
@@ -23,8 +20,6 @@
 		werrstr("mode not supported");
 		return -1;
 	}
-	if((name = _p9translate(xname)) == nil)
-		return -1;
 	fd = open(name, umode);
 	if(fd >= 0){
 		if(cexec)
@@ -32,7 +27,5 @@
 		if(rclose)
 			remove(name);
 	}
-	if(name != xname)
-		free(name);
 	return fd;
 }
diff --git a/src/lib9/rendez-Linux.c b/src/lib9/rendez-Linux.c
index 05c52ae..673818e 100644
--- a/src/lib9/rendez-Linux.c
+++ b/src/lib9/rendez-Linux.c
@@ -1 +1,3 @@
+/* Could use futex(2) here instead of signals? */
+
 #include "rendez-signal.c"
diff --git a/src/lib9/rendez-OpenBSD.c b/src/lib9/rendez-OpenBSD.c
new file mode 100644
index 0000000..05c52ae
--- /dev/null
+++ b/src/lib9/rendez-OpenBSD.c
@@ -0,0 +1 @@
+#include "rendez-signal.c"
diff --git a/src/lib9/rendez-pthread.c b/src/lib9/rendez-pthread.c
index b4b95f2..fe930ce 100644
--- a/src/lib9/rendez-pthread.c
+++ b/src/lib9/rendez-pthread.c
@@ -32,9 +32,10 @@
  * shared memory and mutexes.
  */
 
+#include <u.h>
 #include <pthread.h>
 #include <signal.h>
-#include <lib9.h>
+#include <libc.h>
 
 enum
 {
diff --git a/src/lib9/time.c b/src/lib9/time.c
index 169a82f..3670636 100644
--- a/src/lib9/time.c
+++ b/src/lib9/time.c
@@ -1,7 +1,7 @@
-#include <sys/time.h>
-#include <sys/resource.h>
-
 #include <u.h>
+#include <sys/time.h>
+#include <time.h>
+#include <sys/resource.h>
 #define NOPLAN9DEFINES
 #include <libc.h>