net, syscall: use accept4 and SOCK_CLOEXEC on Linux

R=golang-dev, bradfitz, mikioh.mikioh, dave, minux.ma
CC=golang-dev
https://golang.org/cl/7227043
diff --git a/src/pkg/net/fd_unix.go b/src/pkg/net/fd_unix.go
index cfe6df2..e9d2e41 100644
--- a/src/pkg/net/fd_unix.go
+++ b/src/pkg/net/fd_unix.go
@@ -298,9 +298,6 @@
 }
 
 func newFD(fd, family, sotype int, net string) (*netFD, error) {
-	if err := syscall.SetNonblock(fd, true); err != nil {
-		return nil, err
-	}
 	netfd := &netFD{
 		sysfd:  fd,
 		family: family,
@@ -615,16 +612,11 @@
 	}
 	defer fd.decref()
 
-	// See ../syscall/exec_unix.go for description of ForkLock.
-	// It is okay to hold the lock across syscall.Accept
-	// because we have put fd.sysfd into non-blocking mode.
 	var s int
 	var rsa syscall.Sockaddr
 	for {
-		syscall.ForkLock.RLock()
-		s, rsa, err = syscall.Accept(fd.sysfd)
+		s, rsa, err = accept(fd.sysfd)
 		if err != nil {
-			syscall.ForkLock.RUnlock()
 			if err == syscall.EAGAIN {
 				if err = fd.pollServer.WaitRead(fd); err == nil {
 					continue
@@ -638,8 +630,6 @@
 		}
 		break
 	}
-	syscall.CloseOnExec(s)
-	syscall.ForkLock.RUnlock()
 
 	if netfd, err = newFD(s, fd.family, fd.sotype, fd.net); err != nil {
 		closesocket(s)