diff options
author | xegineering <me@xegineering.eu> | 2024-10-03 17:28:10 +0200 |
---|---|---|
committer | xegineering <me@xegineering.eu> | 2024-10-03 20:00:04 +0200 |
commit | 56f3e2c3f47e796333d4de2502385a5ef27d049f (patch) | |
tree | d35490c559a6b6b0b2f9a58d20ceef30ae9eb244 | |
parent | 9c81db35038fa96de6b3fda0695a463bbf69ac01 (diff) | |
download | soundbox-go-56f3e2c3f47e796333d4de2502385a5ef27d049f.tar soundbox-go-56f3e2c3f47e796333d4de2502385a5ef27d049f.tar.zst soundbox-go-56f3e2c3f47e796333d4de2502385a5ef27d049f.zip |
Add soundbox.getInterface()
This is required as a temporary solution to guess the correct interface.
-rw-r--r-- | interfaces.go | 39 |
1 files changed, 39 insertions, 0 deletions
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") +} |