Responder channel is now os.Error

to make it possible to send errors back
This commit is contained in:
Miek Gieben 2011-01-27 20:16:58 +01:00
parent 44c00e1b57
commit 896df96f94
5 changed files with 124 additions and 119 deletions

View File

@ -223,7 +223,7 @@ func main() {
s.Address = addr s.Address = addr
s.Port = port s.Port = port
var srv *server var srv *server
rs := make(chan bool) rs := make(chan os.Error)
go s.NewResponder(srv, rs) go s.NewResponder(srv, rs)
forever: forever:
@ -236,7 +236,7 @@ forever:
break forever break forever
} }
} }
rs <- true // shutdown responder rs <- nil // shutdown responder
<-rs // wait for confirmation <-rs // wait for confirmation
// And the resolvers // And the resolvers
for _, q := range qr { for _, q := range qr {

View File

@ -17,9 +17,10 @@
package main package main
import ( import (
"os"
"net" "net"
"strconv"
"dns" "dns"
"strconv"
"dns/responder" "dns/responder"
"runtime" "runtime"
"os/signal" "os/signal"
@ -100,7 +101,7 @@ func main() {
s.Address = "127.0.0.1" s.Address = "127.0.0.1"
s.Port = "8053" s.Port = "8053"
var srv *server var srv *server
ch := make(chan bool) ch := make(chan os.Error)
go s.NewResponder(srv, ch) go s.NewResponder(srv, ch)
t := new(responder.Server) t := new(responder.Server)
@ -108,7 +109,7 @@ func main() {
t.Port = "8053" t.Port = "8053"
t.Tcp = true t.Tcp = true
var srvt *server var srvt *server
cht := make(chan bool) cht := make(chan os.Error)
go t.NewResponder(srvt, cht) go t.NewResponder(srvt, cht)
forever: forever:
@ -117,13 +118,15 @@ forever:
select { select {
case <-signal.Incoming: case <-signal.Incoming:
println("Signal received, stopping") println("Signal received, stopping")
ch <- true ch <- nil
cht <- true cht <- nil
break forever break forever
case <-cht: case e := <-cht:
// last message from tcp channel // last message from tcp channel
case <-ch: println(e.String())
case e := <-ch:
// last message from udp channel // last message from udp channel
println(e.String())
} }
} }
close(cht) close(cht)

View File

@ -10,6 +10,7 @@
package main package main
import ( import (
"os"
"net" "net"
"dns" "dns"
"dns/responder" "dns/responder"
@ -52,7 +53,7 @@ func main() {
s.Address = "127.0.0.1" s.Address = "127.0.0.1"
s.Port = "8053" s.Port = "8053"
var srv *server var srv *server
ch := make(chan bool) ch := make(chan os.Error)
go s.NewResponder(srv, ch) go s.NewResponder(srv, ch)
forever: forever:
@ -61,9 +62,13 @@ forever:
select { select {
case <-signal.Incoming: case <-signal.Incoming:
println("Signal received, stopping") println("Signal received, stopping")
ch <- true ch <- nil
<-ch <-ch
break forever break forever
case e := <-cht:
println(e.String())
case e := <-ch:
println(e.String())
} }
} }
} }

View File

@ -59,12 +59,12 @@ type Responder interface {
ResponderTCP(c *net.TCPConn, in []byte) ResponderTCP(c *net.TCPConn, in []byte)
} }
// Start a new responder. The returned channel is only used to stop the responder. // Start a new responder. The returned channel is used to stop the responder.
// Send 'true' to make it stop // Send 'nil' to make it stop. It can also return error via the channel.
func (res *Server) NewResponder(h Responder, stop chan bool) { func (res *Server) NewResponder(h Responder, stop chan os.Error) {
var port string var port string
if len(res.Address) == 0 { if len(res.Address) == 0 {
// We cannot start responding without an addresss stop <- &dns.Error{Error: "No addresses"}
return return
} }
if res.Port == "" { if res.Port == "" {
@ -83,14 +83,12 @@ func (res *Server) NewResponder(h Responder, stop chan bool) {
for { for {
select { select {
case <-stop: case <-stop:
stop <- true stop <- nil
listener.Close() listener.Close()
break foreverTCP break foreverTCP
case s := <-tch: case s := <-tch:
if s.err != nil { if s.err != nil {
// always fatal?? stop <- s.err
stop <- false
println(s.err.String())
} else { } else {
go h.ResponderTCP(s.tcp, s.msg) go h.ResponderTCP(s.tcp, s.msg)
} }
@ -105,13 +103,11 @@ func (res *Server) NewResponder(h Responder, stop chan bool) {
for { for {
select { select {
case <-stop: case <-stop:
stop <- true stop <- nil
break foreverUDP break foreverUDP
case s := <-uch: case s := <-uch:
if s.err != nil { if s.err != nil {
//continue stop <- s.err
stop <- false
println(s.err.String())
} else { } else {
go h.ResponderUDP(s.udp, s.addr, s.msg) go h.ResponderUDP(s.udp, s.addr, s.msg)
} }

View File

@ -1,6 +1,7 @@
package responder package responder
import ( import (
"os"
"testing" "testing"
"fmt" "fmt"
"dns" "dns"
@ -66,7 +67,7 @@ func TestResponder(t *testing.T) {
su.Address = "127.0.0.1" su.Address = "127.0.0.1"
su.Port = "8053" su.Port = "8053"
var us *myserv var us *myserv
uch := make(chan bool) uch := make(chan os.Error)
go su.NewResponder(us, uch) go su.NewResponder(us, uch)
/* tcp servertje */ /* tcp servertje */
@ -75,23 +76,23 @@ func TestResponder(t *testing.T) {
st.Port = "8053" st.Port = "8053"
st.Tcp = true st.Tcp = true
var ts *myserv var ts *myserv
tch := make(chan bool) tch := make(chan os.Error)
go st.NewResponder(ts, tch) go st.NewResponder(ts, tch)
time.Sleep(1 * 1e9) time.Sleep(1 * 1e9)
uch <- true uch <- nil
tch <- true tch <- nil
<-uch <-uch
<-tch <-tch
} }
/* /*
func TestReflectorResponder(t *testing.T) { func TestReflectorResponder(t *testing.T) {
stop := make(chan bool) stop := make(chan os.Error)
s := new(Server) s := new(Server)
s.Port = "8053" s.Port = "8053"
s.Address = "127.0.0.1" s.Address = "127.0.0.1"
stoptcp := make(chan bool) stoptcp := make(chan os.Error)
stcp := new(Server) stcp := new(Server)
stcp.Port = "8053" stcp.Port = "8053"
stcp.Address = "127.0.0.1" stcp.Address = "127.0.0.1"
@ -101,8 +102,8 @@ func TestReflectorResponder(t *testing.T) {
go s.NewResponder(Reflector, stop) go s.NewResponder(Reflector, stop)
time.Sleep(1 * 1e9) time.Sleep(1 * 1e9)
stop <- true stop <- nil
stoptcp <- true stoptcp <- nil
<-stop <-stop
<-stoptcp <-stoptcp
} }
@ -175,7 +176,7 @@ func TestResponderTsig(t *testing.T) {
su.Address = "127.0.0.1" su.Address = "127.0.0.1"
su.Port = "8053" su.Port = "8053"
var us *servtsig var us *servtsig
uch := make(chan bool) uch := make(chan os.Error)
go su.NewResponder(us, uch) go su.NewResponder(us, uch)
/* tcp servertje */ /* tcp servertje */
@ -184,11 +185,11 @@ func TestResponderTsig(t *testing.T) {
st.Port = "8053" st.Port = "8053"
st.Tcp = true st.Tcp = true
var ts *servtsig var ts *servtsig
tch := make(chan bool) tch := make(chan os.Error)
go st.NewResponder(ts, tch) go st.NewResponder(ts, tch)
time.Sleep(1 * 1e9) time.Sleep(1 * 1e9)
uch <- true uch <- nil
tch <- true tch <- nil
<-uch <-uch
<-tch <-tch
} }