summary refs log tree commit diff stats
path: root/lib/pure
diff options
context:
space:
mode:
authorAndrew Yourtchenko <ayourtch@gmail.com>2015-06-23 22:59:48 +0200
committerAndrew Yourtchenko <ayourtch@gmail.com>2015-06-23 22:59:48 +0200
commitf340f76f45170535effa959543f4a458e1964815 (patch)
treea74d20af5cea61c89bc46f5663a34bd037ad4ef1 /lib/pure
parent5f371e1504a7a0cc18262b4b7e2ad55de3ab8325 (diff)
downloadNim-f340f76f45170535effa959543f4a458e1964815.tar.gz
Add getSockDomain to return AF_INET or AF_INET6 of a SocketHandle.
Diffstat (limited to 'lib/pure')
-rw-r--r--lib/pure/rawsockets.nim15
1 files changed, 15 insertions, 0 deletions
diff --git a/lib/pure/rawsockets.nim b/lib/pure/rawsockets.nim
index 6d656c983..c99f9a7a9 100644
--- a/lib/pure/rawsockets.nim
+++ b/lib/pure/rawsockets.nim
@@ -315,6 +315,21 @@ proc getHostByName*(name: string): Hostent {.tags: [ReadIOEffect].} =
   result.addrList = cstringArrayToSeq(s.h_addr_list)
   result.length = int(s.h_length)
 
+proc getSockDomain*(socket: SocketHandle): Domain =
+  ## returns the socket's domain (AF_INET or AF_INET6).
+  var name: SockAddr
+  var namelen = sizeof(name).SockLen
+  if getsockname(socket, cast[ptr SockAddr](addr(name)),
+                 addr(namelen)) == -1'i32:
+    raiseOSError(osLastError())
+  if name.sa_family == posix.AF_INET:
+    result = AF_INET
+  elif name.sa_family == posix.AF_INET6:
+    result = AF_INET6
+  else:
+    raise newException(OSError, "unknown socket family in getSockFamily")
+
+
 proc getSockName*(socket: SocketHandle): Port = 
   ## returns the socket's associated port number.
   var name: Sockaddr_in