allow the resolver to be reconfigured on the fly
This commit is contained in:
parent
0e00511c31
commit
ad968420ec
90
resolver.go
90
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
|
||||
|
|
23
restest.go
23
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)
|
||||
|
||||
/*
|
||||
|
|
Loading…
Reference in New Issue