Fix funkensturm

This commit is contained in:
Miek Gieben 2011-02-11 21:46:35 +01:00
parent b43067fbcc
commit 8229af080d
2 changed files with 39 additions and 21 deletions

View File

@ -16,9 +16,6 @@ import (
"strings"
)
// Define a responder that takes care of the incoming queries.
type server dns.Server
// Define a slice of channels for the resolver for sending the queries somewhere else.
var qr []*dns.Resolver
@ -79,11 +76,7 @@ func verboseprint(i *dns.Msg, msg string) {
fmt.Printf("<<<<<< %s\n\n", msg)
}
func doFunkensturm(i []byte) ([]byte, os.Error) {
pkt := new(dns.Msg)
if !pkt.Unpack(i) {
return nil, &dns.Error{Error: "Unpacking packet failed"}
}
func doFunkensturm(pkt *dns.Msg) ([]byte, os.Error) {
if *verbose {
verboseprint(pkt, "ORIGINAL INCOMING")
}
@ -149,7 +142,7 @@ func doFunkensturm(i []byte) ([]byte, os.Error) {
return out, nil
}
func (s *server) ReplyUDP(c *net.UDPConn, a net.Addr, i []byte) {
func replyUDP(c *net.UDPConn, a net.Addr, i *dns.Msg) {
out, err := doFunkensturm(i)
if err != nil {
fmt.Fprintf(os.Stderr, "Error: %s\n", err.String())
@ -162,7 +155,7 @@ func (s *server) ReplyUDP(c *net.UDPConn, a net.Addr, i []byte) {
// nothing is send back
}
func (s *server) ReplyTCP(c *net.TCPConn, a net.Addr, i []byte) {
func replyTCP(c *net.TCPConn, a net.Addr, i *dns.Msg) {
out, err := doFunkensturm(i)
if err != nil {
fmt.Fprintf(os.Stderr, "Error: %s\n", err.String())
@ -184,6 +177,34 @@ func splitAddrPort(s string) (a, p string) {
return
}
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
}
func main() {
var sserver *string = flag.String("sserver", "127.0.0.1:8053", "Set the listener address")
var rserver *string = flag.String("rserver", "127.0.0.1:53", "Remote server address(es)")
@ -211,23 +232,20 @@ func main() {
return
}
// The server
var srv *server
quit := make(chan bool)
err := make(chan os.Error)
go dns.ListenAndServe(*sserver, srv, quit, err)
go udp(*sserver, err)
go tcp(*sserver, err)
forever:
for {
// Wait for a signal to stop
select {
case e := <-err:
fmt.Printf("Error received, stopping: %s\n", e.String())
break forever
case <-signal.Incoming:
fmt.Printf("Signal received, stopping")
quit <- true
break forever
}
}
close(quit)
close(err)
}

View File

@ -87,7 +87,7 @@ func replyTCP(c *net.TCPConn, a net.Addr, in *dns.Msg) {
dns.SendTCP(out, c, a)
}
func trackTCP(addr string, e chan os.Error) {
func tcp(addr string, e chan os.Error) {
a, err := net.ResolveTCPAddr(addr)
if err != nil {
e <- err
@ -101,7 +101,7 @@ func trackTCP(addr string, e chan os.Error) {
return
}
func trackUDP(addr string, e chan os.Error) {
func udp(addr string, e chan os.Error) {
a, err := net.ResolveUDPAddr(addr)
if err != nil {
e <- err
@ -117,8 +117,8 @@ func trackUDP(addr string, e chan os.Error) {
func main() {
e := make(chan os.Error)
go trackUDP("127.0.0.1:8053", e)
go trackTCP("127.0.0.1:8053", e)
go udp("127.0.0.1:8053", e)
go tcp("127.0.0.1:8053", e)
forever:
for {