package cdns import ( "errors" "fmt" "log" "github.com/miekg/dns" ) func localQuery(mychan chan DNSreply, qname string, qtype uint16) { if debug { fmt.Printf("DEBUG: start of DNS request \"%s\" / %d\n", qname, qtype) } var result DNSreply result.qname = qname result.qtype = qtype result.r = nil result.err = errors.New("no name server to answer the question") localm := new(dns.Msg) localm.Id = dns.Id() localm.RecursionDesired = true localm.Question = make([]dns.Question, 1) localm.SetEdns0(bufsize, false) // Even if no EDNS requested, see #9 May be we should retry without it if timeout? localm.Question[0] = dns.Question{Name: qname, Qtype: qtype, Qclass: dns.ClassINET} for _, server := range conf.Servers { result.nameserver = server localc := &dns.Client{ReadTimeout: timeout} // Brackets are required for IPv6; do not use net.JoinHostPort (see check-soa commit 3e4edb1). r, rtt, err := localc.Exchange(localm, "["+server+"]:"+conf.Port) if err != nil || r == nil { result.r = nil result.err = err if err != nil { log.Println(err) } continue } result.rtt = rtt if r.Rcode == dns.RcodeSuccess { result.r = r result.err = nil break } result.r = r result.err = errors.New(dns.RcodeToString[r.Rcode]) break } if debug { fmt.Printf("DEBUG: end of DNS request \"%s\" / %d\n", qname, qtype) } mychan <- result }