Fix fromSockAddrAux() to handle IPv6 addresses properly.
This commit is contained in:
parent
e67eddc91b
commit
46a6fa53a9
1 changed files with 16 additions and 9 deletions
|
|
@ -405,33 +405,40 @@ proc isIpAddress*(address_str: string): bool {.tags: [].} =
|
||||||
return false
|
return false
|
||||||
return true
|
return true
|
||||||
|
|
||||||
proc toSockAddr*(address: IpAddress, port: Port, sa: var Sockaddr_storage, sl: var Socklen) =
|
proc toSockAddr*(address: IpAddress, port: Port, sa: var Sockaddr_storage,
|
||||||
|
sl: var Socklen) =
|
||||||
## Converts `IpAddress` and `Port` to `SockAddr` and `Socklen`
|
## Converts `IpAddress` and `Port` to `SockAddr` and `Socklen`
|
||||||
let port = htons(uint16(port))
|
let port = htons(uint16(port))
|
||||||
case address.family
|
case address.family
|
||||||
of IpAddressFamily.IPv4:
|
of IpAddressFamily.IPv4:
|
||||||
sl = sizeof(Sockaddr_in).Socklen
|
sl = sizeof(Sockaddr_in).Socklen
|
||||||
let s = cast[ptr Sockaddr_in](addr sa)
|
let s = cast[ptr Sockaddr_in](addr sa)
|
||||||
s.sin_family = type(s.sin_family)(AF_INET)
|
s.sin_family = type(s.sin_family)(toInt(AF_INET))
|
||||||
s.sin_port = port
|
s.sin_port = port
|
||||||
copyMem(addr s.sin_addr, unsafeAddr address.address_v4[0], sizeof(s.sin_addr))
|
copyMem(addr s.sin_addr, unsafeAddr address.address_v4[0],
|
||||||
|
sizeof(s.sin_addr))
|
||||||
of IpAddressFamily.IPv6:
|
of IpAddressFamily.IPv6:
|
||||||
sl = sizeof(Sockaddr_in6).Socklen
|
sl = sizeof(Sockaddr_in6).Socklen
|
||||||
let s = cast[ptr Sockaddr_in6](addr sa)
|
let s = cast[ptr Sockaddr_in6](addr sa)
|
||||||
s.sin6_family = type(s.sin6_family)(AF_INET6)
|
s.sin6_family = type(s.sin6_family)(toInt(AF_INET6))
|
||||||
s.sin6_port = port
|
s.sin6_port = port
|
||||||
copyMem(addr s.sin6_addr, unsafeAddr address.address_v6[0], sizeof(s.sin6_addr))
|
copyMem(addr s.sin6_addr, unsafeAddr address.address_v6[0],
|
||||||
|
sizeof(s.sin6_addr))
|
||||||
|
|
||||||
proc fromSockAddrAux(sa: ptr Sockaddr_storage, sl: Socklen, address: var IpAddress, port: var Port) =
|
proc fromSockAddrAux(sa: ptr Sockaddr_storage, sl: Socklen,
|
||||||
|
address: var IpAddress, port: var Port) =
|
||||||
if sa.ss_family.int == AF_INET.int and sl == sizeof(Sockaddr_in).Socklen:
|
if sa.ss_family.int == AF_INET.int and sl == sizeof(Sockaddr_in).Socklen:
|
||||||
address = IpAddress(family: IpAddressFamily.IPv4)
|
address = IpAddress(family: IpAddressFamily.IPv4)
|
||||||
let s = cast[ptr Sockaddr_in](sa)
|
let s = cast[ptr Sockaddr_in](sa)
|
||||||
copyMem(addr address.address_v4[0], addr s.sin_addr, sizeof(address.address_v4))
|
copyMem(addr address.address_v4[0], addr s.sin_addr,
|
||||||
|
sizeof(address.address_v4))
|
||||||
port = ntohs(s.sin_port).Port
|
port = ntohs(s.sin_port).Port
|
||||||
elif sa.ss_family.int == AF_INET6.int and sl == sizeof(Sockaddr_in6).Socklen:
|
elif sa.ss_family.int == toInt(AF_INET6) and
|
||||||
|
sl == sizeof(Sockaddr_in6).Socklen:
|
||||||
address = IpAddress(family: IpAddressFamily.IPv6)
|
address = IpAddress(family: IpAddressFamily.IPv6)
|
||||||
let s = cast[ptr Sockaddr_in6](sa)
|
let s = cast[ptr Sockaddr_in6](sa)
|
||||||
copyMem(addr address.address_v6[0], addr s.sin6_addr, sizeof(address.address_v6))
|
copyMem(addr address.address_v6[0], addr s.sin6_addr,
|
||||||
|
sizeof(address.address_v6))
|
||||||
port = ntohs(s.sin6_port).Port
|
port = ntohs(s.sin6_port).Port
|
||||||
else:
|
else:
|
||||||
raise newException(ValueError, "Neither IPv4 nor IPv6")
|
raise newException(ValueError, "Neither IPv4 nor IPv6")
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue