38 lines
1.1 KiB
Go
38 lines
1.1 KiB
Go
|
// +build go1.11
|
||
|
// +build aix darwin dragonfly freebsd linux netbsd openbsd
|
||
|
|
||
|
package reuseport
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"net"
|
||
|
"syscall"
|
||
|
|
||
|
"github.com/coredns/coredns/plugin/pkg/log"
|
||
|
|
||
|
"golang.org/x/sys/unix"
|
||
|
)
|
||
|
|
||
|
func control(network, address string, c syscall.RawConn) error {
|
||
|
c.Control(func(fd uintptr) {
|
||
|
if err := unix.SetsockoptInt(int(fd), unix.SOL_SOCKET, unix.SO_REUSEPORT, 1); err != nil {
|
||
|
log.Warningf("Failed to set SO_REUSEPORT on socket: %s", err)
|
||
|
}
|
||
|
})
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
// Listen announces on the local network address. See net.Listen for more information.
|
||
|
// If SO_REUSEPORT is available it will be set on the socket.
|
||
|
func Listen(network, addr string) (net.Listener, error) {
|
||
|
lc := net.ListenConfig{Control: control}
|
||
|
return lc.Listen(context.Background(), network, addr)
|
||
|
}
|
||
|
|
||
|
// ListenPacket announces on the local network address. See net.ListenPacket for more information.
|
||
|
// If SO_REUSEPORT is available it will be set on the socket.
|
||
|
func ListenPacket(network, addr string) (net.PacketConn, error) {
|
||
|
lc := net.ListenConfig{Control: control}
|
||
|
return lc.ListenPacket(context.Background(), network, addr)
|
||
|
}
|