summary refs log tree commit diff stats
path: root/lib/pure
diff options
context:
space:
mode:
authorDominik Picheta <dominikpicheta@gmail.com>2016-05-30 09:38:37 +0100
committerDominik Picheta <dominikpicheta@gmail.com>2016-05-30 09:38:37 +0100
commita484e3f8c214145eb36759792f8052a7f01ed396 (patch)
tree5af34245a1657888d89b9aeed57abe539fdc704d /lib/pure
parent3e8413d2a19410769e87290c6b7379c2b9dabc2d (diff)
parentb662d22ad181fae7fb0e9efc44fe3563406b236e (diff)
downloadNim-a484e3f8c214145eb36759792f8052a7f01ed396.tar.gz
Merge branch 'unix-sockets' of https://github.com/girvo/Nim into girvo-unix-sockets
Diffstat (limited to 'lib/pure')
-rw-r--r--lib/pure/nativesockets.nim2
-rw-r--r--lib/pure/net.nim28
2 files changed, 27 insertions, 3 deletions
diff --git a/lib/pure/nativesockets.nim b/lib/pure/nativesockets.nim
index 68ab7742b..15828ff35 100644
--- a/lib/pure/nativesockets.nim
+++ b/lib/pure/nativesockets.nim
@@ -27,7 +27,7 @@ else:
   import posix
   export fcntl, F_GETFL, O_NONBLOCK, F_SETFL, EAGAIN, EWOULDBLOCK, MSG_NOSIGNAL,
     EINTR, EINPROGRESS, ECONNRESET, EPIPE, ENETRESET
-  export Sockaddr_storage
+  export Sockaddr_storage, Sockaddr_un, Sockaddr_un_path_length
 
 export SocketHandle, Sockaddr_in, Addrinfo, INADDR_ANY, SockAddr, SockLen,
   Sockaddr_in6,
diff --git a/lib/pure/net.nim b/lib/pure/net.nim
index 195b58832..c734fe893 100644
--- a/lib/pure/net.nim
+++ b/lib/pure/net.nim
@@ -68,6 +68,7 @@
 {.deadCodeElim: on.}
 import nativesockets, os, strutils, parseutils, times
 export Port, `$`, `==`
+export Domain, SockType, Protocol
 
 const useWinVersion = defined(Windows) or defined(nimdoc)
 const defineSsl = defined(ssl) or defined(nimdoc)
@@ -605,9 +606,32 @@ proc setSockOpt*(socket: Socket, opt: SOBool, value: bool, level = SOL_SOCKET) {
   var valuei = cint(if value: 1 else: 0)
   setSockOptInt(socket.fd, cint(level), toCInt(opt), valuei)
 
-when defineSsl:
+when defined(posix) or defined(nimdoc):
+  proc makeUnixAddr(path: string): Sockaddr_un =
+    result.sun_family = AF_UNIX.toInt
+    if path.len >= Sockaddr_un_path_length:
+      raise newException(ValueError, "socket path too long")
+    copyMem(addr result.sun_path, path.cstring, path.len + 1)
+
+  proc connectUnix*(socket: Socket, path: string) =
+    ## Connects to Unix socket on `path`.
+    ## This only works on Unix-style systems: Mac OS X, BSD and Linux
+    var socketAddr = makeUnixAddr(path)
+    if socket.fd.connect(cast[ptr SockAddr](addr socketAddr),
+                      sizeof(socketAddr).Socklen) != 0'i32:
+      raiseOSError(osLastError())
+
+  proc bindUnix*(socket: Socket, path: string) =
+    ## Binds Unix socket to `path`.
+    ## This only works on Unix-style systems: Mac OS X, BSD and Linux
+    var socketAddr = makeUnixAddr(path)
+    if socket.fd.bindAddr(cast[ptr SockAddr](addr socketAddr),
+                          sizeof(socketAddr).Socklen) != 0'i32:
+      raiseOSError(osLastError())
+
+when defined(ssl):
   proc handshake*(socket: Socket): bool
-      {.tags: [ReadIOEffect, WriteIOEffect], deprecated.} =
+    {.tags: [ReadIOEffect, WriteIOEffect], deprecated.} =
     ## This proc needs to be called on a socket after it connects. This is
     ## only applicable when using ``connectAsync``.
     ## This proc performs the SSL handshake.