Exceptions and handles fixes.

This commit is contained in:
cheatfate 2019-05-10 08:27:05 +03:00
parent 454571f943
commit 939e461d04
No known key found for this signature in database
GPG Key ID: 46ADD633A7201F95
2 changed files with 13 additions and 24 deletions

View File

@ -42,48 +42,37 @@ proc setSocketBlocking*(s: SocketHandle, blocking: bool): bool =
proc setSockOpt*(socket: AsyncFD, level, optname, optval: int): bool =
## `setsockopt()` for integer options.
## Returns ``true`` on success, ``false`` on error.
result = true
var value = cint(optval)
if setsockopt(SocketHandle(socket), cint(level), cint(optname), addr(value),
sizeof(value).SockLen) < 0'i32:
result = false
result = setsockopt(SocketHandle(socket), cint(level), cint(optname),
addr(value), SockLen(sizeof(value))) >= cint(0)
proc setSockOpt*(socket: AsyncFD, level, optname: int, value: pointer,
valuelen: int): bool =
## `setsockopt()` for custom options (pointer and length).
## Returns ``true`` on success, ``false`` on error.
result = true
if setsockopt(SocketHandle(socket), cint(level), cint(optname), value,
Socklen(valuelen)) < 0'i32:
result = false
result = setsockopt(SocketHandle(socket), cint(level), cint(optname), value,
SockLen(valuelen)) >= cint(0)
proc getSockOpt*(socket: AsyncFD, level, optname: int, value: var int): bool =
## `getsockopt()` for integer options.
## Returns ``true`` on success, ``false`` on error.
var res: cint
var size = sizeof(res).SockLen
result = true
var size = SockLen(sizeof(res))
if getsockopt(SocketHandle(socket), cint(level), cint(optname),
addr(res), addr(size)) < 0'i32:
return false
value = int(res)
addr(res), addr(size)) >= cint(0):
value = int(res)
result = true
proc getSockOpt*(socket: AsyncFD, level, optname: int, value: pointer,
valuelen: var int): bool =
## `getsockopt()` for custom options (pointer and length).
## Returns ``true`` on success, ``false`` on error.
var res: cint
result = true
if getsockopt(SocketHandle(socket), cint(level), cint(optname),
value, cast[ptr Socklen](addr valuelen)) < 0'i32:
result = false
result = getsockopt(SocketHandle(socket), cint(level), cint(optname),
value, cast[ptr Socklen](addr valuelen)) >= cint(0)
proc getSocketError*(socket: AsyncFD, err: var int): bool =
## Recover error code associated with socket handle ``socket``.
if not getSockOpt(socket, cint(SOL_SOCKET), cint(SO_ERROR), err):
result = false
else:
result = true
result = getSockOpt(socket, cint(SOL_SOCKET), cint(SO_ERROR), err)
proc createAsyncSocket*(domain: Domain, sockType: SockType,
protocol: Protocol): AsyncFD =

View File

@ -83,9 +83,9 @@ type
AsyncStreamRW* = AsyncStreamReader | AsyncStreamWriter
AsyncStreamError* = object of Exception
AsyncStreamError* = object of CatchableError
AsyncStreamIncompleteError* = object of AsyncStreamError
AsyncStreamIncorrectError* = object of AsyncStreamError
AsyncStreamIncorrectError* = object of Defect
AsyncStreamLimitError* = object of AsyncStreamError
AsyncStreamReadError* = object of AsyncStreamError
par*: ref Exception