From e1cb18539ad5c9cd8542a2a9893a924217232c17 Mon Sep 17 00:00:00 2001 From: Miek Gieben Date: Mon, 21 Jul 2014 15:24:55 +0100 Subject: [PATCH] Systemd support Rename StartAndServe to ActivateAndServe and only use one PacketConn or Listener. This just adds a new entry point into starting a server. --- server.go | 40 +++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/server.go b/server.go index 3713f85f..9c8797c7 100644 --- a/server.go +++ b/server.go @@ -90,17 +90,19 @@ func HandleFailed(w ResponseWriter, r *Msg) { 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. func ListenAndServe(addr string, network string, handler Handler) error { server := &Server{Addr: addr, Net: network, Handler: handler} return server.ListenAndServe() } -// Start a server with these listeners. Invoke handler for incoming queries. -func StartAndServe(ls []net.Listener, ps []net.PacketConn, handler Handler) error { - server := &Server{Listeners: ls, PacketConns: ps, Handler: handler} - return server.StartAndServe() +// ActivateAndServe activates a server with a listener, l and p should not both be non-nil. +// If both l and p are not nil only p will be used. +// Invoke handler for incoming queries. +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 { @@ -203,10 +205,10 @@ type Server struct { Addr string // if "tcp" it will invoke a TCP listener, otherwise an UDP one. Net string - // TCP Listeners to use, this is to aid in systemd's socket activation. - Listeners []net.Listener - // UDP "Listeners" to use, this is to aid in systemd's socket activation. - PacketConns []net.PacketConn + // TCP Listener to use, this is to aid in systemd's socket activation. + Listener net.Listener + // UDP "Listener" to use, this is to aid in systemd's socket activation. + PacketConn net.PacketConn // Handler to invoke, dns.DefaultServeMux if nil. Handler Handler // 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"} } -// StartAndServe starts a nameserver with the first listener the or first -// packetconn configured in *Server. -func (srv *Server) StartAndServe() error { - if len(srv.Listeners) > 0 { - if t, ok := srv.Listeners[0].(*net.TCPListener); ok { - return srv.serveTCP(t) - } - } - if len(srv.PacketConns) > 0 { +// ActivateAndServe starts a nameserver with the PacketConn or Listener +// configured in *Server. +func (srv *Server) ActivateAndServe() error { + if srv.PacketConn != nil { if srv.UDPSize == 0 { 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 { return e } 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"} }