also add error channel

This commit is contained in:
Miek Gieben 2011-02-10 22:26:11 +01:00
parent 392dd2f2df
commit 6ad68826eb
5 changed files with 32 additions and 15 deletions

View File

@ -6,7 +6,6 @@
package main
/* TODO log package */
import (
"os"
"flag"
@ -215,14 +214,17 @@ func main() {
// The server
var srv *server
quit := make(chan bool)
go dns.ListenAndServe(*sserver, srv, quit)
err := make(chan os.Error)
go dns.ListenAndServe(*sserver, srv, quit, err)
forever:
for {
// Wait for a signal to stop
select {
case e := <-err:
fmt.Printf("Error received, stopping: %s\n", e.String())
case <-signal.Incoming:
println("Signal received, stopping")
fmt.Printf("Signal received, stopping")
quit <- true
break forever
}

View File

@ -101,12 +101,16 @@ func main() {
var srv *server
ch := make(chan bool)
go dns.ListenAndServe("127.0.0.1:8053", srv, ch)
e := make(chan os.Error)
go dns.ListenAndServe("127.0.0.1:8053", srv, ch, e)
forever:
for {
// Wait for a signal to stop
select {
case err := <-e:
fmt.Printf("Error: %s\n", err.String())
break forever
case <-signal.Incoming:
println("Signal received, stopping")
ch <- true

View File

@ -49,17 +49,21 @@ func (s *server) ReplyTCP(c *net.TCPConn, a net.Addr, in []byte) {
func main() {
var srv *server
ch := make(chan bool)
go dns.ListenAndServe("127.0.0.1:8053", srv, ch)
e := make(chan os.Error)
go dns.ListenAndServe("127.0.0.1:8053", srv, ch, e)
forever:
for {
// Wait for a signal to stop
select {
case err := <-e:
fmt.Printf("Error received, stopping: %s\n", err.String())
break forever
case <-signal.Incoming:
println("Signal received, stopping")
fmt.Printf("Signal received, stopping")
ch <- true
break forever
}
}
close(ch)
close(ch)
}

View File

@ -133,25 +133,30 @@ func accepterTCP(l *net.TCPListener, ch chan *Request, quit chan bool) {
//
// var m *myserv
// ch := make(chan bool)
// go dns.ListenAndServe("127.0.0.1:8053", m, ch)
// e := make(chan os.Error)
// go dns.ListenAndServe("127.0.0.1:8053", m, ch, e)
// m <- true // stop the goroutine
func ListenAndServe(addr string, handler Handler, q chan bool) os.Error {
func ListenAndServe(addr string, handler Handler, q chan bool, e chan os.Error) {
ta, err := net.ResolveTCPAddr(addr)
if err != nil {
return err
e <- err
return
}
lt, err := net.ListenTCP("tcp", ta)
if err != nil {
return err
e <- err
return
}
ua, err := net.ResolveUDPAddr(addr)
if err != nil {
return err
e <- err
return
}
lu, err := net.ListenUDP("udp", ua)
if err != nil {
return err
e <- err
return
}
rc := make(chan *Request)
@ -177,7 +182,7 @@ func ListenAndServe(addr string, handler Handler, q chan bool) os.Error {
}
}
}
return err
return
}
// Send a buffer on the TCP connection.

View File

@ -3,6 +3,7 @@ package dns
import (
"testing"
"net"
"os"
"time"
)
@ -57,7 +58,8 @@ func (h *server) ReplyTCP(c *net.TCPConn, a net.Addr, in []byte) {
func TestResponder(t *testing.T) {
var h *server
quit := make(chan bool)
go ListenAndServe("127.0.0.1:8053", h, quit)
e := make(chan os.Error)
go ListenAndServe("127.0.0.1:8053", h, quit, e)
time.Sleep(2 * 1e9)
quit <- true
}