You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
star/dns/systemdns_unix.go

52 lines
1.1 KiB
Go

//go:build !js && !windows
package dns
import (
"net/netip"
"os"
"strings"
)
func GetDNSServers() (nameservers []netip.AddrPort) {
const filename = "/etc/resolv.conf"
return getLocalNameservers(filename)
}
func getLocalNameservers(filename string) (nameservers []netip.AddrPort) {
const defaultNameserverPort = 53
defaultLocalNameservers := []netip.AddrPort{
netip.AddrPortFrom(netip.AddrFrom4([4]byte{127, 0, 0, 1}), defaultNameserverPort),
netip.AddrPortFrom(netip.AddrFrom16([16]byte{0, 0, 0, 0, 0, 0, 0, 1}), defaultNameserverPort),
}
data, err := os.ReadFile(filename)
if err != nil {
return defaultLocalNameservers
}
lines := strings.Split(string(data), "\n")
for _, line := range lines {
if line == "" {
continue
}
fields := strings.Fields(line)
if len(fields) == 0 || fields[0] != "nameserver" {
continue
}
for _, field := range fields[1:] {
ip, err := netip.ParseAddr(field)
if err != nil {
continue
}
nameservers = append(nameservers,
netip.AddrPortFrom(ip, defaultNameserverPort))
}
}
if len(nameservers) == 0 {
return defaultLocalNameservers
}
return nameservers
}