diff --git a/TODO b/TODO index c1e536da..4e11b3d3 100644 --- a/TODO +++ b/TODO @@ -5,6 +5,7 @@ o clean, small API o fast data structures (rb-tree, when they come available) o api-use should lead to self documenting code +o make questions fqdns -- add last dot o zone structure -- only as rb-tree o compression (only ownernames?) diff --git a/dns.go b/dns.go index 570869c0..a32e8c41 100644 --- a/dns.go +++ b/dns.go @@ -135,13 +135,10 @@ func (d *Conn) WriteMsg(m *Msg) os.Error { if !ok { return &Error{Error: "Failed to pack"} } - n, err := d.Write(out) + _, err := d.Write(out) if err != nil { return err } - if n != len(out) { - return &Error{Error: "Short write"} - } return nil } @@ -184,7 +181,7 @@ func (d *Conn) Read(p []byte) (n int, err os.Error) { } i := n for i < int(l) { - j, err := d.TCP.Read(p[i:l]) + j, err := d.TCP.Read(p[i:int(l)]) if err != nil { return i, err } @@ -262,15 +259,15 @@ func (d *Conn) Write(p []byte) (n int, err os.Error) { } i := n if i < len(q) { - n, err = d.TCP.Write(q) + j, err := d.TCP.Write(q[i:len(q)]) if err != nil { if e, ok := err.(net.Error); ok && e.Timeout() { // We are half way in our write... continue } - return n, err + return i, err } - i += n + i += j } n = i } diff --git a/resolver.go b/resolver.go index 210fc35f..830f5e40 100644 --- a/resolver.go +++ b/resolver.go @@ -105,13 +105,15 @@ func (res *Resolver) Xfr(q *Msg, m chan Xfr) { func (res *Resolver) XfrTsig(q *Msg, t *Tsig, m chan Xfr) { port, err := check(res, q) if err != nil { + close(m) return } sending, ok := q.Pack() if !ok { + close(m) return } - + // No defer close(m) as m is closed in d.XfrRead() Server: for i := 0; i < len(res.Servers); i++ { server := res.Servers[i] + ":" + port diff --git a/xfr.go b/xfr.go index 5229f23b..12322489 100644 --- a/xfr.go +++ b/xfr.go @@ -25,6 +25,8 @@ func (d *Conn) XfrRead(q *Msg, m chan Xfr) { // Send q first. err := d.WriteMsg(q) if err != nil { + m <- Xfr{true, nil, err} + close(m) return } switch q.Question[0].Qtype { @@ -32,6 +34,9 @@ func (d *Conn) XfrRead(q *Msg, m chan Xfr) { d.axfrRead(q, m) case TypeIXFR: d.ixfrRead(q, m) + default: + m <- Xfr{true, nil, &Error{Error: "Qtype not recognized"}} + close(m) } } @@ -45,6 +50,9 @@ func (d *Conn) XfrWrite(q *Msg, m chan Xfr) { d.axfrWrite(q, m) case TypeIXFR: // d.ixfrWrite(q, m) + default: + m <- Xfr{true, nil, &Error{Error: "Qtype not recognized"}} + close(m) } }