summary refs log tree commit diff stats
path: root/compiler
diff options
context:
space:
mode:
authorSimon Hafner <hafnersimon@gmail.com>2015-05-02 05:28:53 +0500
committerSimon Hafner <hafnersimon@gmail.com>2015-05-02 05:28:53 +0500
commita1ee169d09b8d8c001e868d889c517fad4d1efaa (patch)
treed1331534b51cd9aaaf80bdc02a26a64af6d4626f /compiler
parent39378823ae5c0df8d2baa4e1ee07b71786736bef (diff)
downloadNim-a1ee169d09b8d8c001e868d889c517fad4d1efaa.tar.gz
implemented nextFreePort for nimsuggest
Diffstat (limited to 'compiler')
-rw-r--r--compiler/nimsuggest/nimsuggest.nim25
1 files changed, 21 insertions, 4 deletions
diff --git a/compiler/nimsuggest/nimsuggest.nim b/compiler/nimsuggest/nimsuggest.nim
index 7e0d3a399..00b3bcbfd 100644
--- a/compiler/nimsuggest/nimsuggest.nim
+++ b/compiler/nimsuggest/nimsuggest.nim
@@ -13,6 +13,11 @@ import strutils, os, parseopt, parseutils, sequtils, net
 import options, commands, modules, sem, passes, passaux, msgs, nimconf,
   extccomp, condsyms, lists, net, rdstdin, sexp, suggest, ast
 
+when defined(windows):
+  import winlean
+else:
+  import posix
+
 const Usage = """
 Nimsuggest - Tool to give every editor IDE like capabilities for Nim
 Usage:
@@ -130,8 +135,21 @@ proc returnEPC(socket: var Socket, uid: string, s: SexpNode, return_symbol = "re
   socket.send(response)
   socket.close()
 
-proc findEPCPort(): int =
-  55822 # guaranteed to be random
+proc nextFreePort(server: Socket, host: string, start = 30000): int =
+  result = start
+  while true:
+    try:
+      server.bindaddr(Port(result), host)
+      return
+    except OsError:
+      when defined(windows):
+        let checkFor = WSAEADDRINUSE.OSErrorCode
+      else:
+        let checkFor = EADDRINUSE.OSErrorCode
+      if osLastError() != checkFor:
+        raise getCurrentException()
+      else:
+        result += 1
 
 proc parseCmdLine(cmd: string) =
   template toggle(sw) =
@@ -199,9 +217,8 @@ proc serve() =
       stdoutSocket.send("\c\L")
       stdoutSocket.close()
   of mepc:
-    let port = findEPCPort()
     var server = newSocket()
-    server.bindaddr(Port(port), "localhost")
+    let port = nextFreePort(server, "localhost")
     var inp = "".TaintedString
     server.listen()
     echo(port)