2011-03-23 11:16:34 +01:00

70 lines
1.8 KiB
Go

package main
import (
"os"
"dns"
"net"
"fmt"
)
func handleXfr(d *dns.Conn, i *dns.Msg) {
if i.IsAxfr() {
fmt.Printf("Axfr request seen\n")
if i.Question[0].Name == Zone.name {
fmt.Printf("Matching current zone\n")
m := make(chan dns.Xfr)
var x dns.Xfr
go d.XfrWrite(i, m)
for j := 0; j < Zone.size; j++ {
x.Add = true
x.RR = Zone.rrs[j]
m <- x
}
close(m)
}
}
}
func handleNotify(d *dns.Conn, i *dns.Msg) {
if i.IsNotify() {
fmt.Printf("Notify seen\n")
q := new(dns.Msg)
q.SetReply(i)
err := d.WriteMsg(q)
if err != nil {
return
}
doXfrIn(i)
}
}
func doXfrIn(i *dns.Msg) ([]dns.RR, os.Error) {
q := new(dns.Msg)
q.SetAxfr(i.Question[0].Name)
m := make(chan dns.Xfr)
fmt.Printf("Preparing Xfr for %s\n", i.Question[0].Name)
// Fill and setup the dns.Conn.
d := new(dns.Conn)
c, err := net.Dial("tcp", "", "127.0.0.1:53")
if err != nil {
return nil, err
}
fmt.Printf("Calling 127.0.0.1 successful\n")
d.TCP = c.(*net.TCPConn)
d.Addr = d.TCP.RemoteAddr()
go d.XfrRead(q, m)
Zone.name = i.Question[0].Name
j := 0
for x := range m {
fmt.Printf("%v %v\n", x.Add, x.RR)
Zone.rrs[j] = x.RR
j++
}
Zone.size = j
d.Close()
return nil, nil
}