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
|
||||
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
|
||||
|
|
|
|||
|
|
@ -13,6 +13,8 @@
|
|||
# TODO: Clean up the exports a bit and everything else in general.
|
||||
|
||||
import os, options
|
||||
import std/private/since
|
||||
|
||||
|
||||
when hostOS == "solaris":
|
||||
{.passl: "-lsocket -lnsl".}
|
||||
|
|
@ -199,6 +201,18 @@ proc toSockType*(protocol: Protocol): SockType =
|
|||
of IPPROTO_IP, IPPROTO_IPV6, IPPROTO_RAW, IPPROTO_ICMP, IPPROTO_ICMPV6:
|
||||
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) =
|
||||
## Closes a socket.
|
||||
when useWinVersion:
|
||||
|
|
|
|||
|
|
@ -96,6 +96,12 @@ type
|
|||
dwPlatformId*: DWORD
|
||||
szCSDVersion*: array[0..127, WinChar]
|
||||
|
||||
Protoent* = object
|
||||
p_name*: cstring
|
||||
p_aliases*: cstringArray
|
||||
p_proto*: cshort
|
||||
|
||||
|
||||
const
|
||||
STARTF_USESHOWWINDOW* = 1'i32
|
||||
STARTF_USESTDHANDLES* = 256'i32
|
||||
|
|
@ -573,6 +579,14 @@ proc gethostbyname*(name: cstring): ptr Hostent {.
|
|||
proc gethostname*(hostname: cstring, len: cint): cint {.
|
||||
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 {.
|
||||
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