package net
import (
)
func ( string) *dnsConfig {
:= &dnsConfig{
ndots: 1,
timeout: 5 * time.Second,
attempts: 2,
}
, := open()
if != nil {
.servers = defaultNS
.search = dnsDefaultSearch()
.err =
return
}
defer .close()
if , := .file.Stat(); == nil {
.mtime = .ModTime()
} else {
.servers = defaultNS
.search = dnsDefaultSearch()
.err =
return
}
for , := .readLine(); ; , = .readLine() {
if len() > 0 && ([0] == ';' || [0] == '#') {
continue
}
:= getFields()
if len() < 1 {
continue
}
switch [0] {
case "nameserver":
if len() > 1 && len(.servers) < 3 {
if , := netip.ParseAddr([1]); == nil {
.servers = append(.servers, JoinHostPort([1], "53"))
}
}
case "domain":
if len() > 1 {
.search = []string{ensureRooted([1])}
}
case "search":
.search = make([]string, 0, len()-1)
for := 1; < len(); ++ {
:= ensureRooted([])
if == "." {
continue
}
.search = append(.search, )
}
case "options":
for , := range [1:] {
switch {
case stringslite.HasPrefix(, "ndots:"):
, , := dtoi([6:])
if < 0 {
= 0
} else if > 15 {
= 15
}
.ndots =
case stringslite.HasPrefix(, "timeout:"):
, , := dtoi([8:])
if < 1 {
= 1
}
.timeout = time.Duration() * time.Second
case stringslite.HasPrefix(, "attempts:"):
, , := dtoi([9:])
if < 1 {
= 1
}
.attempts =
case == "rotate":
.rotate = true
case == "single-request" || == "single-request-reopen":
.singleRequest = true
case == "use-vc" || == "usevc" || == "tcp":
.useTCP = true
case == "trust-ad":
.trustAD = true
case == "edns0":
case == "no-reload":
.noReload = true
default:
.unknownOpt = true
}
}
case "lookup":
.lookup = [1:]
default:
.unknownOpt = true
}
}
if len(.servers) == 0 {
.servers = defaultNS
}
if len(.search) == 0 {
.search = dnsDefaultSearch()
}
return
}
func () []string {
, := getHostname()
if != nil {
return nil
}
if := bytealg.IndexByteString(, '.'); >= 0 && < len()-1 {
return []string{ensureRooted([+1:])}
}
return nil
}
func ( string) string {
if len() > 0 && [len()-1] == '.' {
return
}
return + "."
}