Systemd support

Rename StartAndServe to ActivateAndServe and only use one PacketConn or
Listener. This just adds a new entry point into starting a server.
This commit is contained in:
Miek Gieben 2014-07-21 15:24:55 +01:00
parent d80ad4aae5
commit e1cb18539a
1 changed files with 21 additions and 19 deletions

View File

@ -90,17 +90,19 @@ func HandleFailed(w ResponseWriter, r *Msg) {
func failedHandler() Handler { return HandlerFunc(HandleFailed) } func failedHandler() Handler { return HandlerFunc(HandleFailed) }
// Start a server on addresss and network speficied. Invoke handler // ListenAndServe Starts a server on addresss and network speficied. Invoke handler
// for incoming queries. // for incoming queries.
func ListenAndServe(addr string, network string, handler Handler) error { func ListenAndServe(addr string, network string, handler Handler) error {
server := &Server{Addr: addr, Net: network, Handler: handler} server := &Server{Addr: addr, Net: network, Handler: handler}
return server.ListenAndServe() return server.ListenAndServe()
} }
// Start a server with these listeners. Invoke handler for incoming queries. // ActivateAndServe activates a server with a listener, l and p should not both be non-nil.
func StartAndServe(ls []net.Listener, ps []net.PacketConn, handler Handler) error { // If both l and p are not nil only p will be used.
server := &Server{Listeners: ls, PacketConns: ps, Handler: handler} // Invoke handler for incoming queries.
return server.StartAndServe() func ActivateAndServe(l net.Listener, p net.PacketConn, handler Handler) error {
server := &Server{Listener: l, PacketConn: p, Handler: handler}
return server.ActivateAndServe()
} }
func (mux *ServeMux) match(q string, t uint16) Handler { func (mux *ServeMux) match(q string, t uint16) Handler {
@ -203,10 +205,10 @@ type Server struct {
Addr string Addr string
// if "tcp" it will invoke a TCP listener, otherwise an UDP one. // if "tcp" it will invoke a TCP listener, otherwise an UDP one.
Net string Net string
// TCP Listeners to use, this is to aid in systemd's socket activation. // TCP Listener to use, this is to aid in systemd's socket activation.
Listeners []net.Listener Listener net.Listener
// UDP "Listeners" to use, this is to aid in systemd's socket activation. // UDP "Listener" to use, this is to aid in systemd's socket activation.
PacketConns []net.PacketConn PacketConn net.PacketConn
// Handler to invoke, dns.DefaultServeMux if nil. // Handler to invoke, dns.DefaultServeMux if nil.
Handler Handler Handler Handler
// Default buffer size to use to read incoming UDP messages. If not set // Default buffer size to use to read incoming UDP messages. If not set
@ -262,25 +264,25 @@ func (srv *Server) ListenAndServe() error {
return &Error{err: "bad network"} return &Error{err: "bad network"}
} }
// StartAndServe starts a nameserver with the first listener the or first // ActivateAndServe starts a nameserver with the PacketConn or Listener
// packetconn configured in *Server. // configured in *Server.
func (srv *Server) StartAndServe() error { func (srv *Server) ActivateAndServe() error {
if len(srv.Listeners) > 0 { if srv.PacketConn != nil {
if t, ok := srv.Listeners[0].(*net.TCPListener); ok {
return srv.serveTCP(t)
}
}
if len(srv.PacketConns) > 0 {
if srv.UDPSize == 0 { if srv.UDPSize == 0 {
srv.UDPSize = MinMsgSize srv.UDPSize = MinMsgSize
} }
if t, ok := srv.PacketConns[0].(*net.UDPConn); ok { if t, ok := srv.PacketConn.(*net.UDPConn); ok {
if e := setUDPSocketOptions(t); e != nil { if e := setUDPSocketOptions(t); e != nil {
return e return e
} }
return srv.serveUDP(t) return srv.serveUDP(t)
} }
} }
if srv.Listener != nil {
if t, ok := srv.Listener.(*net.TCPListener); ok {
return srv.serveTCP(t)
}
}
return &Error{err: "bad listeners"} return &Error{err: "bad listeners"}
} }