net.nim: add support for Unix sockets

This commit is contained in:
Michał Zieliński 2015-10-28 19:55:04 +01:00
commit da308be2d7
5 changed files with 57 additions and 2 deletions

View file

@ -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,

View file

@ -10,8 +10,9 @@
## This module implements a high-level cross-platform sockets interface.
{.deadCodeElim: on.}
import nativesockets, os, strutils, unsigned, parseutils, times
import nativesockets, os, strutils, parseutils, times
export Port, `$`, `==`
export Domain, SockType, Protocol
const useWinVersion = defined(Windows) or defined(nimdoc)
@ -582,6 +583,27 @@ proc connect*(socket: Socket, address: string,
let ret = SSLConnect(socket.sslHandle)
socketError(socket, ret)
when defined(posix):
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`.
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`.
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].} =
## This proc needs to be called on a socket after it connects. This is