}
// goLookupPTR is the native Go implementation of LookupAddr.
-// Used only if cgoLookupPTR refuses to handle the request (that is,
-// only if cgoLookupPTR is the stub in cgo_stub.go).
-// Normally we let cgo use the C library resolver instead of depending
-// on our lookup code, so that Go and C get the same answers.
-func (r *Resolver) goLookupPTR(ctx context.Context, addr string, conf *dnsConfig) ([]string, error) {
- names := lookupStaticAddr(addr)
- if len(names) > 0 {
- return names, nil
+func (r *Resolver) goLookupPTR(ctx context.Context, addr string, order hostLookupOrder, conf *dnsConfig) ([]string, error) {
+ if order == hostLookupFiles || order == hostLookupFilesDNS {
+ names := lookupStaticAddr(addr)
+ if len(names) > 0 {
+ return names, nil
+ }
+
+ if order == hostLookupFiles {
+ return nil, &DNSError{Err: errNoSuchHost.Error(), Name: addr, IsNotFound: true}
+ }
}
+
arpa, err := reverseaddr(addr)
if err != nil {
return nil, err
}
p, server, err := r.lookup(ctx, arpa, dnsmessage.TypePTR, conf)
if err != nil {
+ var dnsErr *DNSError
+ if errors.As(err, &dnsErr) && dnsErr.IsNotFound {
+ if order == hostLookupDNSFiles {
+ names := lookupStaticAddr(addr)
+ if len(names) > 0 {
+ return names, nil
+ }
+ }
+ }
return nil, err
}
var ptrs []string
ptrs = append(ptrs, ptr.PTR.String())
}
+
return ptrs, nil
}
}
func (r *Resolver) lookupAddr(ctx context.Context, addr string) (name []string, err error) {
- if _, conf, preferGo := r.preferGoOverPlan9WithOrderAndConf(); preferGo {
- return r.goLookupPTR(ctx, addr, conf)
+ if order, conf, preferGo := r.preferGoOverPlan9WithOrderAndConf(); preferGo {
+ return r.goLookupPTR(ctx, addr, order, conf)
}
arpa, err := reverseaddr(addr)
if err != nil {
if order == hostLookupCgo {
return cgoLookupPTR(ctx, addr)
}
- return r.goLookupPTR(ctx, addr, conf)
+ return r.goLookupPTR(ctx, addr, order, conf)
}
// concurrentThreadsLimit returns the number of threads we permit to
}
func (r *Resolver) lookupAddr(ctx context.Context, addr string) ([]string, error) {
- if r.preferGoOverWindows() {
- return r.goLookupPTR(ctx, addr, nil)
+ if order, conf := systemConf().hostLookupOrder(r, ""); order != hostLookupCgo {
+ return r.goLookupPTR(ctx, addr, order, conf)
}
// TODO(bradfitz): finish ctx plumbing. Nothing currently depends on this.