From 5715b7b67e6b79d45c08b7d95e602a7b333a5c2f Mon Sep 17 00:00:00 2001 From: Miek Gieben Date: Mon, 17 Jan 2011 16:11:11 +0100 Subject: [PATCH] addd --- _examples/reflect/Makefile | 7 ++++ _examples/reflect/reflect.go | 80 ++++++++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 _examples/reflect/Makefile create mode 100644 _examples/reflect/reflect.go diff --git a/_examples/reflect/Makefile b/_examples/reflect/Makefile new file mode 100644 index 00000000..568aa6aa --- /dev/null +++ b/_examples/reflect/Makefile @@ -0,0 +1,7 @@ +# Copyright 2009 The Go Authors. All rights reserved. +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file. +include $(GOROOT)/src/Make.inc +TARG=reflect +GOFILES=reflect.go +include $(GOROOT)/src/Make.cmd diff --git a/_examples/reflect/reflect.go b/_examples/reflect/reflect.go new file mode 100644 index 00000000..a4affb77 --- /dev/null +++ b/_examples/reflect/reflect.go @@ -0,0 +1,80 @@ +/* + * A name server which sends back the IP address of its client, the + * recursive resolver. When queried for type TXT, it sends back the text + * form of the address. When queried for type A (resp. AAAA), it sends + * back the IPv4 (resp. v6) address. + * + * Similar services: whoami.ultradns.net, whoami.akamai.net. Also (but it + * is not their normal goal): rs.dns-oarc.net, porttest.dns-oarc.net, + * amiopen.openresolvers.org. + * + * Stephane Bortzmeyer + * + * Adapted to Go DNS (i.e. completely rewritten) + * Miek Gieben + */ + +package main + +import ( + "net" + "time" + "strconv" + "dns" + "dns/responder" +) + +type server responder.Server + +func (s *server) ResponderUDP(c *net.UDPConn, a net.Addr, in []byte) { + inmsg := new(dns.Msg) + if !inmsg.Unpack(in) { + // NXdomain 'n stuff + println("Unpacking failed") + } + m := new(dns.Msg) + m.MsgHdr.Id = inmsg.MsgHdr.Id + m.MsgHdr.Authoritative = true + m.MsgHdr.Response = true + m.MsgHdr.Opcode = dns.OpcodeQuery + + m.MsgHdr.Rcode = dns.RcodeSuccess + m.Question = make([]dns.Question, 1) + m.Answer = make([]dns.RR, 1) + m.Extra = make([]dns.RR, 1) + + r := new(dns.RR_A) + r.Hdr = dns.RR_Header{Name: "whoami.miek.nl.", Rrtype: dns.TypeA, Class: dns.ClassINET, Ttl: 0} + ip, _ := net.ResolveUDPAddr(a.String()) // No general variant for both upd and tcp + r.A = ip.IP.To4() // To4 very important + + 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(ip.Port) + " (udp)" + + m.Question[0] = inmsg.Question[0] + m.Answer[0] = r + m.Extra[0] = t + out, b := m.Pack() + if !b { + println("Failed to pack") + } + responder.SendUDP(out, c, a) +} + +func (s *server) ResponderTCP(c *net.TCPConn, in []byte) { + return +} + +func main() { + s := new(responder.Server) + s.Address = "127.0.0.1" + s.Port = "8053" + var srv *server + ch := make(chan bool) + go s.NewResponder(srv, ch) + + time.Sleep(100 * 1e9) + + +}