From 09f1553e4034acb531dc1fc7c693d3b8a8f60fce Mon Sep 17 00:00:00 2001 From: Alex X Date: Wed, 11 Oct 2023 11:31:37 +0300 Subject: [PATCH] Fix SO_REUSEPORT for macOS #626 --- pkg/mdns/syscall_darwin.go | 24 +++++++++++++++++++++++ pkg/mdns/{syscall.go => syscall_linux.go} | 6 +++--- 2 files changed, 27 insertions(+), 3 deletions(-) create mode 100644 pkg/mdns/syscall_darwin.go rename pkg/mdns/{syscall.go => syscall_linux.go} (86%) diff --git a/pkg/mdns/syscall_darwin.go b/pkg/mdns/syscall_darwin.go new file mode 100644 index 00000000..c1f1225b --- /dev/null +++ b/pkg/mdns/syscall_darwin.go @@ -0,0 +1,24 @@ +package mdns + +import ( + "syscall" +) + +func SetsockoptInt(fd uintptr, level, opt int, value int) (err error) { + // change SO_REUSEADDR and REUSEPORT flags simultaneously for BSD-like OS + // https://github.com/AlexxIT/go2rtc/issues/626 + // https://stackoverflow.com/questions/14388706/how-do-so-reuseaddr-and-so-reuseport-differ/14388707 + if opt == syscall.SO_REUSEADDR { + if err = syscall.SetsockoptInt(int(fd), level, opt, value); err != nil { + return + } + + opt = syscall.SO_REUSEPORT + } + + return syscall.SetsockoptInt(int(fd), level, opt, value) +} + +func SetsockoptIPMreq(fd uintptr, level, opt int, mreq *syscall.IPMreq) (err error) { + return syscall.SetsockoptIPMreq(int(fd), level, opt, mreq) +} diff --git a/pkg/mdns/syscall.go b/pkg/mdns/syscall_linux.go similarity index 86% rename from pkg/mdns/syscall.go rename to pkg/mdns/syscall_linux.go index f678b684..fc0caeb0 100644 --- a/pkg/mdns/syscall.go +++ b/pkg/mdns/syscall_linux.go @@ -1,8 +1,8 @@ -//go:build darwin || linux - package mdns -import "syscall" +import ( + "syscall" +) func SetsockoptInt(fd uintptr, level, opt int, value int) (err error) { return syscall.SetsockoptInt(int(fd), level, opt, value)