summaryrefslogtreecommitdiff
path: root/src/Sockets.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Sockets.cpp')
-rw-r--r--src/Sockets.cpp15
1 files changed, 10 insertions, 5 deletions
diff --git a/src/Sockets.cpp b/src/Sockets.cpp
index 0049ba4..f4399c3 100644
--- a/src/Sockets.cpp
+++ b/src/Sockets.cpp
@@ -367,15 +367,20 @@ int zts_util_ipstr_to_saddr(
*addrlen = sizeof(struct zts_sockaddr_in);
return ZTS_ERR_OK;
}
+ int any = 0;
if (family == ZTS_AF_INET6) {
struct zts_sockaddr_in6* in6 = (struct zts_sockaddr_in6*)dest_addr;
in6->sin6_port = htons(port);
in6->sin6_family = family;
-#if defined(_WIN32)
- zts_inet_pton(family, src_ipstr, &(in6->sin6_addr));
-#else
- zts_inet_pton(family, src_ipstr, &(in6->sin6_addr));
-#endif
+ // Handle the unspecified address
+ any = ((strlen(src_ipstr) >= 2) && !strncmp(src_ipstr, "::", 2))
+ || ((strlen(src_ipstr) >= 15) && !strncmp(src_ipstr, "0:0:0:0:0:0:0:0", 15)) ? 1 : 0;
+ if (!any) {
+ zts_inet_pton(family, src_ipstr, &(in6->sin6_addr));
+ }
+ else {
+ memset((void*)&(in6->sin6_addr), 0, sizeof(zts_in6_addr));
+ }
*addrlen = sizeof(struct zts_sockaddr_in6);
return ZTS_ERR_OK;
}