github.com/codemac/docker@v1.2.1-0.20150518222241-6a18412d5b9c/api/server/server_linux.go (about) 1 // +build linux 2 3 package server 4 5 import ( 6 "fmt" 7 "net" 8 "net/http" 9 10 "github.com/Sirupsen/logrus" 11 "github.com/docker/docker/daemon" 12 "github.com/docker/docker/pkg/systemd" 13 ) 14 15 // newServer sets up the required serverCloser and does protocol specific checking. 16 func (s *Server) newServer(proto, addr string) (serverCloser, error) { 17 var ( 18 err error 19 l net.Listener 20 ) 21 switch proto { 22 case "fd": 23 ls, err := systemd.ListenFD(addr) 24 if err != nil { 25 return nil, err 26 } 27 chErrors := make(chan error, len(ls)) 28 // We don't want to start serving on these sockets until the 29 // daemon is initialized and installed. Otherwise required handlers 30 // won't be ready. 31 <-s.start 32 // Since ListenFD will return one or more sockets we have 33 // to create a go func to spawn off multiple serves 34 for i := range ls { 35 listener := ls[i] 36 go func() { 37 httpSrv := http.Server{Handler: s.router} 38 chErrors <- httpSrv.Serve(listener) 39 }() 40 } 41 for i := 0; i < len(ls); i++ { 42 if err := <-chErrors; err != nil { 43 return nil, err 44 } 45 } 46 return nil, nil 47 case "tcp": 48 if !s.cfg.TlsVerify { 49 logrus.Warn("/!\\ DON'T BIND ON ANY IP ADDRESS WITHOUT setting -tlsverify IF YOU DON'T KNOW WHAT YOU'RE DOING /!\\") 50 } 51 if l, err = NewTcpSocket(addr, tlsConfigFromServerConfig(s.cfg), s.start); err != nil { 52 return nil, err 53 } 54 if err := allocateDaemonPort(addr); err != nil { 55 return nil, err 56 } 57 case "unix": 58 if l, err = NewUnixSocket(addr, s.cfg.SocketGroup, s.start); err != nil { 59 return nil, err 60 } 61 default: 62 return nil, fmt.Errorf("Invalid protocol format: %q", proto) 63 } 64 return &HttpServer{ 65 &http.Server{ 66 Addr: addr, 67 Handler: s.router, 68 }, 69 l, 70 }, nil 71 } 72 73 func (s *Server) AcceptConnections(d *daemon.Daemon) { 74 // Tell the init daemon we are accepting requests 75 s.daemon = d 76 go systemd.SdNotify("READY=1") 77 // close the lock so the listeners start accepting connections 78 select { 79 case <-s.start: 80 default: 81 close(s.start) 82 } 83 }