From 1d8fe19359b6f308806a2773713bfde7f13ddf29 Mon Sep 17 00:00:00 2001 From: jwntree <84563040+jwntree@users.noreply.github.com> Date: Mon, 4 Aug 2025 23:27:16 +0900 Subject: [PATCH] Add reuseport support for Solaris (#2046) --- reuseport/reuseport.go | 2 +- reuseport/reuseport_solaris.go | 31 +++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 reuseport/reuseport_solaris.go diff --git a/reuseport/reuseport.go b/reuseport/reuseport.go index ef6dea4..741bb1b 100644 --- a/reuseport/reuseport.go +++ b/reuseport/reuseport.go @@ -1,4 +1,4 @@ -//go:build !windows && !aix +//go:build !windows && !aix && !solaris // Package reuseport provides TCP net.Listener with SO_REUSEPORT support. // diff --git a/reuseport/reuseport_solaris.go b/reuseport/reuseport_solaris.go new file mode 100644 index 0000000..18422e5 --- /dev/null +++ b/reuseport/reuseport_solaris.go @@ -0,0 +1,31 @@ +//go:build solaris + +package reuseport + +import ( + "context" + "net" + "syscall" + + "golang.org/x/sys/unix" +) + +const ( + _SO_REUSEPORT = 0x100e +) + +var listenConfig = net.ListenConfig{ + Control: func(network, address string, c syscall.RawConn) (err error) { + return c.Control(func(fd uintptr) { + err = unix.SetsockoptInt(int(fd), unix.SOL_SOCKET, unix.SO_REUSEADDR, 1) + if err == nil { + err = unix.SetsockoptInt(int(fd), unix.SOL_SOCKET, _SO_REUSEPORT, 1) + } + }) + }, +} + +// Listen returns a TCP listener with the SO_REUSEADDR and SO_REUSEPORT options set. +func Listen(network, addr string) (net.Listener, error) { + return listenConfig.Listen(context.Background(), network, addr) +}