diff --git a/_examples/reflect/reflect.go b/_examples/reflect/reflect.go index 1a09dde1..1f31ecaf 100644 --- a/_examples/reflect/reflect.go +++ b/_examples/reflect/reflect.go @@ -10,8 +10,8 @@ * * Stephane Bortzmeyer * - * Adapted to Go DNS (i.e. completely rewritten) * Miek Gieben + * Adapted to Go DNS (i.e. completely rewritten) */ package main @@ -20,46 +20,74 @@ import ( "net" "dns" "fmt" - // "os" - // "os/signal" -// "strconv" + "os/signal" + "strconv" ) func handleReflect(w dns.ResponseWriter, r *dns.Msg) { m := new(dns.Msg) m.SetReply(r) m.Extra = make([]dns.RR, 1) -// m.Answer = make([]dns.RR, 1) + m.Answer = make([]dns.RR, 1) + var ( + v4 bool + rr dns.RR + str string + a net.IP + ) - println(w.RemoteAddr()) - ad := net.ParseIP(w.RemoteAddr()) - println(ad.String()) -// if ad.To4() != nil { -// rr := new(dns.RR_A) -// rr.Hdr = dns.RR_Header{Name: "whoami.miek.nl.", Rrtype: dns.TypeA, Class: dns.ClassINET, Ttl: 0} -// rr.A = ad -// m.Answer[0] = rr -// } else { -// r := new(dns.RR_AAAA) -// r.Hdr = dns.RR_Header{Name: "whoami.miek.nl.", Rrtype: dns.TypeAAAA, Class: dns.ClassINET, Ttl: 0} -// r.AAAA = ad -// m.Answer[0] = r -// } + if ip, ok := w.RemoteAddr().(*net.UDPAddr); ok { + str = "Port: " + strconv.Itoa(ip.Port) + " (udp)" + a = ip.IP + v4 = a.To4() != nil + } + if ip, ok := w.RemoteAddr().(*net.TCPAddr); ok { + str = "Port: " + strconv.Itoa(ip.Port) + " (tcp)" + a = ip.IP + v4 = a.To4() != nil + } + + if v4 { + rr = new(dns.RR_A) + rr.(*dns.RR_A).Hdr = dns.RR_Header{Name: "whoami.miek.nl.", Rrtype: dns.TypeA, Class: dns.ClassINET, Ttl: 0} + rr.(*dns.RR_A).A = a + } else { + rr = new(dns.RR_AAAA) + rr.(*dns.RR_AAAA).Hdr = dns.RR_Header{Name: "whoami.miek.nl.", Rrtype: dns.TypeAAAA, Class: dns.ClassINET, Ttl: 0} + rr.(*dns.RR_AAAA).AAAA = a + } t := new(dns.RR_TXT) t.Hdr = dns.RR_Header{Name: "whoami.miek.nl.", Rrtype: dns.TypeTXT, Class: dns.ClassINET, Ttl: 0} -// t.Txt = "Port: " + strconv.Itoa(w.RemotePort()) + " (" + w.RemoteTransport() + ")" - t.Txt = "Port: " + " (" + w.RemoteTransport() + ")" + t.Txt = str m.Extra[0] = t + m.Answer[0] = rr - b, _ := m.Pack() + b, ok := m.Pack() + if !ok { return } w.Write(b) } func main() { dns.HandleFunc(".", handleReflect) - err := dns.ListenAndServe(":8053", "udp", nil) - if err != nil { - fmt.Printf("Failed to setup the server") - } + go func() { + err := dns.ListenAndServe(":8053", "udp", nil) + if err != nil { + fmt.Printf("Failed to setup the udp server") + } + }() + go func() { + err := dns.ListenAndServe(":8053", "tcp", nil) + if err != nil { + fmt.Printf("Failed to setup the tcp server") + } + }() +forever: + for { + select { + case <-signal.Incoming: + fmt.Printf("Signal received, stopping") + break forever + } + } } diff --git a/server.go b/server.go index 2925c311..7d97d05e 100644 --- a/server.go +++ b/server.go @@ -21,10 +21,8 @@ type Handler interface { // A ResponseWriter interface is used by an DNS handler to // construct an DNS response. type ResponseWriter interface { - // RemoteAddr returns the address of the client that sent the current request - RemoteAddr() string - // RemoteTransport return "udp" or "tcp" depending on the transport used - RemoteTransport() string + // RemoteAddr returns the net.Addr of the client that sent the current request + RemoteAddr() net.Addr // Write a reply back Write([]byte) (int, os.Error) @@ -351,6 +349,7 @@ func (w *response) Write(data []byte) (n int, err os.Error) { case w.conn._UDP != nil: n, err = w.conn._UDP.WriteTo(data, w.conn.remoteAddr) if err != nil { + println(err.String()) return 0, err } case w.conn._TCP != nil: @@ -382,12 +381,4 @@ func (w *response) Write(data []byte) (n int, err os.Error) { } // RemoteAddr implements the ResponseWriter.RemoteAddr method -func (w *response) RemoteAddr() string { return w.conn.remoteAddr.String() } - -// RemoteTransport implements the ResponseWriter.RemoteTransport method -func (w *response) RemoteTransport() string { - if w.conn._UDP != nil { - return "udp" - } - return "tcp" -} +func (w *response) RemoteAddr() net.Addr { return w.conn.remoteAddr }