Lowlevel read/write improvements

This commit is contained in:
Miek Gieben 2011-03-25 09:58:14 +01:00
parent b1363094de
commit 15518a578f
4 changed files with 17 additions and 9 deletions

1
TODO
View File

@ -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?)

13
dns.go
View File

@ -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
}

View File

@ -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

8
xfr.go
View File

@ -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)
}
}