commit - 2cf560f78905b6f035e5eb06dfeae712d2346370
commit + 60703b621feba1f8aff3879589ef37a0b466801a
blob - 2cf269043af39ad5bc96455d62d39b1003a85d18
blob + 488d1259cf272dbd1ab4b106310b589b3a37e1e4
--- cmd/recursor/resolve.go
+++ cmd/recursor/resolve.go
return matches
}
-func nextServerAddrs(resources []dnsmessage.Resource) []net.IP {
- var next []net.IP
- for _, r := range resources {
- switch b := r.Body.(type) {
- case *dnsmessage.AResource:
- next = append(next, net.IP(b.A[:]))
- case *dnsmessage.AAAAResource:
- next = append(next, net.IP(b.AAAA[:]))
- }
- }
- return next
-}
-
func resolveFromRoot(q dnsmessage.Question) (dnsmessage.Message, error) {
return resolve(q, roots, 0)
}
continue
}
if len(rmsg.Answers) > 0 {
- return resolve(q, nextServerAddrs(rmsg.Answers), depth+1)
+ return resolve(q, dns.ExtractIPs(rmsg.Answers), depth+1)
}
- return resolve(q, nextServerAddrs(rmsg.Additionals), depth+1)
+ return resolve(q, dns.ExtractIPs(rmsg.Additionals), depth+1)
default:
return rmsg, fmt.Errorf("unexpected authority resource type %s", a.Header.Type)
}
}
}
- // No real answer, no more servers to ask; return our best guess
- return rmsg, nil
+ // return our best guess anyway
+ return rmsg, fmt.Errorf("resolve %s: no more nameservers to ask", q.Name)
}
blob - c94e6c8eed57383a0421ce6130875cbda6a3c033
blob + 14d4fe846cd63d5fbe3031e0e11446a2b4242c0c
--- server.go
+++ server.go
rmsg.Header.RCode = dnsmessage.RCodeNotImplemented
w.WriteMsg(rmsg)
}
+
+// ExtractIPs extracts any IP addresses from resources. An empty slice is
+// returned if there are no addresses.
+func ExtractIPs(resources []dnsmessage.Resource) []net.IP {
+ var ips []net.IP
+ for _, r := range resources {
+ switch b := r.Body.(type) {
+ case *dnsmessage.AResource:
+ ips = append(ips, net.IP(b.A[:]))
+ case *dnsmessage.AAAAResource:
+ ips = append(ips, net.IP(b.AAAA[:]))
+ }
+ }
+ return ips
+}