|
@@ -8,6 +8,7 @@ import (
|
|
"net/http"
|
|
"net/http"
|
|
"strconv"
|
|
"strconv"
|
|
|
|
|
|
|
|
+ "github.com/Sirupsen/logrus"
|
|
"github.com/docker/docker/pkg/sockets"
|
|
"github.com/docker/docker/pkg/sockets"
|
|
"github.com/docker/libnetwork/portallocator"
|
|
"github.com/docker/libnetwork/portallocator"
|
|
|
|
|
|
@@ -90,24 +91,33 @@ func listenFD(addr string) ([]net.Listener, error) {
|
|
return nil, err
|
|
return nil, err
|
|
}
|
|
}
|
|
|
|
|
|
- if listeners == nil || len(listeners) == 0 {
|
|
|
|
|
|
+ if len(listeners) == 0 {
|
|
return nil, fmt.Errorf("No sockets found")
|
|
return nil, fmt.Errorf("No sockets found")
|
|
}
|
|
}
|
|
|
|
|
|
// default to all fds just like unix:// and tcp://
|
|
// default to all fds just like unix:// and tcp://
|
|
- if addr == "" {
|
|
|
|
- addr = "*"
|
|
|
|
|
|
+ if addr == "" || addr == "*" {
|
|
|
|
+ return listeners, nil
|
|
}
|
|
}
|
|
|
|
|
|
- fdNum, _ := strconv.Atoi(addr)
|
|
|
|
|
|
+ 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
|
|
fdOffset := fdNum - 3
|
|
- if (addr != "*") && (len(listeners) < int(fdOffset)+1) {
|
|
|
|
|
|
+ if len(listeners) < int(fdOffset)+1 {
|
|
return nil, fmt.Errorf("Too few socket activated files passed in")
|
|
return nil, fmt.Errorf("Too few socket activated files passed in")
|
|
}
|
|
}
|
|
-
|
|
|
|
- if addr == "*" {
|
|
|
|
- return listeners, nil
|
|
|
|
|
|
+ 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
|
|
return []net.Listener{listeners[fdOffset]}, nil
|
|
}
|
|
}
|