allow the resolver to be reconfigured on the fly

This commit is contained in:
Miek Gieben 2010-12-18 20:55:45 +01:00
parent 0e00511c31
commit ad968420ec
2 changed files with 65 additions and 48 deletions

View File

@ -33,58 +33,60 @@ type Resolver struct {
} }
// do it // 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 c net.Conn
var err os.Error var err os.Error
var in *Msg var in *Msg
select { for {
case <-quit: // quit signal recevied select {
println("Quiting") case <-quit: // quit signal recevied
// send something back on the channel? println("Quiting")
return // send something back on the channel?
case out := <-msg: //msg received return
var cerr os.Error case out := <-msg: //msg received
println("Getting a message") var cerr os.Error
// Set an id println("Getting a message")
//if len(name) >= 256 { // Set an id
out.M.Id = uint16(rand.Int()) ^ uint16(time.Nanoseconds()) //if len(name) >= 256 {
println("Setting the id", out.M.Id) out.M.Id = uint16(rand.Int()) ^ uint16(time.Nanoseconds())
sending, ok := out.M.Pack() println("Setting the id", out.M.Id)
if !ok { sending, ok := out.M.Pack()
println("error converting") if !ok {
msg <- MsgErr{nil, nil} // todo error 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
} }
println("exchange") println("here")
in, err = exchange(c, sending, res.Attempts, res.Timeout)
// Check id in.id != out.id
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 { if err != nil {
println("Err not nil") msg <- MsgErr{nil, err}
continue } 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") println("Mag nooit hier komen")
return return

View File

@ -8,9 +8,6 @@ import (
func main() { func main() {
res := new(dns.Resolver) // create a new resolver 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 // Create a new message
m := new(dns.Msg) m := new(dns.Msg)
@ -18,11 +15,18 @@ func main() {
m.Question = make([]dns.Question, 1) m.Question = make([]dns.Question, 1)
m.Question[0] = dns.Question{"miek.nl", dns.TypeSOA, dns.ClassINET} m.Question[0] = dns.Question{"miek.nl", dns.TypeSOA, dns.ClassINET}
// send config (or res with Query)
msgch := make(chan dns.MsgErr) msgch := make(chan dns.MsgErr)
qch := make(chan bool) qch := make(chan bool)
// start the resolver // 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 // ask something
msgch <- dns.MsgErr{m, nil} msgch <- dns.MsgErr{m, nil}
@ -32,6 +36,17 @@ func main() {
fmt.Printf("%v\n", in.M) fmt.Printf("%v\n", in.M)
// kill resolver // kill resolver
// qch <- true does not work yet // 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) time.Sleep(2.0e9)
/* /*