@@ -3,11 +3,14 @@ package cli
33import (
44 "bufio"
55 "context"
6+ "errors"
67 "fmt"
78 "io"
89 "log"
10+ "net"
911 "os"
1012 "os/signal"
13+ "strconv"
1114 "strings"
1215 "syscall"
1316 "time"
@@ -75,15 +78,18 @@ func UpRun(r *cmd.Root, c *cmd.Sub) {
7578
7679 if ! flags .Foreground {
7780 // Make results chan
78- out := make (chan bool )
81+ out := make (chan error )
7982 go createDaemon (out )
8083
8184 select {
82- case <- out :
85+ case err = <- out :
8386 case <- time .After (30 * time .Second ):
8487 }
85- checkErr (err )
86- fmt .Println ("[+] Successfully Created Hyprspace Daemon" )
88+ if err != nil {
89+ fmt .Println ("[+] Failed to Create Hyprspace Daemon" )
90+ } else {
91+ fmt .Println ("[+] Successfully Created Hyprspace Daemon" )
92+ }
8793 return
8894 }
8995
@@ -96,7 +102,9 @@ func UpRun(r *cmd.Root, c *cmd.Sub) {
96102 fmt .Println ("[+] Creating TUN Device" )
97103 // Create new TUN device
98104 iface , err = tun .New (Global .Interface .Name )
99- checkErr (err )
105+ if err != nil {
106+ checkErr (errors .New ("interface already in use" ))
107+ }
100108 // Set TUN MTU
101109 tun .SetMTU (Global .Interface .Name , 1420 )
102110 // Add Address to Interface
@@ -106,8 +114,35 @@ func UpRun(r *cmd.Root, c *cmd.Sub) {
106114 ctx := context .Background ()
107115
108116 fmt .Println ("[+] Creating LibP2P Node" )
117+
118+ // Check that the listener port is available.
119+ var ln net.Listener
120+ port := Global .Interface .ListenPort
121+ if port != 8001 {
122+ ln , err = net .Listen ("tcp" , ":" + strconv .Itoa (port ))
123+ if err != nil {
124+ checkErr (errors .New ("could not create node, listen port already in use by something else" ))
125+ }
126+ } else {
127+ for {
128+ ln , err = net .Listen ("tcp" , ":" + strconv .Itoa (port ))
129+ if err == nil {
130+ break
131+ }
132+ if port >= 65535 {
133+ checkErr (errors .New ("failed to find open port" ))
134+ }
135+ port ++
136+ }
137+ }
138+ if ln != nil {
139+ ln .Close ()
140+ }
109141 // Create P2P Node
110- host , dht , err := p2p .CreateNode (ctx , Global .Interface .PrivateKey , streamHandler )
142+ host , dht , err := p2p .CreateNode (ctx ,
143+ Global .Interface .PrivateKey ,
144+ port ,
145+ streamHandler )
111146 checkErr (err )
112147
113148 // Setup Peer Table for Quick Packet --> Dest ID lookup
@@ -162,7 +197,7 @@ func UpRun(r *cmd.Root, c *cmd.Sub) {
162197 }
163198}
164199
165- func createDaemon (out chan <- bool ) {
200+ func createDaemon (out chan <- error ) {
166201 path , err := os .Executable ()
167202 checkErr (err )
168203 // Create Pipe to monitor for daemon output.
@@ -173,7 +208,7 @@ func createDaemon(out chan<- bool) {
173208 path ,
174209 append (os .Args , "--foreground" ),
175210 & os.ProcAttr {
176- Files : []* os.File {nil , w , nil },
211+ Files : []* os.File {nil , w , w },
177212 },
178213 )
179214 checkErr (err )
@@ -186,7 +221,10 @@ func createDaemon(out chan<- bool) {
186221 fmt .Println (scanner .Text ())
187222 err = process .Release ()
188223 checkErr (err )
189- out <- true
224+ if count < 4 {
225+ out <- errors .New ("failed to create daemon" )
226+ }
227+ out <- nil
190228}
191229
192230func streamHandler (stream network.Stream ) {
0 commit comments