diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2018-06-07 13:44:53 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-06-07 13:44:53 +0200 |
commit | 50999e403d5bb2d6cbcc72f6899f6bbfb6b56abe (patch) | |
tree | 30a41034bd2fdf42d7b73297ea31066d8041d8b8 | |
parent | e67eddc91b5e06039498b337763acf718d436aae (diff) | |
parent | 2902308a056d8568c79b02dc58e4e2d1d35fc924 (diff) | |
download | Nim-50999e403d5bb2d6cbcc72f6899f6bbfb6b56abe.tar.gz |
Merge pull request #7984 from cheatfate/fixfromsockaddraux
Fix fromSockAddrAux() to handle IPv6 addresses properly.
-rw-r--r-- | lib/pure/net.nim | 27 |
1 files changed, 17 insertions, 10 deletions
diff --git a/lib/pure/net.nim b/lib/pure/net.nim index cac10d11c..60817484a 100644 --- a/lib/pure/net.nim +++ b/lib/pure/net.nim @@ -405,33 +405,40 @@ proc isIpAddress*(address_str: string): bool {.tags: [].} = return false 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` let port = htons(uint16(port)) case address.family of IpAddressFamily.IPv4: sl = sizeof(Sockaddr_in).Socklen 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 - 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: sl = sizeof(Sockaddr_in6).Socklen 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 - 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) = - if sa.ss_family.int == AF_INET.int and sl == sizeof(Sockaddr_in).Socklen: +proc fromSockAddrAux(sa: ptr Sockaddr_storage, sl: Socklen, + address: var IpAddress, port: var Port) = + if sa.ss_family.int == toInt(AF_INET) and sl == sizeof(Sockaddr_in).Socklen: address = IpAddress(family: IpAddressFamily.IPv4) 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 - 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) 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 else: raise newException(ValueError, "Neither IPv4 nor IPv6") |