add getprotobyname (#15273)
* add getprotobyname * tests, docs, changelog * add since
This commit is contained in:
parent
7d4f0df107
commit
8c82144ba5
4 changed files with 56 additions and 0 deletions
|
|
@ -168,6 +168,9 @@
|
||||||
cannot be applied to every use case. The limitations and the (lack of) reliability
|
cannot be applied to every use case. The limitations and the (lack of) reliability
|
||||||
of `round` are well documented.
|
of `round` are well documented.
|
||||||
|
|
||||||
|
- Add `getprotobyname` to `winlean`. Add `getProtoByname` to `nativesockets` which returns a protocol code
|
||||||
|
from the database that matches the protocol `name`.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Language changes
|
## Language changes
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,8 @@
|
||||||
# TODO: Clean up the exports a bit and everything else in general.
|
# TODO: Clean up the exports a bit and everything else in general.
|
||||||
|
|
||||||
import os, options
|
import os, options
|
||||||
|
import std/private/since
|
||||||
|
|
||||||
|
|
||||||
when hostOS == "solaris":
|
when hostOS == "solaris":
|
||||||
{.passl: "-lsocket -lnsl".}
|
{.passl: "-lsocket -lnsl".}
|
||||||
|
|
@ -199,6 +201,18 @@ proc toSockType*(protocol: Protocol): SockType =
|
||||||
of IPPROTO_IP, IPPROTO_IPV6, IPPROTO_RAW, IPPROTO_ICMP, IPPROTO_ICMPV6:
|
of IPPROTO_IP, IPPROTO_IPV6, IPPROTO_RAW, IPPROTO_ICMP, IPPROTO_ICMPV6:
|
||||||
SOCK_RAW
|
SOCK_RAW
|
||||||
|
|
||||||
|
proc getProtoByName*(name: string): int {.since: (1, 3, 5).} =
|
||||||
|
## Returns a protocol code from the database that matches the protocol ``name``.
|
||||||
|
when useWinVersion:
|
||||||
|
let protoent = winlean.getprotobyname(name.cstring)
|
||||||
|
else:
|
||||||
|
let protoent = posix.getprotobyname(name.cstring)
|
||||||
|
|
||||||
|
if protoent == nil:
|
||||||
|
raise newException(OsError, "protocol not found")
|
||||||
|
|
||||||
|
result = protoent.p_proto.int
|
||||||
|
|
||||||
proc close*(socket: SocketHandle) =
|
proc close*(socket: SocketHandle) =
|
||||||
## Closes a socket.
|
## Closes a socket.
|
||||||
when useWinVersion:
|
when useWinVersion:
|
||||||
|
|
|
||||||
|
|
@ -96,6 +96,12 @@ type
|
||||||
dwPlatformId*: DWORD
|
dwPlatformId*: DWORD
|
||||||
szCSDVersion*: array[0..127, WinChar]
|
szCSDVersion*: array[0..127, WinChar]
|
||||||
|
|
||||||
|
Protoent* = object
|
||||||
|
p_name*: cstring
|
||||||
|
p_aliases*: cstringArray
|
||||||
|
p_proto*: cshort
|
||||||
|
|
||||||
|
|
||||||
const
|
const
|
||||||
STARTF_USESHOWWINDOW* = 1'i32
|
STARTF_USESHOWWINDOW* = 1'i32
|
||||||
STARTF_USESTDHANDLES* = 256'i32
|
STARTF_USESTDHANDLES* = 256'i32
|
||||||
|
|
@ -573,6 +579,14 @@ proc gethostbyname*(name: cstring): ptr Hostent {.
|
||||||
proc gethostname*(hostname: cstring, len: cint): cint {.
|
proc gethostname*(hostname: cstring, len: cint): cint {.
|
||||||
stdcall, importc: "gethostname", dynlib: ws2dll, sideEffect.}
|
stdcall, importc: "gethostname", dynlib: ws2dll, sideEffect.}
|
||||||
|
|
||||||
|
proc getprotobyname*(
|
||||||
|
name: cstring
|
||||||
|
): ptr Protoent {.stdcall, importc: "getprotobyname", dynlib: ws2dll, sideEffect.}
|
||||||
|
|
||||||
|
proc getprotobynumber*(
|
||||||
|
proto: cint
|
||||||
|
): ptr Protoent {.stdcall, importc: "getprotobynumber", dynlib: ws2dll, sideEffect.}
|
||||||
|
|
||||||
proc socket*(af, typ, protocol: cint): SocketHandle {.
|
proc socket*(af, typ, protocol: cint): SocketHandle {.
|
||||||
stdcall, importc: "socket", dynlib: ws2dll.}
|
stdcall, importc: "socket", dynlib: ws2dll.}
|
||||||
|
|
||||||
|
|
|
||||||
25
tests/stdlib/tgetprotobyname.nim
Normal file
25
tests/stdlib/tgetprotobyname.nim
Normal file
|
|
@ -0,0 +1,25 @@
|
||||||
|
discard """
|
||||||
|
cmd: "nim c -r --styleCheck:hint --panics:on $options $file"
|
||||||
|
targets: "c"
|
||||||
|
nimout: ""
|
||||||
|
action: "run"
|
||||||
|
exitcode: 0
|
||||||
|
timeout: 60.0
|
||||||
|
"""
|
||||||
|
|
||||||
|
import nativesockets
|
||||||
|
|
||||||
|
|
||||||
|
doAssert getProtoByName("ip") == 0
|
||||||
|
doAssert getProtoByName("ipv6") == 41
|
||||||
|
doAssert getProtoByName("tcp") == 6
|
||||||
|
doAssert getProtoByName("udp") == 17
|
||||||
|
doAssert getProtoByName("icmp") == 1
|
||||||
|
doAssert getProtoByName("ipv6-icmp") == 58
|
||||||
|
|
||||||
|
when defined(windows):
|
||||||
|
doAssertRaises(OSError):
|
||||||
|
discard getProtoByName("raw")
|
||||||
|
|
||||||
|
doAssertRaises(OSError):
|
||||||
|
discard getProtoByName("Error")
|
||||||
Loading…
Add table
Add a link
Reference in a new issue