mirror of
https://github.com/miekg/dns.git
synced 2025-08-14 21:46:58 +02:00
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
|
// 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
|
||||||
|
23
restest.go
23
restest.go
@ -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)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user