From ad968420ec8fa202689caee490640cd46c0943bd Mon Sep 17 00:00:00 2001 From: Miek Gieben Date: Sat, 18 Dec 2010 20:55:45 +0100 Subject: [PATCH] allow the resolver to be reconfigured on the fly --- resolver.go | 90 +++++++++++++++++++++++++++-------------------------- restest.go | 23 +++++++++++--- 2 files changed, 65 insertions(+), 48 deletions(-) diff --git a/resolver.go b/resolver.go index 9593c218..f27a2d2d 100644 --- a/resolver.go +++ b/resolver.go @@ -33,58 +33,60 @@ type Resolver struct { } // do it -func (res *Resolver) Query(msg chan MsgErr, quit chan bool) { +func Query(res *Resolver, msg chan MsgErr, quit chan bool) { var c net.Conn var err os.Error var in *Msg - select { - case <-quit: // quit signal recevied - println("Quiting") - // send something back on the channel? - return - case out := <-msg: //msg received - var cerr os.Error - println("Getting a message") - // Set an id - //if len(name) >= 256 { - out.M.Id = uint16(rand.Int()) ^ uint16(time.Nanoseconds()) - println("Setting the id", out.M.Id) - sending, ok := out.M.Pack() - if !ok { - println("error converting") - msg <- MsgErr{nil, nil} // todo error - } - println("here") - - for i := 0; i < len(res.Servers); i++ { - println("here", i) - server := res.Servers[i] + ":53" - println(server) - - println("before dial") - c, cerr = net.Dial("udp", "", server) - println("after dial") - if cerr != nil { - println("error sending") - err = cerr - continue + for { + select { + case <-quit: // quit signal recevied + println("Quiting") + // send something back on the channel? + return + case out := <-msg: //msg received + var cerr os.Error + println("Getting a message") + // Set an id + //if len(name) >= 256 { + out.M.Id = uint16(rand.Int()) ^ uint16(time.Nanoseconds()) + println("Setting the id", out.M.Id) + sending, ok := out.M.Pack() + if !ok { + println("error converting") + msg <- MsgErr{nil, nil} // todo error } - println("exchange") - in, err = exchange(c, sending, res.Attempts, res.Timeout) - // Check id in.id != out.id + println("here") - c.Close() + for i := 0; i < len(res.Servers); i++ { + println("here", i) + server := res.Servers[i] + ":53" + println(server) + + println("before dial") + c, cerr = net.Dial("udp", "", server) + println("after dial") + if cerr != nil { + println("error sending") + err = cerr + continue + } + println("exchange") + in, err = exchange(c, sending, res.Attempts, res.Timeout) + // Check id in.id != out.id + + c.Close() + if err != nil { + println("Err not nil") + continue + } + } + println("komt ik hier dan") if err != nil { - println("Err not nil") - continue + msg <- MsgErr{nil, err} + } else { + msg <- MsgErr{in, nil} } } - println("komt ik hier dan") - if err != nil { - msg <- MsgErr{nil, err} - } else { - msg <- MsgErr{in, nil} - } } println("Mag nooit hier komen") return diff --git a/restest.go b/restest.go index a8f4b745..2866e534 100644 --- a/restest.go +++ b/restest.go @@ -8,9 +8,6 @@ import ( func main() { res := new(dns.Resolver) // create a new resolver - res.Servers = []string{"192.168.1.2"} - res.Timeout = 2 - res.Attempts = 1 // Create a new message m := new(dns.Msg) @@ -18,11 +15,18 @@ func main() { m.Question = make([]dns.Question, 1) m.Question[0] = dns.Question{"miek.nl", dns.TypeSOA, dns.ClassINET} + // send config (or res with Query) + msgch := make(chan dns.MsgErr) qch := make(chan bool) // start the resolver - go res.Query(msgch, qch) + go dns.Query(res, msgch, qch) + + // configure the resolver + res.Servers = []string{"192.168.1.2"} + res.Timeout = 2 + res.Attempts = 1 // ask something msgch <- dns.MsgErr{m, nil} @@ -32,6 +36,17 @@ func main() { fmt.Printf("%v\n", in.M) // kill resolver // qch <- true does not work yet + + m.Question[0] = dns.Question{"a.miek.nl", dns.TypeTXT, dns.ClassINET} + // ask something + msgch <- dns.MsgErr{m, nil} + + // wait for an reply + in = <-msgch + fmt.Printf("%v\n", in.M) + + + time.Sleep(2.0e9) /*