summary refs log tree commit diff stats
path: root/testament/lib/stdtest/netutils.nim
diff options
context:
space:
mode:
Diffstat (limited to 'testament/lib/stdtest/netutils.nim')
-rw-r--r--testament/lib/stdtest/netutils.nim12
1 files changed, 12 insertions, 0 deletions
diff --git a/testament/lib/stdtest/netutils.nim b/testament/lib/stdtest/netutils.nim
new file mode 100644
index 000000000..eb913a56a
--- /dev/null
+++ b/testament/lib/stdtest/netutils.nim
@@ -0,0 +1,12 @@
+import std/[nativesockets, asyncdispatch, os]
+
+proc bindAvailablePort*(handle: SocketHandle, port = Port(0)): Port =
+  block:
+    var name: Sockaddr_in
+    name.sin_family = typeof(name.sin_family)(toInt(AF_INET))
+    name.sin_port = htons(uint16(port))
+    name.sin_addr.s_addr = htonl(INADDR_ANY)
+    if bindAddr(handle, cast[ptr SockAddr](addr(name)),
+                sizeof(name).Socklen) < 0'i32:
+      raiseOSError(osLastError())
+  result = getLocalAddr(handle, AF_INET)[1]