diff --git a/packer/rpc/port.go b/packer/rpc/port.go index 94f9ee446..e12241781 100644 --- a/packer/rpc/port.go +++ b/packer/rpc/port.go @@ -5,8 +5,8 @@ import ( "net" ) -var portRangeMin int = 0 -var portRangeMax int = 0 +var portRangeMin int = 10000 +var portRangeMax int = 11000 // This sets the port range that the RPC stuff will use when creating // new temporary servers. Some RPC calls require the creation of temporary diff --git a/packer/rpc/server.go b/packer/rpc/server.go index a6a029fda..b3783de85 100644 --- a/packer/rpc/server.go +++ b/packer/rpc/server.go @@ -10,21 +10,23 @@ import ( // A Server is a Golang RPC server that has helper methods for automatically // setting up the endpoints for Packer interfaces. type Server struct { + listener net.Listener server *rpc.Server - started bool - doneChan chan bool } // Creates and returns a new Server. func NewServer() *Server { return &Server{ server: rpc.NewServer(), - started: false, } } func (s *Server) Address() string { - return ":2345" + if s.listener == nil { + panic("Server not listening.") + } + + return s.listener.Addr().String() } func (s *Server) RegisterUi(ui packer.Ui) { @@ -32,29 +34,21 @@ func (s *Server) RegisterUi(ui packer.Ui) { } func (s *Server) Start() error { - if s.started { + if s.listener != nil { return errors.New("Server already started.") } - // TODO: Address - address := ":2345" - - // Mark that we started and setup the channel we'll use to mark exits - s.started = true - s.doneChan = make(chan bool) - // Start the TCP listener and a goroutine responsible for cleaning up the // listener. - listener, _ := net.Listen("tcp", address) - go func() { - <-s.doneChan - listener.Close() - }() + s.listener = netListenerInRange(portRangeMin, portRangeMax) + if s.listener == nil { + return errors.New("Could not open a port ot listen on.") + } // Start accepting connections go func() { for { - conn, err := listener.Accept() + conn, err := s.listener.Accept() if err != nil { break } @@ -67,11 +61,8 @@ func (s *Server) Start() error { } func (s *Server) Stop() { - if s.started { - // TODO: There is a race condition here, we need to wait for - // the listener to REALLY close. - s.doneChan <- true - s.started = false - s.doneChan = nil + if s.listener != nil { + s.listener.Close() + s.listener = nil } }