From 074778dab721be654474c265a804d984dc47b28c Mon Sep 17 00:00:00 2001 From: Alexander Morozov Date: Wed, 7 Oct 2015 14:23:53 -0700 Subject: [PATCH] Refactor listenFD function * fixed weird logic with "*" * return error if fdNum is failed to parse * check if listener at offset is nil * close unused listeners Signed-off-by: Alexander Morozov Upstream-commit: fb04043ca52f316ad9cea32ba44a168a68558356 Component: engine --- components/engine/api/server/server_unix.go | 34 +++++++++++++-------- 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/components/engine/api/server/server_unix.go b/components/engine/api/server/server_unix.go index e29180f0c8..c3d4def870 100644 --- a/components/engine/api/server/server_unix.go +++ b/components/engine/api/server/server_unix.go @@ -8,6 +8,7 @@ import ( "net/http" "strconv" + "github.com/Sirupsen/logrus" "github.com/docker/docker/pkg/sockets" "github.com/docker/libnetwork/portallocator" @@ -90,24 +91,33 @@ func listenFD(addr string) ([]net.Listener, error) { return nil, err } - if listeners == nil || len(listeners) == 0 { + if len(listeners) == 0 { return nil, fmt.Errorf("No sockets found") } // default to all fds just like unix:// and tcp:// - if addr == "" { - addr = "*" - } - - fdNum, _ := strconv.Atoi(addr) - fdOffset := fdNum - 3 - if (addr != "*") && (len(listeners) < int(fdOffset)+1) { - return nil, fmt.Errorf("Too few socket activated files passed in") - } - - if addr == "*" { + if addr == "" || addr == "*" { return listeners, nil } + fdNum, err := strconv.Atoi(addr) + if err != nil { + return nil, fmt.Errorf("failed to parse systemd address, should be number: %v", err) + } + fdOffset := fdNum - 3 + if len(listeners) < int(fdOffset)+1 { + return nil, fmt.Errorf("Too few socket activated files passed in") + } + if listeners[fdOffset] == nil { + return nil, fmt.Errorf("failed to listen on systemd activated file at fd %d", fdOffset+3) + } + for i, ls := range listeners { + if i == fdOffset || ls == nil { + continue + } + if err := ls.Close(); err != nil { + logrus.Errorf("Failed to close systemd activated file at fd %d: %v", fdOffset+3, err) + } + } return []net.Listener{listeners[fdOffset]}, nil }