]> Cypherpunks.ru repositories - gostls13.git/commitdiff
net, internal/poll, net/internal/socktest: set SOCK_{CLOEXEC,NONBLOCK} atomically...
authorTobias Klauser <tklauser@distanz.ch>
Thu, 15 Feb 2018 11:20:27 +0000 (12:20 +0100)
committerTobias Klauser <tobias.klauser@gmail.com>
Thu, 15 Feb 2018 17:07:12 +0000 (17:07 +0000)
NetBSD supports the SOCK_CLOEXEC and SOCK_NONBLOCK flags to the socket
syscall since version 6.0. The same version also introduced the paccept
syscall which can be used to implement syscall.Accept4.

Follows CL 40895

Change-Id: I9e4e1829b0382744c7799f4e58929a53b4e193f7
Reviewed-on: https://go-review.googlesource.com/94295
Run-TryBot: Tobias Klauser <tobias.klauser@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Benny Siegert <bsiegert@gmail.com>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
15 files changed:
src/internal/poll/hook_cloexec.go
src/internal/poll/sock_cloexec.go
src/internal/poll/sys_cloexec.go
src/net/internal/socktest/sys_cloexec.go
src/net/main_cloexec_test.go
src/net/sock_cloexec.go
src/net/sys_cloexec.go
src/syscall/syscall_netbsd.go
src/syscall/types_netbsd.go
src/syscall/zsyscall_netbsd_386.go
src/syscall/zsyscall_netbsd_amd64.go
src/syscall/zsyscall_netbsd_arm.go
src/syscall/ztypes_netbsd_386.go
src/syscall/ztypes_netbsd_amd64.go
src/syscall/ztypes_netbsd_arm.go

index 73df6ed6beb737d150e064c4e4b12fb63b33b2b4..4b670b9d0ec8c1140bf75435352a7cdcc0b11ded 100644 (file)
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build dragonfly freebsd linux
+// +build dragonfly freebsd linux netbsd
 
 package poll
 
index 0d5c8bdabf7ae5f1476aaeb7e279fad929ed99cf..e46b4d3032373ae642eb81313dd80ba0958fe19e 100644 (file)
@@ -5,7 +5,7 @@
 // This file implements sysSocket and accept for platforms that
 // provide a fast path for setting SetNonblock and CloseOnExec.
 
-// +build dragonfly freebsd linux
+// +build dragonfly freebsd linux netbsd
 
 package poll
 
index 9ed35bdaf41e76eedfd995038cb70b9fcbf6141f..4755dc3e5365e52a84129555e60a246759090431 100644 (file)
@@ -5,7 +5,7 @@
 // This file implements sysSocket and accept for platforms that do not
 // provide a fast path for setting SetNonblock and CloseOnExec.
 
-// +build darwin nacl netbsd openbsd solaris
+// +build darwin nacl openbsd solaris
 
 package poll
 
index d1b8f4f374998e220fc312023479e7599b8005a5..3d70a4f026c76b4efe0a5dde69c57bfbc1155166 100644 (file)
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build dragonfly freebsd linux
+// +build dragonfly freebsd linux netbsd
 
 package socktest
 
index fa1ed0205723b2f9a570dad0bc5b761a817bfe4c..c35c3b2673d3d5dad15d77e7b294dde5b01d4104 100644 (file)
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build dragonfly freebsd linux
+// +build dragonfly freebsd linux netbsd
 
 package net
 
index 06ff10d834a50f33724297c22d9f6b7474e2e790..e224a5fb41f20b4a57c3523f511d2c403be61f08 100644 (file)
@@ -5,7 +5,7 @@
 // This file implements sysSocket and accept for platforms that
 // provide a fast path for setting SetNonblock and CloseOnExec.
 
-// +build dragonfly freebsd linux
+// +build dragonfly freebsd linux netbsd
 
 package net
 
index c4dc6c75ee5e82979a2c6a8157bd332abcca75a5..fe6b0cc764cf43ff6268abe375e5b2133edc40e0 100644 (file)
@@ -5,7 +5,7 @@
 // This file implements sysSocket and accept for platforms that do not
 // provide a fast path for setting SetNonblock and CloseOnExec.
 
-// +build darwin nacl netbsd openbsd solaris
+// +build darwin nacl openbsd solaris
 
 package net
 
index 90837e01f95d6afa72e4b846912ca586c6896179..ef8f9bcc51968750f79350437145f03f3f5d6948 100644 (file)
@@ -118,6 +118,25 @@ func Pipe2(p []int, flags int) error {
        return err
 }
 
+//sys paccept(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, sigmask *sigset, flags int) (nfd int, err error)
+func Accept4(fd, flags int) (nfd int, sa Sockaddr, err error) {
+       var rsa RawSockaddrAny
+       var len _Socklen = SizeofSockaddrAny
+       nfd, err = paccept(fd, &rsa, &len, nil, flags)
+       if err != nil {
+               return
+       }
+       if len > SizeofSockaddrAny {
+               panic("RawSockaddrAny too small")
+       }
+       sa, err = anyToSockaddr(&rsa)
+       if err != nil {
+               Close(nfd)
+               nfd = 0
+       }
+       return
+}
+
 //sys getdents(fd int, buf []byte) (n int, err error)
 func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {
        return getdents(fd, buf)
index c3497564d9d7bc978e3939e8823ce51819442ddc..30ab2dc8458123d7423cf9a4ffbd3421b37b387f 100644 (file)
@@ -242,3 +242,7 @@ type Termios C.struct_termios
 // Sysctl
 
 type Sysctlnode C.struct_sysctlnode
+
+// Signals
+
+type sigset C.sigset_t
index 156292a84ecb4daf4b3cbf758b46369b85771842..aeb8bd6bc46fbb26a312c38adc1372f5144977b8 100644 (file)
@@ -271,6 +271,17 @@ func pipe2(p *[2]_C_int, flags int) (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func paccept(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, sigmask *sigset, flags int) (nfd int, err error) {
+       r0, _, e1 := Syscall6(SYS_PACCEPT, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(unsafe.Pointer(sigmask)), uintptr(flags), 0)
+       nfd = int(r0)
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func getdents(fd int, buf []byte) (n int, err error) {
        var _p0 unsafe.Pointer
        if len(buf) > 0 {
index 1af62b715e1564f4275332862123e5a9f78f6f2c..a4de16438234a4ce01f160f467d2969573cc218d 100644 (file)
@@ -271,6 +271,17 @@ func pipe2(p *[2]_C_int, flags int) (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func paccept(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, sigmask *sigset, flags int) (nfd int, err error) {
+       r0, _, e1 := Syscall6(SYS_PACCEPT, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(unsafe.Pointer(sigmask)), uintptr(flags), 0)
+       nfd = int(r0)
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func getdents(fd int, buf []byte) (n int, err error) {
        var _p0 unsafe.Pointer
        if len(buf) > 0 {
index b03b19169e2f699086e31d6d7791ff5fef22e59d..1b33ea1918c80841efa4951971b956dd5c1383fd 100644 (file)
@@ -271,6 +271,17 @@ func pipe2(p *[2]_C_int, flags int) (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func paccept(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, sigmask *sigset, flags int) (nfd int, err error) {
+       r0, _, e1 := Syscall6(SYS_PACCEPT, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(unsafe.Pointer(sigmask)), uintptr(flags), 0)
+       nfd = int(r0)
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func getdents(fd int, buf []byte) (n int, err error) {
        var _p0 unsafe.Pointer
        if len(buf) > 0 {
index 009c55d1f2a411019b49786214a3a070d367e3fd..737abb87c767c364fd3705db5b6ec1053c5ad031 100644 (file)
@@ -402,3 +402,7 @@ type Sysctlnode struct {
        X_sysctl_parent [8]byte
        X_sysctl_desc   [8]byte
 }
+
+type sigset struct {
+       X__bits [4]uint32
+}
index f807d984ec881e3b2c3be2bb0508ba138362b345..cf059f79ffeab39adc602fcf130f243639e2d07d 100644 (file)
@@ -409,3 +409,7 @@ type Sysctlnode struct {
        X_sysctl_parent [8]byte
        X_sysctl_desc   [8]byte
 }
+
+type sigset struct {
+       X__bits [4]uint32
+}
index 119903f817cc97acdfd5d2ef1a02167abeed6d34..c532b3a7af50170ea65f520267c8b0b0f237b081 100644 (file)
@@ -407,3 +407,7 @@ type Sysctlnode struct {
        X_sysctl_parent [8]byte
        X_sysctl_desc   [8]byte
 }
+
+type sigset struct {
+       X__bits [4]uint32
+}