@@ -2,9 +2,9 @@ package main
2
2
3
3
import (
4
4
"context"
5
- "errors"
6
5
"flag"
7
6
"fmt"
7
+ "math/rand"
8
8
"net"
9
9
"net/http"
10
10
"os"
@@ -19,6 +19,10 @@ import (
19
19
"go.coder.com/flog"
20
20
)
21
21
22
+ func init () {
23
+ rand .Seed (time .Now ().Unix ())
24
+ }
25
+
22
26
func main () {
23
27
skipSyncFlag := flag .Bool ("skipsync" , false , "skip syncing local settings and extensions to remote host" )
24
28
flag .Usage = func () {
@@ -74,9 +78,9 @@ mkdir -p ~/.local/share/code-server
74
78
}
75
79
76
80
flog .Info ("starting code-server..." )
77
- localPort , err := scanAvailablePort ()
81
+ localPort , err := randomPort ()
78
82
if err != nil {
79
- flog .Fatal ("failed to scan available port: %v" , err )
83
+ flog .Fatal ("failed to find available port: %v" , err )
80
84
}
81
85
82
86
// Starts code-server and forwards the remote port.
@@ -153,20 +157,24 @@ func commandExists(name string) bool {
153
157
return err == nil
154
158
}
155
159
156
- // scanAvailablePort scans 1024-4096 until an available port is found.
157
- func scanAvailablePort () (string , error ) {
158
- for port := 1024 ; port < 4096 ; port ++ {
160
+ // randomPort picks a random port to start code-server on.
161
+ func randomPort () (string , error ) {
162
+ const (
163
+ minPort = 1024
164
+ maxPort = 65535
165
+ maxTries = 10
166
+ )
167
+ for i := 0 ; i < maxTries ; i ++ {
168
+ port := rand .Intn (maxPort - minPort + 1 ) + minPort
159
169
l , err := net .Listen ("tcp" , fmt .Sprintf (":%d" , port ))
160
- if err ! = nil {
161
- // If we have an error the port is taken.
162
- continue
170
+ if err = = nil {
171
+ _ = l . Close ()
172
+ return strconv . Itoa ( port ), nil
163
173
}
164
- _ = l .Close ()
165
-
166
- return strconv .Itoa (port ), nil
174
+ flog .Info ("port taken: %d" , port )
167
175
}
168
176
169
- return "" , errors . New ( "no ports available" )
177
+ return "" , xerrors . Errorf ( "max number of tries exceeded: %d" , maxTries )
170
178
}
171
179
172
180
func syncUserSettings (host string ) error {
0 commit comments