]> Cypherpunks repositories - gostls13.git/commitdiff
internal/poll, net, syscall: use accept4 on solaris
authorTobias Klauser <tklauser@distanz.ch>
Mon, 2 May 2022 11:57:07 +0000 (13:57 +0200)
committerGopher Robot <gobot@golang.org>
Tue, 3 May 2022 14:38:32 +0000 (14:38 +0000)
Solaris supports accept4 since version 11.4, see
https://docs.oracle.com/cd/E88353_01/html/E37843/accept4-3c.html
Use it in internal/poll.accept like on other platforms.

Change-Id: I3d9830a85e93bbbed60486247c2f91abc646371f
Reviewed-on: https://go-review.googlesource.com/c/go/+/403394
Reviewed-by: Ian Lance Taylor <iant@google.com>
Auto-Submit: Ian Lance Taylor <iant@google.com>
Run-TryBot: Tobias Klauser <tobias.klauser@gmail.com>
Reviewed-by: Benny Siegert <bsiegert@gmail.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Ian Lance Taylor <iant@google.com>

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/runtime/cgo/cgo.go
src/syscall/syscall_illumos.go
src/syscall/syscall_solaris.go
src/syscall/zsyscall_solaris_amd64.go

index c941cb52357938bb7aeac8d263dc307ea5b84a32..5b3cdcec283cb23d58f2d71835c271d45d3b149e 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.
 
-//go:build dragonfly || freebsd || illumos || linux || netbsd || openbsd
+//go:build dragonfly || freebsd || linux || netbsd || openbsd || solaris
 
 package poll
 
index d849fda0b06f87584c16b82d3333025f3e1f1d57..e106b28377b6626ad0531c886ad33ca35cc1bf93 100644 (file)
@@ -5,7 +5,7 @@
 // This file implements accept for platforms that provide a fast path for
 // setting SetNonblock and CloseOnExec.
 
-//go:build dragonfly || freebsd || illumos || linux || netbsd || openbsd
+//go:build dragonfly || freebsd || linux || netbsd || openbsd || solaris
 
 package poll
 
index 312ed24a44bc203645c0c05965719901c30514d9..7cd80019f4064aee59af55052b4eefa90a07e70e 100644 (file)
@@ -5,7 +5,7 @@
 // This file implements accept for platforms that do not provide a fast path for
 // setting SetNonblock and CloseOnExec.
 
-//go:build aix || darwin || (js && wasm) || (solaris && !illumos)
+//go:build aix || darwin || (js && wasm)
 
 package poll
 
index cc7cefbe2c5cf046b35c692cb18b005d39e5f269..d57f44d9ee363c78162e479f6a5c6d9ee30c8d6c 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.
 
-//go:build dragonfly || freebsd || illumos || linux || netbsd || openbsd
+//go:build dragonfly || freebsd || linux || netbsd || openbsd || solaris
 
 package socktest
 
index ca7fc7849137a2d961284913076045d9f38f3b22..6ea99ad6469cc954b8e4489554b37fdd269a3b2f 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.
 
-//go:build dragonfly || freebsd || illumos || linux || netbsd || openbsd
+//go:build dragonfly || freebsd || linux || netbsd || openbsd || solaris
 
 package net
 
index 56dab31b1466a18cb3584671c8e906460f455c16..f4c116502884b978aa59d5db59aa9d3a72c53e8e 100644 (file)
@@ -5,7 +5,7 @@
 // This file implements sysSocket for platforms that provide a fast path for
 // setting SetNonblock and CloseOnExec.
 
-//go:build dragonfly || freebsd || illumos || linux || netbsd || openbsd
+//go:build dragonfly || freebsd || linux || netbsd || openbsd || solaris
 
 package net
 
index 26eac5585a8a29ab301089883a35eba9001d3775..6e61d40c1925314751e531999cd45a53b9ee9ebf 100644 (file)
@@ -5,7 +5,7 @@
 // This file implements sysSocket for platforms that do not provide a fast path
 // for setting SetNonblock and CloseOnExec.
 
-//go:build aix || darwin || (solaris && !illumos)
+//go:build aix || darwin
 
 package net
 
index 8d72d792b1fac592c1037401e5d9dcd5719936f7..298aa6367530cc44ec7c649262979756bdf6786e 100644 (file)
@@ -21,7 +21,7 @@ package cgo
 #cgo openbsd LDFLAGS: -lpthread
 #cgo aix LDFLAGS: -Wl,-berok
 #cgo solaris LDFLAGS: -lxnet
-#cgo illumos LDFLAGS: -lsocket
+#cgo solaris LDFLAGS: -lsocket
 
 #cgo CFLAGS: -Wall -Werror
 
index de6b1600484a8d2e28589f353f32adee89869c86..04f9e7e5d6370d92b798211cbbc2f111b5d898fc 100644 (file)
@@ -10,34 +10,11 @@ package syscall
 
 import "unsafe"
 
-//go:cgo_import_dynamic libc_accept4 accept4 "libsocket.so"
 //go:cgo_import_dynamic libc_flock flock "libc.so"
 
-//go:linkname procAccept4 libc_accept4
 //go:linkname procFlock libc_flock
 
-var (
-       procAccept4,
-       procFlock libcFunc
-)
-
-func Accept4(fd int, flags int) (int, Sockaddr, error) {
-       var rsa RawSockaddrAny
-       var addrlen _Socklen = SizeofSockaddrAny
-       nfd, _, errno := sysvicall6(uintptr(unsafe.Pointer(&procAccept4)), 4, uintptr(fd), uintptr(unsafe.Pointer(&rsa)), uintptr(unsafe.Pointer(&addrlen)), uintptr(flags), 0, 0)
-       if errno != 0 {
-               return 0, nil, errno
-       }
-       if addrlen > SizeofSockaddrAny {
-               panic("RawSockaddrAny too small")
-       }
-       sa, err := anyToSockaddr(&rsa)
-       if err != nil {
-               Close(int(nfd))
-               return 0, nil, err
-       }
-       return int(nfd), sa, nil
-}
+var procFlock libcFunc
 
 func Flock(fd int, how int) error {
        _, _, errno := sysvicall6(uintptr(unsafe.Pointer(&procFlock)), 2, uintptr(fd), uintptr(how), 0, 0, 0, 0)
index e591ae6671a2c5afa3586dbb1e13e36ebd6faa00..0363597c9e45b1edaa12bbe0521f06efd03ba6aa 100644 (file)
@@ -71,6 +71,26 @@ func Pipe2(p []int, flags int) error {
        return err
 }
 
+//sys   accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) = libsocket.accept4
+
+func Accept4(fd int, flags int) (int, Sockaddr, error) {
+       var rsa RawSockaddrAny
+       var addrlen _Socklen = SizeofSockaddrAny
+       nfd, err := accept4(fd, &rsa, &addrlen, flags)
+       if err != nil {
+               return 0, nil, err
+       }
+       if addrlen > SizeofSockaddrAny {
+               panic("RawSockaddrAny too small")
+       }
+       sa, err := anyToSockaddr(&rsa)
+       if err != nil {
+               Close(nfd)
+               return 0, nil, err
+       }
+       return nfd, sa, nil
+}
+
 func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, _Socklen, error) {
        if sa.Port < 0 || sa.Port > 0xFFFF {
                return nil, 0, EINVAL
index 5bb50caaae88b1bfde17ea8c791ceb2d09995547..a2bbeed844915c299091d5a7707d8531e7d82127 100644 (file)
@@ -8,6 +8,7 @@ package syscall
 import "unsafe"
 
 //go:cgo_import_dynamic libc_pipe2 pipe2 "libc.so"
+//go:cgo_import_dynamic libc_accept4 accept4 "libsocket.so"
 //go:cgo_import_dynamic libc_Getcwd getcwd "libc.so"
 //go:cgo_import_dynamic libc_getgroups getgroups "libc.so"
 //go:cgo_import_dynamic libc_setgroups setgroups "libc.so"
@@ -94,6 +95,7 @@ import "unsafe"
 //go:cgo_import_dynamic libc_utimensat utimensat "libc.so"
 
 //go:linkname libc_pipe2 libc_pipe2
+//go:linkname libc_accept4 libc_accept4
 //go:linkname libc_Getcwd libc_Getcwd
 //go:linkname libc_getgroups libc_getgroups
 //go:linkname libc_setgroups libc_setgroups
@@ -183,6 +185,7 @@ type libcFunc uintptr
 
 var (
        libc_pipe2,
+       libc_accept4,
        libc_Getcwd,
        libc_getgroups,
        libc_setgroups,
@@ -281,6 +284,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 accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) {
+       r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&libc_accept4)), 4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0)
+       fd = int(r0)
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func Getcwd(buf []byte) (n int, err error) {
        var _p0 *byte
        if len(buf) > 0 {