diff options
author | 2016-03-19 19:38:54 +0000 | |
---|---|---|
committer | 2016-03-19 19:38:54 +0000 | |
commit | 33f00b5a3a70839670178d4e3c60e642067a16f4 (patch) | |
tree | b2143477c6b4cd2c2df309ec83f1fb1cc7a3df3a /server | |
parent | 9d14d5fcf03551b9c18633581231cc4618b5a4f5 (diff) | |
download | coredns-33f00b5a3a70839670178d4e3c60e642067a16f4.tar.gz coredns-33f00b5a3a70839670178d4e3c60e642067a16f4.tar.zst coredns-33f00b5a3a70839670178d4e3c60e642067a16f4.zip |
Fix failing on startup
When we cannot bind to the port, return an error which will make
CoreDNS fail startup. Still a bit hackish, but good enough.
Diffstat (limited to 'server')
-rw-r--r-- | server/server.go | 30 |
1 files changed, 8 insertions, 22 deletions
diff --git a/server/server.go b/server/server.go index 0db2614bb..28f513b06 100644 --- a/server/server.go +++ b/server/server.go @@ -134,36 +134,21 @@ func (s *Server) Serve(ln ListenerFile) error { // ListenAndServe starts the server with a new listener. It blocks until the server stops. func (s *Server) ListenAndServe() error { err := s.setup() - once := sync.Once{} - if err != nil { close(s.startChan) return err } - // TODO(miek): redo to make it more like caddy - // - error handling, re-introduce what Caddy did. + // TODO(miek): going out on a limb here, let's assume that listening + // on the part for tcp and udp results in the same error. We can only + // return the error from the udp listener, disregarding whatever + // happenend to the tcp one. go func() { - if err := dns.ListenAndServe(s.Addr, "tcp", s.mux); err != nil { - log.Printf("[ERROR] %v\n", err) - defer once.Do(func() { close(s.startChan) }) - return - } + dns.ListenAndServe(s.Addr, "tcp", s.mux) }() - go func() { - if err := dns.ListenAndServe(s.Addr, "udp", s.mux); err != nil { - log.Printf("[ERROR] %v\n", err) - defer once.Do(func() { close(s.startChan) }) - return - } - }() - once.Do(func() { close(s.startChan) }) // unblock anyone waiting for this to start listening - // but block here, as this is what caddy expects - for { - select {} - } - return nil + close(s.startChan) // unblock anyone waiting for this to start listening + return dns.ListenAndServe(s.Addr, "udp", s.mux) } // setup prepares the server s to begin listening; it should be @@ -315,6 +300,7 @@ func (s *Server) ServeDNS(w dns.ResponseWriter, r *dns.Msg) { // Wildcard match, if we have found nothing try the root zone as a last resort. if h, ok := s.zones["."]; ok { rcode, _ := h.stack.ServeDNS(ctx, w, r) + // TODO(miek): Double check if we have written something. if rcode > 0 { DefaultErrorFunc(w, r, rcode) } |