port tcp read

This commit is contained in:
Miek Gieben 2011-04-18 18:27:59 +02:00
parent e46a5e9908
commit 05a6852663
4 changed files with 40 additions and 12 deletions

View File

@ -12,18 +12,19 @@ func main() {
flag.Parse()
zone := flag.Arg(flag.NArg() - 1)
c := make(chan *dns.Xfr)
d := new(dns.Conn)
m := new(dns.Msg)
d.RemoteAddr = *nameserver
// only UDP works atm
client := dns.NewClient()
m := new(dns.Msg)
if *serial > 0 {
m.SetIxfr(zone, uint32(*serial))
} else {
m.SetAxfr(zone)
}
go d.XfrRead(m, c)
for x := range c {
fmt.Printf("%v %v %v\n", x.Add, x.RR, x.Err)
axfr, err := client.XfrReceive(m, *nameserver)
if err != nil {
println(err.String())
}
for _, v := range axfr {
fmt.Printf("%v\n", v)
}
}

View File

@ -252,7 +252,33 @@ func (w *reply) readClient(p []byte) (n int, err os.Error) {
}
switch w.Client().Net {
case "tcp":
//
if len(p) < 1 {
return 0, io.ErrShortBuffer
}
n, err = w.conn.(*net.TCPConn).Read(p[0:2])
if err != nil || n != 2 {
return n, err
}
l, _ := unpackUint16(p[0:2], 0)
if l == 0 {
return 0, ErrShortRead
}
if int(l) > len(p) {
return int(l), io.ErrShortBuffer
}
n, err = w.conn.(*net.TCPConn).Read(p[:l])
if err != nil {
return n, err
}
i := n
for i < int(l) {
j, err := w.conn.(*net.TCPConn).Read(p[i:int(l)])
if err != nil {
return i, err
}
i += j
}
n = i
case "udp":
n, _, err = w.conn.(*net.UDPConn).ReadFromUDP(p)
if err != nil {

View File

@ -52,6 +52,7 @@ func (dns *Msg) IsNotify() (ok bool) {
// Create a dns msg suitable for requesting an ixfr.
func (dns *Msg) SetIxfr(z string, serial uint32) {
dns.MsgHdr.Id = Id()
dns.Question = make([]Question, 1)
dns.Ns = make([]RR, 1)
s := new(RR_SOA)
@ -64,6 +65,7 @@ func (dns *Msg) SetIxfr(z string, serial uint32) {
// Create a dns msg suitable for requesting an axfr.
func (dns *Msg) SetAxfr(z string) {
dns.MsgHdr.Id = Id()
dns.Question = make([]Question, 1)
dns.Question[0] = Question{z, TypeAXFR, ClassINET}
}

5
xfr.go
View File

@ -28,10 +28,11 @@ func (c *Client) XfrReceive(q *Msg, a string) ([]*Msg, os.Error) {
}
func (w *reply) axfrReceive() ([]*Msg, os.Error) {
axfr := make([]*Msg, 1) // use append ALL the time?
axfr := make([]*Msg, 0) // use append ALL the time?
first := true
for {
in, err := w.Receive()
axfr = append(axfr, in)
if err != nil {
return axfr, err
}
@ -49,10 +50,8 @@ func (w *reply) axfrReceive() ([]*Msg, os.Error) {
//}
if !checkXfrSOA(in, false) {
// Soa record not the last one
axfr = append(axfr, in)
continue
} else {
axfr = append(axfr, in)
return axfr, nil
}
}