add os.ForkExec, os.Exec, os.Wait, exec.OpenCmd.
as thread-safe as possible, given the surrounding system.
add stub RWLock implementation.

R=r
DELTA=852  (834 added, 6 deleted, 12 changed)
OCL=25046
CL=25053
diff --git a/src/lib/net/fd.go b/src/lib/net/fd.go
index 1ec0d8a..0c7770c 100644
--- a/src/lib/net/fd.go
+++ b/src/lib/net/fd.go
@@ -280,17 +280,26 @@
 		return nil, os.EINVAL
 	}
 
+	// See ../syscall/exec.go for description of ForkLock.
+	// It is okay to hold the lock across syscall.Accept
+	// because we have put fd.fd into non-blocking mode.
+	syscall.ForkLock.RLock();
 	var s, e int64;
 	for {
 		s, e = syscall.Accept(fd.fd, sa);
 		if e != syscall.EAGAIN {
 			break;
 		}
+		syscall.ForkLock.RUnlock();
 		pollserver.WaitRead(fd);
+		syscall.ForkLock.RLock();
 	}
 	if e != 0 {
+		syscall.ForkLock.RUnlock();
 		return nil, os.ErrnoToError(e)
 	}
+	syscall.CloseOnExec(s);
+	syscall.ForkLock.RUnlock();
 
 	raddr, err1 := sockaddrToHostPort(sa);
 	if err1 != nil {