From 77d78f321851f528049d8a7914e06c36384888d1 Mon Sep 17 00:00:00 2001 From: Miek Gieben Date: Fri, 11 Oct 2013 22:34:04 +0100 Subject: [PATCH] More xfr fixes, does not work yet --- client.go | 6 ++++-- ex/q/q.go | 57 +++++++++++++++++++++++++++++-------------------------- xfr.go | 12 ++++-------- 3 files changed, 38 insertions(+), 37 deletions(-) diff --git a/client.go b/client.go index 562eea91..de759fbd 100644 --- a/client.go +++ b/client.go @@ -14,7 +14,7 @@ import ( const dnsTimeout time.Duration = 2 * 1e9 -// A Conn represents a connection (which may be short lived) to a DNS server. +// A Conn represents a connection to a DNS server. type Conn struct { net.Conn // a net.Conn holding the connection UDPSize uint16 // Minimum receive buffer for UDP messages @@ -124,6 +124,8 @@ func (c *Client) exchange(m *Msg, a string) (r *Msg, rtt time.Duration, err erro } // ReadMsg reads a message from the connection co. +// If the received message contains a TSIG record the transaction +// signature is verified. func (co *Conn) ReadMsg() (*Msg, error) { var p []byte m := new(Msg) @@ -198,7 +200,7 @@ func (co *Conn) Read(p []byte) (n int, err error) { return n, err } -// WriteMsg send a message throught the connection co. +// WriteMsg sends a message throught the connection co. // If the message m contains a TSIG record the transaction // signature is calculated. func (co *Conn) WriteMsg(m *Msg) (err error) { diff --git a/ex/q/q.go b/ex/q/q.go index 22031298..eba8d8ee 100644 --- a/ex/q/q.go +++ b/ex/q/q.go @@ -135,6 +135,14 @@ Flags: nameserver = dns.Fqdn(nameserver) + ":" + strconv.Itoa(*port) } c := new(dns.Client) + t := new(dns.Transfer) + c.Net = "udp" + if *four { + c.Net = "udp4" + } + if *six { + c.Net = "udp6" + } if *tcp { c.Net = "tcp" if *four { @@ -143,14 +151,6 @@ Flags: if *six { c.Net = "tcp6" } - } else { - c.Net = "udp" - if *four { - c.Net = "udp4" - } - if *six { - c.Net = "udp6" - } } m := new(dns.Msg) @@ -206,6 +206,7 @@ Flags: if algo, name, secret, ok := tsigKeyParse(*tsig); ok { m.SetTsig(name, algo, 300, time.Now().Unix()) c.TsigSecret = map[string]string{name: secret} + t.TsigSecret = map[string]string{name: secret} } else { fmt.Fprintf(os.Stderr, "TSIG key data error\n") return @@ -215,13 +216,15 @@ Flags: fmt.Printf("%s", m.String()) fmt.Printf("\n;; size: %d bytes\n\n", m.Len()) } - if qtype == dns.TypeAXFR { - c.Net = "tcp" - doXfr(c, m, nameserver) - continue - } - if qtype == dns.TypeIXFR { - doXfr(c, m, nameserver) + if qtype == dns.TypeAXFR || qtype == dns.TypeIXFR { + env, err := t.In(m, nameserver) + if err != nil { + fmt.Printf(";; %s\n", err.Error()) + continue + } + for e := range env { + fmt.Printf("%s\n", e.RR) + } continue } r, rtt, e := c.Exchange(m, nameserver) @@ -397,21 +400,21 @@ func shortRR(r dns.RR) dns.RR { func doXfr(c *dns.Client, m *dns.Msg, nameserver string) { /* - if t, e := c.TransferIn(m, nameserver); e == nil { - for r := range t { - if r.Error == nil { - for _, rr := range r.RR { - if *short { - rr = shortRR(rr) + if t, e := c.TransferIn(m, nameserver); e == nil { + for r := range t { + if r.Error == nil { + for _, rr := range r.RR { + if *short { + rr = shortRR(rr) + } + fmt.Printf("%v\n", rr) } - fmt.Printf("%v\n", rr) + } else { + fmt.Fprintf(os.Stderr, "Failure to read XFR: %s\n", r.Error.Error()) } - } else { - fmt.Fprintf(os.Stderr, "Failure to read XFR: %s\n", r.Error.Error()) } + } else { + fmt.Fprintf(os.Stderr, "Failure to read XFR: %s\n", e.Error()) } - } else { - fmt.Fprintf(os.Stderr, "Failure to read XFR: %s\n", e.Error()) - } */ } diff --git a/xfr.go b/xfr.go index 674e68b6..5bd6f79b 100644 --- a/xfr.go +++ b/xfr.go @@ -16,7 +16,7 @@ type Envelope struct { } type Transfer struct { - Conn + *Conn DialTimeout time.Duration // net.DialTimeout (ns), defaults to 2 * 1e9 ReadTimeout time.Duration // net.Conn.SetReadTimeout value for connections (ns), defaults to 2 * 1e9 WriteTimeout time.Duration // net.Conn.SetWriteTimeout value for connections (ns), defaults to 2 * 1e9 @@ -25,12 +25,12 @@ type Transfer struct { // In performs an incoming transfer with the server in a. func (t *Transfer) In(q *Msg, a string) (env chan *Envelope, err error) { - co := new(Conn) + t.Conn = new(Conn) timeout := dnsTimeout if t.DialTimeout != 0 { timeout = t.DialTimeout } - co.Conn, err = net.DialTimeout("tcp", a, timeout) + t.Conn, err = net.DialTimeout("tcp", a, timeout) if err != nil { return nil, err } @@ -128,7 +128,7 @@ func (t *Transfer) inIxfr(id uint16, c chan *Envelope) { // This serial is important serial = in.Answer[0].(*SOA).Serial first = !first - // continue // TODO(miek) + // continue // TODO(miek): ? } // Now we need to check each message for SOA records, to see what we need to do @@ -207,10 +207,6 @@ func (t *Transfer) WriteMsg(m *Msg) (err error) { return nil } -/* - -*/ - func isSOAFirst(in *Msg) bool { if len(in.Answer) > 0 { return in.Answer[0].Header().Rrtype == TypeSOA