Port to new api

This commit is contained in:
Miek Gieben 2011-03-22 20:12:36 +01:00
parent 04469aaa8b
commit bac16eb644
3 changed files with 32 additions and 75 deletions

View File

@ -4,6 +4,7 @@ chaos \
axfr \
reflect \
funkensturm \
xfrprx \
ds2key \
all:

View File

@ -12,89 +12,41 @@ package main
import (
"os"
"os/signal"
"net"
// "net"
"fmt"
"dns"
)
// Initiate an AXFR from the server. Everything is
// hardcoded atm
func doTransfer() []dns.Xfr {
res := new(dns.Resolver)
res.Servers[0] = "127.0.0.1:53"
func reply(d *dns.Conn, i *dns.Msg) []byte {
return nil
}
c := make(chan dns.Xfr)
m := new(dns.Msg)
m.SetAxfrRequest("miek.nl", dns.ClassINET)
go res.Axfr(m, c)
var ret []dns.Xfr
for x:= range c {
ret = append(ret, x)
func handle(d *dns.Conn, i *dns.Msg) {
if i.MsgHdr.Response == true {
return
}
return ret
answer := reply(d, i)
d.Write(answer)
}
func replyUDP(c *net.UDPConn, a net.Addr, i *dns.Msg) {
if i.IsNotify() {
//doNotifyReply()
doTransfer()
//if checkTransfer(rtf, key) {
// Success
// Notify remote end
// send axfr
//}
}
out, ok := i.Pack()
if ok {
dns.SendUDP(out, c, a)
func listen(addr string, e chan os.Error, tcp string) {
switch tcp {
case "tcp":
err := dns.ListenAndServeTCP(addr, handle)
e <- err
case "udp":
err := dns.ListenAndServeUDP(addr, handle)
e <- err
}
return
}
func replyTCP(c *net.TCPConn, a net.Addr, i *dns.Msg) {
out, ok := i.Pack()
if ok {
dns.SendTCP(out, c, a)
}
}
func tcp(addr string, e chan os.Error) {
a, err := net.ResolveTCPAddr(addr)
if err != nil {
e <- err
}
l, err := net.ListenTCP("tcp", a)
if err != nil {
e <- err
}
err = dns.ServeTCP(l, replyTCP)
e <- err
return
}
func udp(addr string, e chan os.Error) {
a, err := net.ResolveUDPAddr(addr)
if err != nil {
e <- err
}
l, err := net.ListenUDP("udp", a)
if err != nil {
e <- err
}
err = dns.ServeUDP(l, replyUDP)
e <- err
return
}
// Step 1. Create server that sees an notify and
// performs an AXFR.
// Test with ldns-notify
func main() {
err := make(chan os.Error)
go udp("127.0.0.1:8053", err)
go tcp("127.0.0.1:8053", err)
go listen("127.0.0.1:8053", err, "tcp")
go listen("[::1]:8053", err, "udp")
go listen("127.0.0.1:8053", err, "tcp")
go listen("[::1]:8053", err, "udp")
forever:
for {

View File

@ -1,5 +1,7 @@
package dns
// Everything is assumed in the ClassINET class
// Create a reply packet.
func (dns *Msg) SetReply(id uint16) {
dns.MsgHdr.Id = id
@ -9,6 +11,8 @@ func (dns *Msg) SetReply(id uint16) {
dns.MsgHdr.Rcode = RcodeSuccess
}
// IsReply?
// Create a notify packet.
func (dns *Msg) SetNotify(z string, class uint16) {
dns.MsgHdr.Opcode = OpcodeNotify
@ -30,20 +34,20 @@ func (dns *Msg) IsNotify() bool {
}
// Create a dns msg suitable for requesting an ixfr.
func (dns *Msg) SetIxfr(z string, class uint16, serial uint32) {
func (dns *Msg) SetIxfr(z string, serial uint32) {
dns.Question = make([]Question, 1)
dns.Ns = make([]RR, 1)
s := new(RR_SOA)
s.Hdr = RR_Header{z, TypeSOA, class, DefaultTtl, 0}
s.Hdr = RR_Header{z, TypeSOA, ClassINET, DefaultTtl, 0}
s.Serial = serial
dns.Question[0] = Question{z, TypeIXFR, class}
dns.Question[0] = Question{z, TypeIXFR, ClassINET}
dns.Ns[0] = s
}
// Create a dns msg suitable for requesting an axfr.
func (dns *Msg) SetAxfr(z string, class uint16) {
func (dns *Msg) SetAxfr(z string) {
dns.Question = make([]Question, 1)
dns.Question[0] = Question{z, TypeAXFR, class}
dns.Question[0] = Question{z, TypeAXFR, ClassINET}
}
// IsIxfr/IsAxfr?