mirror of
https://github.com/Control-D-Inc/ctrld.git
synced 2026-02-03 22:18:39 +00:00
copy fix get valid ifaces in nameservers_bsd nameservers on MacOS can be found in resolv.conf reliably nameservers on MacOS can be found in resolv.conf reliably exclude local IPs from MacOS resolve conf check use scutil for MacOS, simplify reinit logic to prevent duplicate calls add more dns server fetching options never skip OS resolver in IsDown check split dsb and darwin nameserver methods, add delay for setting DNS on interface on network change. increase delay to 5s but only on MacOS
61 lines
1.1 KiB
Go
61 lines
1.1 KiB
Go
//go:build dragonfly || freebsd || netbsd || openbsd
|
|
|
|
package ctrld
|
|
|
|
import (
|
|
"net"
|
|
"syscall"
|
|
|
|
"golang.org/x/net/route"
|
|
)
|
|
|
|
func dnsFns() []dnsFn {
|
|
return []dnsFn{dnsFromRIB}
|
|
}
|
|
|
|
func dnsFromRIB() []string {
|
|
var dns []string
|
|
rib, err := route.FetchRIB(syscall.AF_UNSPEC, route.RIBTypeRoute, 0)
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
messages, err := route.ParseRIB(route.RIBTypeRoute, rib)
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
for _, message := range messages {
|
|
message, ok := message.(*route.RouteMessage)
|
|
if !ok {
|
|
continue
|
|
}
|
|
addresses := message.Addrs
|
|
if len(addresses) < 2 {
|
|
continue
|
|
}
|
|
dst, gw := toNetIP(addresses[0]), toNetIP(addresses[1])
|
|
if dst == nil || gw == nil {
|
|
continue
|
|
}
|
|
if gw.IsLoopback() {
|
|
continue
|
|
}
|
|
if dst.Equal(net.IPv4zero) || dst.Equal(net.IPv6zero) {
|
|
dns = append(dns, gw.String())
|
|
}
|
|
}
|
|
return dns
|
|
}
|
|
|
|
func toNetIP(addr route.Addr) net.IP {
|
|
switch t := addr.(type) {
|
|
case *route.Inet4Addr:
|
|
return net.IPv4(t.IP[0], t.IP[1], t.IP[2], t.IP[3])
|
|
case *route.Inet6Addr:
|
|
ip := make(net.IP, net.IPv6len)
|
|
copy(ip, t.IP[:])
|
|
return ip
|
|
default:
|
|
return nil
|
|
}
|
|
}
|