Fix getAddrInfo, add IPPROTO_ICMPV6 Closes #10198
This commit is contained in:
parent
f3bd3691e7
commit
2fa35126b0
5 changed files with 44 additions and 2 deletions
|
|
@ -295,6 +295,7 @@ const IF_NAMESIZE* = cint(16)
|
||||||
const IPPROTO_IP* = cint(0)
|
const IPPROTO_IP* = cint(0)
|
||||||
const IPPROTO_IPV6* = cint(41)
|
const IPPROTO_IPV6* = cint(41)
|
||||||
const IPPROTO_ICMP* = cint(1)
|
const IPPROTO_ICMP* = cint(1)
|
||||||
|
const IPPROTO_ICMPV6* = cint(58)
|
||||||
const IPPROTO_RAW* = cint(255)
|
const IPPROTO_RAW* = cint(255)
|
||||||
const IPPROTO_TCP* = cint(6)
|
const IPPROTO_TCP* = cint(6)
|
||||||
const IPPROTO_UDP* = cint(17)
|
const IPPROTO_UDP* = cint(17)
|
||||||
|
|
|
||||||
|
|
@ -237,6 +237,7 @@ const IF_NAMESIZE* = cint(16)
|
||||||
const IPPROTO_IP* = cint(0)
|
const IPPROTO_IP* = cint(0)
|
||||||
const IPPROTO_IPV6* = cint(41)
|
const IPPROTO_IPV6* = cint(41)
|
||||||
const IPPROTO_ICMP* = cint(1)
|
const IPPROTO_ICMP* = cint(1)
|
||||||
|
const IPPROTO_ICMPV6* = cint(58)
|
||||||
const IPPROTO_RAW* = cint(255)
|
const IPPROTO_RAW* = cint(255)
|
||||||
const IPPROTO_TCP* = cint(6)
|
const IPPROTO_TCP* = cint(6)
|
||||||
const IPPROTO_UDP* = cint(17)
|
const IPPROTO_UDP* = cint(17)
|
||||||
|
|
|
||||||
|
|
@ -302,6 +302,7 @@ var IF_NAMESIZE* {.importc: "IF_NAMESIZE", header: "<net/if.h>".}: cint
|
||||||
var IPPROTO_IP* {.importc: "IPPROTO_IP", header: "<netinet/in.h>".}: cint
|
var IPPROTO_IP* {.importc: "IPPROTO_IP", header: "<netinet/in.h>".}: cint
|
||||||
var IPPROTO_IPV6* {.importc: "IPPROTO_IPV6", header: "<netinet/in.h>".}: cint
|
var IPPROTO_IPV6* {.importc: "IPPROTO_IPV6", header: "<netinet/in.h>".}: cint
|
||||||
var IPPROTO_ICMP* {.importc: "IPPROTO_ICMP", header: "<netinet/in.h>".}: cint
|
var IPPROTO_ICMP* {.importc: "IPPROTO_ICMP", header: "<netinet/in.h>".}: cint
|
||||||
|
var IPPROTO_ICMPV6* {.importc: "IPPROTO_ICMPV6", header: "<netinet/in.h>".}: cint
|
||||||
var IPPROTO_RAW* {.importc: "IPPROTO_RAW", header: "<netinet/in.h>".}: cint
|
var IPPROTO_RAW* {.importc: "IPPROTO_RAW", header: "<netinet/in.h>".}: cint
|
||||||
var IPPROTO_TCP* {.importc: "IPPROTO_TCP", header: "<netinet/in.h>".}: cint
|
var IPPROTO_TCP* {.importc: "IPPROTO_TCP", header: "<netinet/in.h>".}: cint
|
||||||
var IPPROTO_UDP* {.importc: "IPPROTO_UDP", header: "<netinet/in.h>".}: cint
|
var IPPROTO_UDP* {.importc: "IPPROTO_UDP", header: "<netinet/in.h>".}: cint
|
||||||
|
|
|
||||||
|
|
@ -71,6 +71,7 @@ type
|
||||||
IPPROTO_IPV6, ## Internet Protocol Version 6. Unsupported on Windows.
|
IPPROTO_IPV6, ## Internet Protocol Version 6. Unsupported on Windows.
|
||||||
IPPROTO_RAW, ## Raw IP Packets Protocol. Unsupported on Windows.
|
IPPROTO_RAW, ## Raw IP Packets Protocol. Unsupported on Windows.
|
||||||
IPPROTO_ICMP ## Control message protocol. Unsupported on Windows.
|
IPPROTO_ICMP ## Control message protocol. Unsupported on Windows.
|
||||||
|
IPPROTO_ICMPV6 ## Control message protocol for IPv6. Unsupported on Windows.
|
||||||
|
|
||||||
Servent* = object ## information about a service
|
Servent* = object ## information about a service
|
||||||
name*: string
|
name*: string
|
||||||
|
|
@ -154,6 +155,7 @@ when not useWinVersion:
|
||||||
of IPPROTO_IPV6: result = posix.IPPROTO_IPV6
|
of IPPROTO_IPV6: result = posix.IPPROTO_IPV6
|
||||||
of IPPROTO_RAW: result = posix.IPPROTO_RAW
|
of IPPROTO_RAW: result = posix.IPPROTO_RAW
|
||||||
of IPPROTO_ICMP: result = posix.IPPROTO_ICMP
|
of IPPROTO_ICMP: result = posix.IPPROTO_ICMP
|
||||||
|
of IPPROTO_ICMPV6: result = posix.IPPROTO_ICMPV6
|
||||||
|
|
||||||
else:
|
else:
|
||||||
proc toInt(domain: Domain): cint =
|
proc toInt(domain: Domain): cint =
|
||||||
|
|
@ -179,7 +181,7 @@ proc toSockType*(protocol: Protocol): SockType =
|
||||||
SOCK_STREAM
|
SOCK_STREAM
|
||||||
of IPPROTO_UDP:
|
of IPPROTO_UDP:
|
||||||
SOCK_DGRAM
|
SOCK_DGRAM
|
||||||
of IPPROTO_IP, IPPROTO_IPV6, IPPROTO_RAW, IPPROTO_ICMP:
|
of IPPROTO_IP, IPPROTO_IPV6, IPPROTO_RAW, IPPROTO_ICMP, IPPROTO_ICMPV6:
|
||||||
SOCK_RAW
|
SOCK_RAW
|
||||||
|
|
||||||
proc createNativeSocket*(domain: Domain = AF_INET,
|
proc createNativeSocket*(domain: Domain = AF_INET,
|
||||||
|
|
@ -255,7 +257,8 @@ proc getAddrInfo*(address: string, port: Port, domain: Domain = AF_INET,
|
||||||
when not defined(freebsd) and not defined(openbsd) and not defined(netbsd) and not defined(android) and not defined(haiku):
|
when not defined(freebsd) and not defined(openbsd) and not defined(netbsd) and not defined(android) and not defined(haiku):
|
||||||
if domain == AF_INET6:
|
if domain == AF_INET6:
|
||||||
hints.ai_flags = AI_V4MAPPED
|
hints.ai_flags = AI_V4MAPPED
|
||||||
var gaiResult = getaddrinfo(address, $port, addr(hints), result)
|
let socket_port = if sockType == SOCK_RAW: "" else: $port
|
||||||
|
var gaiResult = getaddrinfo(address, socket_port, addr(hints), result)
|
||||||
if gaiResult != 0'i32:
|
if gaiResult != 0'i32:
|
||||||
when useWinVersion:
|
when useWinVersion:
|
||||||
raiseOSError(osLastError())
|
raiseOSError(osLastError())
|
||||||
|
|
|
||||||
36
tests/stdlib/tgetaddrinfo.nim
Normal file
36
tests/stdlib/tgetaddrinfo.nim
Normal file
|
|
@ -0,0 +1,36 @@
|
||||||
|
discard """
|
||||||
|
exitcode: 0
|
||||||
|
output: ""
|
||||||
|
"""
|
||||||
|
|
||||||
|
# bug: https://github.com/nim-lang/Nim/issues/10198
|
||||||
|
|
||||||
|
import nativesockets
|
||||||
|
|
||||||
|
block DGRAM_UDP:
|
||||||
|
let aiList = getAddrInfo("127.0.0.1", 999.Port, AF_INET, SOCK_DGRAM, IPPROTO_UDP)
|
||||||
|
doAssert aiList != nil
|
||||||
|
doAssert aiList.ai_addr != nil
|
||||||
|
doAssert aiList.ai_addrlen == 16
|
||||||
|
doAssert aiList.ai_next == nil
|
||||||
|
freeAddrInfo aiList
|
||||||
|
|
||||||
|
when defined(posix):
|
||||||
|
|
||||||
|
block RAW_ICMP:
|
||||||
|
# the port will be ignored
|
||||||
|
let aiList = getAddrInfo("127.0.0.1", 999.Port, AF_INET, SOCK_RAW, IPPROTO_ICMP)
|
||||||
|
doAssert aiList != nil
|
||||||
|
doAssert aiList.ai_addr != nil
|
||||||
|
doAssert aiList.ai_addrlen == 16
|
||||||
|
doAssert aiList.ai_next == nil
|
||||||
|
freeAddrInfo aiList
|
||||||
|
|
||||||
|
block RAW_ICMPV6:
|
||||||
|
# the port will be ignored
|
||||||
|
let aiList = getAddrInfo("::1", 999.Port, AF_INET6, SOCK_RAW, IPPROTO_ICMPV6)
|
||||||
|
doAssert aiList != nil
|
||||||
|
doAssert aiList.ai_addr != nil
|
||||||
|
doAssert aiList.ai_addrlen == 28
|
||||||
|
doAssert aiList.ai_next == nil
|
||||||
|
freeAddrInfo aiList
|
||||||
Loading…
Add table
Add a link
Reference in a new issue