summaryrefslogtreecommitdiffstats
path: root/vendor/github.com/google/gops/agent/sockopt_unix.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/google/gops/agent/sockopt_unix.go')
-rw-r--r--vendor/github.com/google/gops/agent/sockopt_unix.go36
1 files changed, 36 insertions, 0 deletions
diff --git a/vendor/github.com/google/gops/agent/sockopt_unix.go b/vendor/github.com/google/gops/agent/sockopt_unix.go
new file mode 100644
index 00000000..7edaf209
--- /dev/null
+++ b/vendor/github.com/google/gops/agent/sockopt_unix.go
@@ -0,0 +1,36 @@
+// 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 !js,!plan9,!windows
+
+package agent
+
+import (
+ "syscall"
+
+ "golang.org/x/sys/unix"
+)
+
+// setsockoptReuseAddrAndPort sets the SO_REUSEADDR and SO_REUSEPORT socket
+// options on c's underlying socket in order to increase the chance to re-bind()
+// to the same address and port upon agent restart.
+func setsockoptReuseAddrAndPort(network, address string, c syscall.RawConn) error {
+ var soerr error
+ if err := c.Control(func(su uintptr) {
+ sock := int(su)
+ // Allow reuse of recently-used addresses. This socket option is
+ // set by default on listeners in Go's net package, see
+ // net.setDefaultSockopts.
+ soerr = unix.SetsockoptInt(sock, unix.SOL_SOCKET, unix.SO_REUSEADDR, 1)
+ if soerr != nil {
+ return
+ }
+ // Allow reuse of recently-used ports. This gives the agent a
+ // better chance to re-bind upon restarts.
+ soerr = unix.SetsockoptInt(sock, unix.SOL_SOCKET, unix.SO_REUSEPORT, 1)
+ }); err != nil {
+ return err
+ }
+ return soerr
+}