From 56f3e2c3f47e796333d4de2502385a5ef27d049f Mon Sep 17 00:00:00 2001 From: xegineering Date: Thu, 3 Oct 2024 17:28:10 +0200 Subject: Add soundbox.getInterface() This is required as a temporary solution to guess the correct interface. --- interfaces.go | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 interfaces.go diff --git a/interfaces.go b/interfaces.go new file mode 100644 index 0000000..2854b1a --- /dev/null +++ b/interfaces.go @@ -0,0 +1,39 @@ +package soundbox + +import ( + "fmt" + "net" +) + +// getInterface is a function guessing which interface should be used for +// soundbox streaming. This is required since soundbox relies on communication +// via IPv6 link-local addresses which require a specified interface to allow +// communication. This function returns the first interface it finds which is +// up and has a link-local address assigned. +func getInterface() (net.Interface, error) { + all, err := net.Interfaces() + if err != nil { + return net.Interface{}, err + } + + for _, iface := range all { + if iface.Flags & net.FlagUp == 0 { + continue + } + addresses, err := iface.Addrs() + if err != nil { + return net.Interface{}, err + } + for _, addr := range addresses { + ip, _, err := net.ParseCIDR(addr.String()) + if err != nil { + return net.Interface{}, err + } + if ip.IsLinkLocalUnicast() { + return iface, nil + } + } + } + + return net.Interface{}, fmt.Errorf("No interface found for soundbox streaming") +} -- cgit v1.2.3-70-g09d2