fix chaos

Perform the a and aaaa query in parallel
This commit is contained in:
Miek Gieben 2011-07-04 23:33:06 +02:00
parent 5721b8ff79
commit 60c66fa9ad
3 changed files with 46 additions and 35 deletions

View File

@ -1,12 +1,12 @@
EXAMPLES=mx \
q \
chaos \
axfr \
reflect \
xfrprx \
key2ds \
# funkensturm -- need fix
axfr
# these need to be fixed
#q \
#reflect \
#xfrprx \
#funkensturm
all:
for i in $(EXAMPLES); do gomake -C $$i; done

View File

@ -40,35 +40,46 @@ func main() {
}
}
func qhandler(w dns.RequestWriter, m *dns.Msg) {
w.Send(m)
r, _ := w.Receive()
w.Write(r)
}
func addresses(conf *dns.ClientConfig, c *dns.Client, name string) []string {
m := new(dns.Msg)
m.SetQuestion(os.Args[1], dns.TypeA) // Allocates space
dns.HandleQueryFunc(os.Args[1], qhandler)
dns.ListenAndQuery(nil, nil)
m4 := new(dns.Msg)
m4.SetQuestion(os.Args[1], dns.TypeA)
m6 := new(dns.Msg)
m6.SetQuestion(os.Args[1], dns.TypeAAAA)
c.Do(m4, conf.Servers[0]) // Also 1 and 2 (and merge the results??
c.Do(m6, conf.Servers[0])
var ips []string
r := c.Exchange(m, conf.Servers[0])
if r == nil {
fmt.Printf("Nothing recevied for %s\n", name)
return nil
}
if r.Rcode != dns.RcodeSuccess {
return nil
}
for _, a := range r.Answer {
ips = append(ips, a.(*dns.RR_A).A.String()+":53")
}
m.SetQuestion(os.Args[1], dns.TypeAAAA)
r = c.Exchange(m, conf.Servers[0])
if r == nil {
fmt.Printf("Nothing recevied for %s\n", name)
return ips
}
if r.Rcode != dns.RcodeSuccess {
return ips
}
for _, a := range r.Answer {
ips = append(ips, "["+a.(*dns.RR_AAAA).AAAA.String()+"]:53")
}
i := 2 // two outstanding queries
forever:
for {
select {
case r := <-dns.DefaultReplyChan:
if r[1] !=nil && r[1].Rcode == dns.RcodeSuccess {
for _, aa := range r[1].Answer {
switch aa.(type) {
case *dns.RR_A:
ips = append(ips, aa.(*dns.RR_A).A.String()+":53")
case *dns.RR_AAAA:
ips = append(ips, "[" + aa.(*dns.RR_AAAA).AAAA.String()+"]:53")
}
}
} else {
fmt.Printf("Nothing recevied for %s\n", name)
}
i--
if i == 0 {
break forever
}
}
}
return ips
}

View File

@ -27,7 +27,7 @@ func helloMiek(w RequestWriter, r *Msg) {
func TestClientASync(t *testing.T) {
HandleQueryFunc("miek.nl", helloMiek) // All queries for miek.nl will be handled by HelloMiek
ListenAndQuery(nil, nil)
ListenAndQuery(nil, nil) // Detect if this isn't running
m := new(Msg)
m.SetQuestion("miek.nl", TypeSOA)