Fix a bunch of examples

This commit is contained in:
Miek Gieben 2011-02-09 21:42:09 +01:00
parent 7c76690ad3
commit 5c548a6e93
3 changed files with 27 additions and 45 deletions

View File

@ -5,18 +5,14 @@ package main
// (c) Miek Gieben - 2011
import (
"dns"
"dns/resolver"
"os"
"fmt"
"net"
)
func main() {
r := new(resolver.Resolver)
qr := r.NewQuerier()
r := new(dns.Resolver)
r.FromFile("/etc/resolv.conf")
var in resolver.Msg
if len(os.Args) != 2 {
fmt.Printf("%s DOMAIN\n", os.Args[0])
os.Exit(1)
@ -24,64 +20,54 @@ func main() {
m := new(dns.Msg)
m.Question = make([]dns.Question, 1)
for _, a := range addresses(qr, os.Args[0]) {
for _, a := range addresses(r, os.Args[0]) {
// set the resolver to query the NS directly
r.Servers = []string{a.String()}
m.Question[0] = dns.Question{"version.bind.", dns.TypeTXT, dns.ClassCHAOS}
qr <- resolver.Msg{m, nil, nil}
in = <-qr
if in.Dns != nil && in.Dns.Answer != nil {
fmt.Printf("%v\n", in.Dns.Answer[0])
in, _ := r.Query(m)
if in != nil && in.Answer != nil {
fmt.Printf("%v\n", in.Answer[0])
}
m.Question[0] = dns.Question{"hostname.bind.", dns.TypeTXT, dns.ClassCHAOS}
qr <- resolver.Msg{m, nil, nil}
in = <-qr
if in.Dns != nil && in.Dns.Answer != nil {
fmt.Printf("%v\n", in.Dns.Answer[0])
in, _ = r.Query(m)
if in != nil && in.Answer != nil {
fmt.Printf("%v\n", in.Answer[0])
}
}
// Stop the resolver, send it a null mesg
qr <- resolver.Msg{}
<-qr
}
func addresses(qr chan resolver.Msg, name string) []net.IP {
func addresses(r *dns.Resolver, name string) []net.IP {
m := new(dns.Msg)
m.MsgHdr.RecursionDesired = true //only set this bit
m.Question = make([]dns.Question, 1)
var ips []net.IP
m.Question[0] = dns.Question{os.Args[1], dns.TypeA, dns.ClassINET}
qr <- resolver.Msg{m, nil, nil}
in := <-qr
if in.Dns == nil {
fmt.Printf("Nothing recevied: %s\n", in.Error.String())
in, err := r.Query(m)
if in == nil {
fmt.Printf("Nothing recevied: %s\n", err.String())
return nil
}
if in.Dns.Rcode != dns.RcodeSuccess {
if in.Rcode != dns.RcodeSuccess {
return nil
}
// Stuff must be in the answer section
for _, a := range in.Dns.Answer {
for _, a := range in.Answer {
ips = append(ips, a.(*dns.RR_A).A)
}
m.Question[0] = dns.Question{os.Args[1], dns.TypeAAAA, dns.ClassINET}
qr <- resolver.Msg{m, nil, nil}
in = <-qr
if in.Dns == nil {
fmt.Printf("Nothing recevied: %s\n", in.Error.String())
in, err = r.Query(m)
if in == nil {
fmt.Printf("Nothing recevied: %s\n", err.String())
return nil
}
if in.Dns.Rcode != dns.RcodeSuccess {
if in.Rcode != dns.RcodeSuccess {
return nil
}
// Stuff must be in the answer section
for _, a := range in.Dns.Answer {
for _, a := range in.Answer {
ips = append(ips, a.(*dns.RR_AAAA).AAAA)
}
return ips

View File

@ -10,16 +10,14 @@
package main
import (
"os"
"net"
"dns"
"dns/responder"
"os/signal"
)
type server responder.Server
type server dns.Server
func (s *server) ResponderUDP(c *net.UDPConn, a net.Addr, in []byte) {
func (s *server) ReplyUDP(c *net.UDPConn, a net.Addr, in []byte) {
inmsg := new(dns.Msg)
if !inmsg.Unpack(in) {
// FormError
@ -41,20 +39,17 @@ func (s *server) ResponderUDP(c *net.UDPConn, a net.Addr, in []byte) {
if !b {
println("Failed to pack")
}
responder.SendUDP(out, c, a)
dns.SendUDP(out, c, a)
}
func (s *server) ResponderTCP(c *net.TCPConn, in []byte) {
func (s *server) ReplyTCP(c *net.TCPConn, a net.Addr, in []byte) {
return
}
func main() {
s := new(responder.Server)
s.Address = "127.0.0.1"
s.Port = "8053"
var srv *server
ch := make(chan os.Error)
go s.NewResponder(srv, ch)
ch := make(chan bool)
go dns.ListenAndServe("127.0.0.1:8053", srv, ch)
forever:
for {
@ -62,7 +57,7 @@ forever:
select {
case <-signal.Incoming:
println("Signal received, stopping")
ch <- nil
ch <- true
break forever
}
}

View File

@ -133,6 +133,7 @@ func accepterTCP(l *net.TCPListener, ch chan *Request, quit chan bool) {
panic("not reached")
}
// Setup both the udp and tcp listener
func ListenAndServe(addr string, handler Handler, q chan bool) os.Error {
ta, err := net.ResolveTCPAddr(addr)
if err != nil {