1 // Copyright 2013 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
5 // This file implements sysSocket and accept for platforms that do not
6 // provide a fast path for setting SetNonblock and CloseOnExec.
8 // +build darwin dragonfly nacl netbsd openbsd solaris
17 // Wrapper around the socket system call that marks the returned file
18 // descriptor as nonblocking and close-on-exec.
19 func sysSocket(family
, sotype
, proto
int) (int, error
) {
20 // See ../syscall/exec_unix.go for description of ForkLock.
21 syscall
.ForkLock
.RLock()
22 s
, err
:= socketFunc(family
, sotype
, proto
)
24 syscall
.CloseOnExec(s
)
26 syscall
.ForkLock
.RUnlock()
28 return -1, os
.NewSyscallError("socket", err
)
30 if err
= syscall
.SetNonblock(s
, true); err
!= nil {
32 return -1, os
.NewSyscallError("setnonblock", err
)
37 // Wrapper around the accept system call that marks the returned file
38 // descriptor as nonblocking and close-on-exec.
39 func accept(s
int) (int, syscall
.Sockaddr
, error
) {
40 // See ../syscall/exec_unix.go for description of ForkLock.
41 // It is probably okay to hold the lock across syscall.Accept
42 // because we have put fd.sysfd into non-blocking mode.
43 // However, a call to the File method will put it back into
44 // blocking mode. We can't take that risk, so no use of ForkLock here.
45 ns
, sa
, err
:= acceptFunc(s
)
47 syscall
.CloseOnExec(ns
)
50 return -1, nil, os
.NewSyscallError("accept", err
)
52 if err
= syscall
.SetNonblock(ns
, true); err
!= nil {
54 return -1, nil, os
.NewSyscallError("setnonblock", err
)