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
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

View File

@ -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)
/*