Merge pull request #828 from ehazlett/vbox-tcp-port

vbox: fix race with getting a tcp port
This commit is contained in:
Evan Hazlett 2015-03-31 11:52:25 -04:00
commit cfeffa530f
1 changed files with 20 additions and 10 deletions

View File

@ -632,15 +632,25 @@ func zeroFill(w io.Writer, n int64) error {
}
func getAvailableTCPPort() (int, error) {
// FIXME: this has a race condition between finding an available port and
// virtualbox using that port. Perhaps we should randomly pick an unused
// port in a range not used by kernel for assigning ports
ln, err := net.Listen("tcp4", "127.0.0.1:0")
if err != nil {
return 0, err
port := 0
for i := 0; i <= 10; i++ {
ln, err := net.Listen("tcp4", "127.0.0.1:0")
if err != nil {
return 0, err
}
defer ln.Close()
addr := ln.Addr().String()
addrParts := strings.SplitN(addr, ":", 2)
p, err := strconv.Atoi(addrParts[1])
if err != nil {
return 0, err
}
if p != 0 {
port = p
return port, nil
}
time.Sleep(1)
}
defer ln.Close()
addr := ln.Addr().String()
addrParts := strings.SplitN(addr, ":", 2)
return strconv.Atoi(addrParts[1])
return 0, fmt.Errorf("unable to allocate tcp port")
}