Better handling of when the specified port is already in use - hugo - [fork] hugo port for 9front
HTML git clone git@git.drkhsh.at/hugo.git
DIR Log
DIR Files
DIR Refs
DIR Submodules
DIR README
DIR LICENSE
---
DIR commit 296d218e6704e73b3261bca6f5f72b3569cf899b
DIR parent b520f8852d566f778ad13e2201adcf71c7d42d34
HTML Author: spf13 <steve.francia@gmail.com>
Date: Thu, 15 May 2014 15:07:46 -0400
Better handling of when the specified port is already in use
Diffstat:
M commands/server.go | 14 ++++++++++++++
M helpers/general.go | 15 +++++++++++++++
2 files changed, 29 insertions(+), 0 deletions(-)
---
DIR diff --git a/commands/server.go b/commands/server.go
@@ -15,6 +15,7 @@ package commands
import (
"fmt"
+ "net"
"net/http"
"os"
"strconv"
@@ -56,6 +57,19 @@ func server(cmd *cobra.Command, args []string) {
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 {
viper.Set("BaseUrl", strings.TrimSuffix(BaseUrl, "/")+":"+strconv.Itoa(serverPort))
} else {
DIR diff --git a/helpers/general.go b/helpers/general.go
@@ -15,6 +15,8 @@ package helpers
import (
"bytes"
+ "fmt"
+ "net"
"strings"
)
@@ -49,3 +51,16 @@ func StripHTML(s string) 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
+}