aboutsummaryrefslogtreecommitdiff
path: root/server
diff options
context:
space:
mode:
authorGravatar Miek Gieben <miek@miek.nl> 2016-03-19 19:38:54 +0000
committerGravatar Miek Gieben <miek@miek.nl> 2016-03-19 19:38:54 +0000
commit33f00b5a3a70839670178d4e3c60e642067a16f4 (patch)
treeb2143477c6b4cd2c2df309ec83f1fb1cc7a3df3a /server
parent9d14d5fcf03551b9c18633581231cc4618b5a4f5 (diff)
downloadcoredns-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.go30
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)
}