mirror of
https://github.com/golang/go.git
synced 2025-05-05 15:43:04 +00:00
Our minimum Linux version is 2.6.32, and the accept4 system call was introduced in 2.6.28, so we use accept4 everywhere. Unfortunately, it turns out that the accept4 system call was only added to linux-arm in 2.6.36, so for linux-arm only we need to try the accept4 system call and then fall back to accept if it doesn't work. The code we use on linux-arm is the code we used in Go 1.17. On non-arm platforms we continue using the simpler code introduced in Go 1.18. Adding accept4 to the ARM Linux kernel was: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=21d93e2e29722d7832f61cc56d73fb953ee6578e For #57333 Fixes #57338 Change-Id: I6680cb54dd4d3514a6887dda8906e6708c64459d Reviewed-on: https://go-review.googlesource.com/c/go/+/457997 Reviewed-by: Tobias Klauser <tobias.klauser@gmail.com> Run-TryBot: Ian Lance Taylor <iant@google.com> Reviewed-by: Than McIntosh <thanm@google.com> Reviewed-by: Ian Lance Taylor <iant@google.com> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: David Chase <drchase@google.com> Auto-Submit: Ian Lance Taylor <iant@google.com> Run-TryBot: Ian Lance Taylor <iant@golang.org>
51 lines
1.8 KiB
Go
51 lines
1.8 KiB
Go
// Copyright 2013 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
// This file implements accept for platforms that provide a fast path for
|
|
// setting SetNonblock and CloseOnExec.
|
|
|
|
//go:build dragonfly || freebsd || illumos || (linux && !arm) || netbsd || openbsd
|
|
|
|
package poll
|
|
|
|
import "syscall"
|
|
|
|
// Wrapper around the accept system call that marks the returned file
|
|
// descriptor as nonblocking and close-on-exec.
|
|
func accept(s int) (int, syscall.Sockaddr, string, error) {
|
|
ns, sa, err := Accept4Func(s, syscall.SOCK_NONBLOCK|syscall.SOCK_CLOEXEC)
|
|
// On Linux the accept4 system call was introduced in 2.6.28
|
|
// kernel and on FreeBSD it was introduced in 10 kernel. If we
|
|
// get an ENOSYS error on both Linux and FreeBSD, or EINVAL
|
|
// error on Linux, fall back to using accept.
|
|
switch err {
|
|
case nil:
|
|
return ns, sa, "", nil
|
|
default: // errors other than the ones listed
|
|
return -1, sa, "accept4", err
|
|
case syscall.ENOSYS: // syscall missing
|
|
case syscall.EINVAL: // some Linux use this instead of ENOSYS
|
|
case syscall.EACCES: // some Linux use this instead of ENOSYS
|
|
case syscall.EFAULT: // some Linux use this instead of ENOSYS
|
|
}
|
|
|
|
// See ../syscall/exec_unix.go for description of ForkLock.
|
|
// It is probably okay to hold the lock across syscall.Accept
|
|
// because we have put fd.sysfd into non-blocking mode.
|
|
// However, a call to the File method will put it back into
|
|
// blocking mode. We can't take that risk, so no use of ForkLock here.
|
|
ns, sa, err = AcceptFunc(s)
|
|
if err == nil {
|
|
syscall.CloseOnExec(ns)
|
|
}
|
|
if err != nil {
|
|
return -1, nil, "accept", err
|
|
}
|
|
if err = syscall.SetNonblock(ns, true); err != nil {
|
|
CloseFunc(ns)
|
|
return -1, nil, "setnonblock", err
|
|
}
|
|
return ns, sa, "", nil
|
|
}
|