| // Copyright 2009 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. | |
| // We require Linux kernel version 2.6.32. The accept4 system call was | |
| // added in version 2.6.28, so in general we can use accept4. | |
| // Unfortunately, for ARM only, accept4 was added in version 2.6.36. | |
| // Handle that case here, by using a copy of the Accept function that | |
| // we used in Go 1.17. | |
| //go:build linux && arm | |
| package syscall | |
| //sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) | |
| func Accept(fd int) (nfd int, sa Sockaddr, err error) { | |
| var rsa RawSockaddrAny | |
| var len _Socklen = SizeofSockaddrAny | |
| // Try accept4 first for Android and newer kernels. | |
| nfd, err = accept4(fd, &rsa, &len, 0) | |
| if err == ENOSYS { | |
| nfd, err = accept(fd, &rsa, &len) | |
| } | |
| if err != nil { | |
| return | |
| } | |
| sa, err = anyToSockaddr(&rsa) | |
| if err != nil { | |
| Close(nfd) | |
| nfd = 0 | |
| } | |
| return | |
| } |