diff options
Diffstat (limited to 'src/pkg/syscall/syscall_bsd.go')
-rw-r--r-- | src/pkg/syscall/syscall_bsd.go | 48 |
1 files changed, 35 insertions, 13 deletions
diff --git a/src/pkg/syscall/syscall_bsd.go b/src/pkg/syscall/syscall_bsd.go index c1a822aa1..a1e0d153f 100644 --- a/src/pkg/syscall/syscall_bsd.go +++ b/src/pkg/syscall/syscall_bsd.go @@ -20,6 +20,7 @@ import ( /* * Pseudo-system calls */ + // The const provides a compile-time constant so clients // can adjust to whether there is a working Getwd and avoid // even linking this function into the binary. See ../os/getwd.go. @@ -304,6 +305,14 @@ func Accept(fd int) (nfd int, sa Sockaddr, err error) { if err != nil { return } + if runtime.GOOS == "darwin" && len == 0 { + // Accepted socket has no address. + // This is likely due to a bug in xnu kernels, + // where instead of ECONNABORTED error socket + // is accepted, but has no address. + Close(nfd) + return 0, nil, ECONNABORTED + } sa, err = anyToSockaddr(&rsa) if err != nil { Close(nfd) @@ -354,10 +363,15 @@ func Socket(domain, typ, proto int) (fd int, err error) { return } -//sysnb socketpair(domain int, typ int, proto int, fd *[2]int) (err error) +//sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) func Socketpair(domain, typ, proto int) (fd [2]int, err error) { - err = socketpair(domain, typ, proto, &fd) + var fdx [2]int32 + err = socketpair(domain, typ, proto, &fdx) + if err == nil { + fd[0] = int(fdx[0]) + fd[1] = int(fdx[1]) + } return } @@ -437,7 +451,9 @@ func Recvfrom(fd int, p []byte, flags int) (n int, from Sockaddr, err error) { if n, err = recvfrom(fd, p, flags, &rsa, &len); err != nil { return } - from, err = anyToSockaddr(&rsa) + if rsa.Addr.Family != AF_UNSPEC { + from, err = anyToSockaddr(&rsa) + } return } @@ -553,16 +569,7 @@ func Sysctl(name string) (value string, err error) { return "", err } if n == 0 { - // TODO(jsing): Remove after OpenBSD 5.2 release. - // Work around a bug that was fixed after OpenBSD 5.0. - // The length for kern.hostname and kern.domainname is always - // returned as 0 when a nil value is passed for oldp. - if runtime.GOOS == "openbsd" && (name == "kern.hostname" || name == "kern.domainname") { - // MAXHOSTNAMELEN - n = 256 - } else { - return "", nil - } + return "", nil } // Read into buffer of that size. @@ -605,6 +612,21 @@ func Utimes(path string, tv []Timeval) (err error) { return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) } +func UtimesNano(path string, ts []Timespec) error { + // TODO: The BSDs can do utimensat with SYS_UTIMENSAT but it + // isn't supported by darwin so this uses utimes instead + if len(ts) != 2 { + return EINVAL + } + // Not as efficient as it could be because Timespec and + // Timeval have different types in the different OSes + tv := [2]Timeval{ + NsecToTimeval(TimespecToNsec(ts[0])), + NsecToTimeval(TimespecToNsec(ts[1])), + } + return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) +} + //sys futimes(fd int, timeval *[2]Timeval) (err error) func Futimes(fd int, tv []Timeval) (err error) { if len(tv) != 2 { |