From a1ee169d09b8d8c001e868d889c517fad4d1efaa Mon Sep 17 00:00:00 2001 From: Simon Hafner Date: Sat, 2 May 2015 05:28:53 +0500 Subject: implemented nextFreePort for nimsuggest --- compiler/nimsuggest/nimsuggest.nim | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) (limited to 'compiler') 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) -- cgit 1.4.1-2-gfad0