From 7f24142b7b289df7e98ed3e1ccd673824dd1d0ee Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Wed, 16 Sep 2020 22:15:13 +0200 Subject: syscall, cmd/go/internal/lockedfile/internal/filelock: add and use Flock on illumos Copy the syscall wrapper from golang.org/x/sys/unix CL 255377 to provide Flock on illumos and switch cmd/go/internal/lockedfile/internal/filelock to use it. Fixes #35618 Change-Id: I876a2b782329a988fa85361fb1ea58eb6f329af1 Reviewed-on: https://go-review.googlesource.com/c/go/+/255258 Trust: Tobias Klauser Run-TryBot: Tobias Klauser TryBot-Result: Go Bot Reviewed-by: Bryan C. Mills --- src/syscall/syscall_illumos.go | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 src/syscall/syscall_illumos.go (limited to 'src/syscall/syscall_illumos.go') diff --git a/src/syscall/syscall_illumos.go b/src/syscall/syscall_illumos.go new file mode 100644 index 0000000000..1484337e1b --- /dev/null +++ b/src/syscall/syscall_illumos.go @@ -0,0 +1,25 @@ +// Copyright 2020 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. + +// +build illumos + +// Illumos system calls not present on Solaris. + +package syscall + +import "unsafe" + +//go:cgo_import_dynamic libc_flock flock "libc.so" + +//go:linkname procFlock libc_flock + +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) + if errno != 0 { + return errno + } + return nil +} -- cgit v1.3 From 9cec50f50c29f5ef7264bf06ee7ac0991b4b36d6 Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Fri, 16 Oct 2020 19:35:09 +0200 Subject: internal/poll, net, syscall: use accept4 on illumos Illumos supports the accept4 syscall, use it in internal/poll.accept like on other platforms. Add Accept4 to package syscall despite the package being frozen. The other option would have been to add this to internal/syscall/unix, but adding it to syscall avoids duplicating a lot of code in internal/poll and net/internal/socktest. Also, all other platforms supporting the accept4 syscall already export Accept4. Follow CL 97196, CL 40895 and CL 94295 Change-Id: I13b32f0163a683840c02b16722730d9dfdb98f56 Reviewed-on: https://go-review.googlesource.com/c/go/+/256101 Trust: Tobias Klauser Run-TryBot: Tobias Klauser TryBot-Result: Go Bot Reviewed-by: Brad Fitzpatrick --- src/internal/poll/hook_cloexec.go | 2 +- src/internal/poll/sock_cloexec.go | 2 +- src/internal/poll/sys_cloexec.go | 2 +- src/net/internal/socktest/sys_cloexec.go | 2 +- src/net/main_cloexec_test.go | 2 +- src/net/sock_cloexec.go | 2 +- src/net/sys_cloexec.go | 2 +- src/runtime/cgo/cgo.go | 1 + src/syscall/syscall_illumos.go | 25 ++++++++++++++++++++++++- 9 files changed, 32 insertions(+), 8 deletions(-) (limited to 'src/syscall/syscall_illumos.go') diff --git a/src/internal/poll/hook_cloexec.go b/src/internal/poll/hook_cloexec.go index 5c93bdaf6c..5fd5449bb0 100644 --- a/src/internal/poll/hook_cloexec.go +++ b/src/internal/poll/hook_cloexec.go @@ -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 netbsd openbsd +// +build dragonfly freebsd illumos linux netbsd openbsd package poll diff --git a/src/internal/poll/sock_cloexec.go b/src/internal/poll/sock_cloexec.go index 691cb8e36f..ff7982ca9e 100644 --- a/src/internal/poll/sock_cloexec.go +++ b/src/internal/poll/sock_cloexec.go @@ -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 netbsd openbsd +// +build dragonfly freebsd illumos linux netbsd openbsd package poll diff --git a/src/internal/poll/sys_cloexec.go b/src/internal/poll/sys_cloexec.go index 7b87f136df..4b3c642173 100644 --- a/src/internal/poll/sys_cloexec.go +++ b/src/internal/poll/sys_cloexec.go @@ -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 aix darwin js,wasm solaris +// +build aix darwin js,wasm solaris,!illumos package poll diff --git a/src/net/internal/socktest/sys_cloexec.go b/src/net/internal/socktest/sys_cloexec.go index 986d89471b..421352c7b4 100644 --- a/src/net/internal/socktest/sys_cloexec.go +++ b/src/net/internal/socktest/sys_cloexec.go @@ -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 netbsd openbsd +// +build dragonfly freebsd illumos linux netbsd openbsd package socktest diff --git a/src/net/main_cloexec_test.go b/src/net/main_cloexec_test.go index 5398f9eae1..46b9ba5008 100644 --- a/src/net/main_cloexec_test.go +++ b/src/net/main_cloexec_test.go @@ -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 netbsd openbsd +// +build dragonfly freebsd illumos linux netbsd openbsd package net diff --git a/src/net/sock_cloexec.go b/src/net/sock_cloexec.go index 0c883dc338..5f345f0f4a 100644 --- a/src/net/sock_cloexec.go +++ b/src/net/sock_cloexec.go @@ -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 netbsd openbsd +// +build dragonfly freebsd illumos linux netbsd openbsd package net diff --git a/src/net/sys_cloexec.go b/src/net/sys_cloexec.go index 89aad7066a..967b8bea9d 100644 --- a/src/net/sys_cloexec.go +++ b/src/net/sys_cloexec.go @@ -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 aix darwin solaris +// +build aix darwin solaris,!illumos package net diff --git a/src/runtime/cgo/cgo.go b/src/runtime/cgo/cgo.go index c02b837978..4d2caf6c4f 100644 --- a/src/runtime/cgo/cgo.go +++ b/src/runtime/cgo/cgo.go @@ -21,6 +21,7 @@ package cgo #cgo openbsd LDFLAGS: -lpthread #cgo aix LDFLAGS: -Wl,-berok #cgo solaris LDFLAGS: -lxnet +#cgo illumos LDFLAGS: -lsocket // Issue 35247. #cgo darwin CFLAGS: -Wno-nullability-completeness diff --git a/src/syscall/syscall_illumos.go b/src/syscall/syscall_illumos.go index 1484337e1b..d70a436d13 100644 --- a/src/syscall/syscall_illumos.go +++ b/src/syscall/syscall_illumos.go @@ -10,11 +10,34 @@ 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 procFlock libcFunc +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 +} func Flock(fd int, how int) error { _, _, errno := sysvicall6(uintptr(unsafe.Pointer(&procFlock)), 2, uintptr(fd), uintptr(how), 0, 0, 0, 0) -- cgit v1.3