Lowlevel read/write improvements
This commit is contained in:
parent
b1363094de
commit
15518a578f
1
TODO
1
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?)
|
||||
|
||||
|
|
13
dns.go
13
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
|
||||
}
|
||||
|
|
|
@ -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
8
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)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue