From 6dc58c11bdf67fe2159729520188ffeb01ecbac9 Mon Sep 17 00:00:00 2001 From: Miek Gieben Date: Sat, 12 Oct 2013 16:12:21 +0100 Subject: [PATCH] Fix outgoing axfr and make reflect use it. --- ex/reflect/reflect.go | 17 ++++++++++++++++- xfr.go | 7 ++++--- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/ex/reflect/reflect.go b/ex/reflect/reflect.go index 90a49d4c..b41f43f7 100644 --- a/ex/reflect/reflect.go +++ b/ex/reflect/reflect.go @@ -111,6 +111,21 @@ func handleReflect(w dns.ResponseWriter, r *dns.Msg) { case dns.TypeAAAA, dns.TypeA: m.Answer = append(m.Answer, rr) m.Extra = append(m.Extra, t) + + case dns.TypeAXFR, dns.TypeIXFR: + c := make(chan *dns.Envelope) + tr := new(dns.Transfer) + defer close(c) + err := tr.Out(w, r, c) + if err != nil { + return + } + soa, _ := dns.NewRR(`whoami.miek.nl. 0 IN SOA linode.atoom.net. miek.miek.nl. 2009032802 21600 7200 604800 3600`) + c <- &dns.Envelope{RR: []dns.RR{soa, t, rr, soa}} + w.Hijack() + // w.Close() // Client closes connection + return + } if r.IsTsig() != nil { @@ -143,7 +158,7 @@ func serve(net, name, secret string) { } func main() { - runtime.GOMAXPROCS(runtime.NumCPU()*4) + runtime.GOMAXPROCS(runtime.NumCPU() * 4) cpuprofile := flag.String("cpuprofile", "", "write cpu profile to file") printf = flag.Bool("print", false, "print replies") compress = flag.Bool("compress", false, "compress replies") diff --git a/xfr.go b/xfr.go index a7c53dc3..4b29d893 100644 --- a/xfr.go +++ b/xfr.go @@ -149,11 +149,12 @@ func (t *Transfer) inIxfr(id uint16, c chan *Envelope) { } } -func (t *Transfer) Out(w ResponseWriter, q *Msg, a string) (chan *Envelope, error) { - ch := make(chan *Envelope) +func (t *Transfer) Out(w ResponseWriter, q *Msg, ch chan *Envelope) error { r := new(Msg) + // Compress? r.SetReply(q) r.Authoritative = true + go func() { for x := range ch { // assume it fits TODO(miek): fix @@ -165,7 +166,7 @@ func (t *Transfer) Out(w ResponseWriter, q *Msg, a string) (chan *Envelope, erro w.TsigTimersOnly(true) r.Answer = nil }() - return ch, nil + return nil } // ReadMsg reads a message from the transfer connection t.