// +build linux package server import ( "fmt" "net" "net/http" "github.com/docker/docker/daemon" "github.com/docker/docker/pkg/sockets" "github.com/docker/docker/pkg/systemd" ) // newServer sets up the required serverClosers and does protocol specific checking. func (s *Server) newServer(proto, addr string) ([]serverCloser, error) { var ( err error ls []net.Listener ) switch proto { case "fd": ls, err = systemd.ListenFD(addr) if err != nil { return nil, err } // We don't want to start serving on these sockets until the // daemon is initialized and installed. Otherwise required handlers // won't be ready. <-s.start case "tcp": l, err := s.initTcpSocket(addr) if err != nil { return nil, err } ls = append(ls, l) case "unix": l, err := sockets.NewUnixSocket(addr, s.cfg.SocketGroup, s.start) if err != nil { return nil, err } ls = append(ls, l) default: return nil, fmt.Errorf("Invalid protocol format: %q", proto) } var res []serverCloser for _, l := range ls { res = append(res, &HttpServer{ &http.Server{ Addr: addr, Handler: s.router, }, l, }) } return res, nil } func (s *Server) AcceptConnections(d *daemon.Daemon) { // Tell the init daemon we are accepting requests s.daemon = d go systemd.SdNotify("READY=1") // close the lock so the listeners start accepting connections select { case <-s.start: default: close(s.start) } }