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:
parent
d80ad4aae5
commit
e1cb18539a
40
server.go
40
server.go
|
@ -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"}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue