aboutsummaryrefslogtreecommitdiff
path: root/server/server.go
diff options
context:
space:
mode:
Diffstat (limited to 'server/server.go')
-rw-r--r--server/server.go47
1 files changed, 15 insertions, 32 deletions
diff --git a/server/server.go b/server/server.go
index 0ba6f7f01..b0f89468e 100644
--- a/server/server.go
+++ b/server/server.go
@@ -28,13 +28,10 @@ import (
// the same address and the listener may be stopped for
// graceful termination (POSIX only).
type Server struct {
- Addr string // Address we listen on
- mux *dns.ServeMux
- server [2]*dns.Server // by convention 0 is tcp and 1 is udp
-
- tcp net.Listener
- udp net.PacketConn
- listenerMu sync.Mutex // protects listener and packetconn
+ Addr string // Address we listen on
+ mux *dns.ServeMux
+ server [2]*dns.Server // by convention 0 is tcp and 1 is udp
+ listenerMu sync.Mutex // protects listener and packetconn inside server
tls bool // whether this server is serving all HTTPS hosts or not
TLSConfig *tls.Config
@@ -115,16 +112,6 @@ func New(addr string, configs []Config, gracefulTimeout time.Duration) (*Server,
return s, nil
}
-// LocalAddr return the addresses where the server is bound to. The TCP listener
-// address is the first returned, the UDP conn address the second.
-func (s *Server) LocalAddr() (net.Addr, net.Addr) {
- s.listenerMu.Lock()
- tcp := s.tcp.Addr()
- udp := s.udp.LocalAddr()
- s.listenerMu.Unlock()
- return tcp, udp
-}
-
// Serve starts the server with an existing listener. It blocks until the server stops.
func (s *Server) Serve(ln net.Listener, pc net.PacketConn) error {
err := s.setup()
@@ -134,9 +121,7 @@ func (s *Server) Serve(ln net.Listener, pc net.PacketConn) error {
}
s.listenerMu.Lock()
s.server[0] = &dns.Server{Listener: ln, Net: "tcp", Handler: s.mux}
- s.tcp = ln
s.server[1] = &dns.Server{PacketConn: pc, Net: "udp", Handler: s.mux}
- s.udp = pc
s.listenerMu.Unlock()
go func() {
@@ -168,9 +153,7 @@ func (s *Server) ListenAndServe() error {
s.listenerMu.Lock()
s.server[0] = &dns.Server{Listener: l, Net: "tcp", Handler: s.mux}
- s.tcp = l
s.server[1] = &dns.Server{PacketConn: pc, Net: "udp", Handler: s.mux}
- s.udp = pc
s.listenerMu.Unlock()
go func() {
@@ -252,17 +235,17 @@ func (s *Server) Stop() (err error) {
// Close the listener now; this stops the server without delay
s.listenerMu.Lock()
- if s.tcp != nil {
- err = s.tcp.Close()
- }
- if s.udp != nil {
- err = s.udp.Close()
- }
+ defer s.listenerMu.Unlock()
for _, s1 := range s.server {
+ if s1.Listener != nil {
+ err = s1.Listener.Close()
+ }
+ if s1.PacketConn != nil {
+ err = s1.PacketConn.Close()
+ }
err = s1.Shutdown()
}
- s.listenerMu.Unlock()
return
}
@@ -280,8 +263,8 @@ func (s *Server) WaitUntilStarted() {
func (s *Server) ListenerFd() *os.File {
s.listenerMu.Lock()
defer s.listenerMu.Unlock()
- if s.tcp != nil {
- file, _ := s.tcp.(*net.TCPListener).File()
+ if s.server[0].Listener != nil {
+ file, _ := s.server[0].Listener.(*net.TCPListener).File()
return file
}
return nil
@@ -293,8 +276,8 @@ func (s *Server) ListenerFd() *os.File {
func (s *Server) PacketConnFd() *os.File {
s.listenerMu.Lock()
defer s.listenerMu.Unlock()
- if s.udp != nil {
- file, _ := s.udp.(*net.UDPConn).File()
+ if s.server[1].PacketConn != nil {
+ file, _ := s.server[1].PacketConn.(*net.UDPConn).File()
return file
}
return nil