ref: 296d218e6704e73b3261bca6f5f72b3569cf899b
parent: b520f8852d566f778ad13e2201adcf71c7d42d34
author: spf13 <steve.francia@gmail.com>
date: Thu May 15 11:07:46 EDT 2014
Better handling of when the specified port is already in use
--- a/commands/server.go
+++ b/commands/server.go
@@ -15,6 +15,7 @@
import (
"fmt"
+ "net"
"net/http"
"os"
"strconv"
@@ -54,6 +55,19 @@
if !strings.HasPrefix(BaseUrl, "http://") {BaseUrl = "http://" + BaseUrl
+ }
+
+ l, err := net.Listen("tcp", ":"+strconv.Itoa(serverPort))+ if err == nil {+ l.Close()
+ } else {+ jww.ERROR.Println("port", serverPort, "already in use, attempting to use an available port")+ sp, err := helpers.FindAvailablePort()
+ if err != nil {+ jww.ERROR.Println("Unable to find alternative port to use")+ jww.ERROR.Fatalln(err)
+ }
+ serverPort = sp.Port
}
if serverAppend {--- a/helpers/general.go
+++ b/helpers/general.go
@@ -15,6 +15,8 @@
import (
"bytes"
+ "fmt"
+ "net"
"strings"
)
@@ -48,4 +50,17 @@
output = b.String()
}
return output
+}
+
+func FindAvailablePort() (*net.TCPAddr, error) {+ l, err := net.Listen("tcp", ":0")+ if err == nil {+ defer l.Close()
+ addr := l.Addr()
+ if a, ok := addr.(*net.TCPAddr); ok {+ return a, nil
+ }
+ return nil, fmt.Errorf("Unable to obtain a valid tcp port. %v", addr)+ }
+ return nil, err
}
--
⑨