shithub: hugo

Download patch

ref: 296d218e6704e73b3261bca6f5f72b3569cf899b
parent: b520f8852d566f778ad13e2201adcf71c7d42d34
author: spf13 <[email protected]>
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
 }