Huw Davies : iphlpapi: Add helpers to convert the host' s sockaddr structures to SOCKADDR_STORAGE.
Alexandre Julliard
julliard at winehq.org
Wed Sep 18 15:49:59 CDT 2013
Module: wine
Branch: master
Commit: f8463f28a9b62886c200c5a09ef02d94f7b39723
URL: http://source.winehq.org/git/wine.git/?a=commit;h=f8463f28a9b62886c200c5a09ef02d94f7b39723
Author: Huw Davies <huw at codeweavers.com>
Date: Wed Sep 18 11:49:16 2013 +0100
iphlpapi: Add helpers to convert the host's sockaddr structures to SOCKADDR_STORAGE.
---
dlls/iphlpapi/iphlpapi_main.c | 51 ++++++++++++++++++++++------------------
1 files changed, 28 insertions(+), 23 deletions(-)
diff --git a/dlls/iphlpapi/iphlpapi_main.c b/dlls/iphlpapi/iphlpapi_main.c
index f84c700..e2d09eb 100644
--- a/dlls/iphlpapi/iphlpapi_main.c
+++ b/dlls/iphlpapi/iphlpapi_main.c
@@ -925,6 +925,30 @@ static ULONG adapterAddressesFromIndex(ULONG family, ULONG flags, IF_INDEX index
return ERROR_SUCCESS;
}
+static void sockaddr_in_to_WS_storage( SOCKADDR_STORAGE *dst, const struct sockaddr_in *src )
+{
+ SOCKADDR_IN *s = (SOCKADDR_IN *)dst;
+
+ s->sin_family = WS_AF_INET;
+ s->sin_port = src->sin_port;
+ memcpy( &s->sin_addr, &src->sin_addr, sizeof(IN_ADDR) );
+ memset( (char *)s + FIELD_OFFSET( SOCKADDR_IN, sin_zero ), 0,
+ sizeof(SOCKADDR_STORAGE) - FIELD_OFFSET( SOCKADDR_IN, sin_zero) );
+}
+
+static void sockaddr_in6_to_WS_storage( SOCKADDR_STORAGE *dst, const struct sockaddr_in6 *src )
+{
+ SOCKADDR_IN6 *s = (SOCKADDR_IN6 *)dst;
+
+ s->sin6_family = WS_AF_INET6;
+ s->sin6_port = src->sin6_port;
+ s->sin6_flowinfo = src->sin6_flowinfo;
+ memcpy( &s->sin6_addr, &src->sin6_addr, sizeof(IN6_ADDR) );
+ s->sin6_scope_id = src->sin6_scope_id;
+ memset( (char *)s + sizeof(SOCKADDR_IN6), 0,
+ sizeof(SOCKADDR_STORAGE) - sizeof(SOCKADDR_IN6) );
+}
+
#ifdef HAVE_STRUCT___RES_STATE
/* call res_init() just once because of a bug in Mac OS X 10.4 */
/* Call once per thread on systems that have per-thread _res. */
@@ -957,22 +981,13 @@ static int get_dns_servers( SOCKADDR_STORAGE *servers, int num, BOOL ip4_only )
#ifdef HAVE_STRUCT___RES_STATE__U__EXT_NSCOUNT6
if (_res._u._ext.nsaddrs[i])
{
- SOCKADDR_IN6 *s = (SOCKADDR_IN6 *)addr;
if (ip4_only) continue;
- s->sin6_family = WS_AF_INET6;
- s->sin6_port = _res._u._ext.nsaddrs[i]->sin6_port;
- s->sin6_flowinfo = _res._u._ext.nsaddrs[i]->sin6_flowinfo;
- memcpy( &s->sin6_addr, &_res._u._ext.nsaddrs[i]->sin6_addr, sizeof(IN6_ADDR) );
- s->sin6_scope_id = _res._u._ext.nsaddrs[i]->sin6_scope_id;
- memset( (char *)s + sizeof(SOCKADDR_IN6), 0,
- sizeof(SOCKADDR_STORAGE) - sizeof(SOCKADDR_IN6) );
+ sockaddr_in6_to_WS_storage( addr, _res._u._ext.nsaddrs[i] );
}
else
#endif
{
- *(struct sockaddr_in *)addr = _res.nsaddr_list[i];
- memset( (char *)addr + sizeof(struct sockaddr_in), 0,
- sizeof(SOCKADDR_STORAGE) - sizeof(struct sockaddr_in) );
+ sockaddr_in_to_WS_storage( addr, _res.nsaddr_list + i );
}
addr++;
}
@@ -1004,21 +1019,11 @@ static int get_dns_servers( SOCKADDR_STORAGE *servers, int num, BOOL ip4_only )
if (buf[i].ss_family == AF_INET6)
{
- SOCKADDR_IN6 *s = (SOCKADDR_IN6 *)addr;
- struct sockaddr_in6 *ptr = (struct sockaddr_in6 *)(buf + i);
- s->sin6_family = WS_AF_INET6;
- s->sin6_port = ptr->sin6_port;
- s->sin6_flowinfo = ptr->sin6_flowinfo;
- memcpy( &s->sin6_addr, &ptr->sin6_addr, sizeof(IN6_ADDR) );
- s->sin6_scope_id = ptr->sin6_scope_id;
- memset( (char *)s + sizeof(SOCKADDR_IN6), 0,
- sizeof(SOCKADDR_STORAGE) - sizeof(SOCKADDR_IN6) );
+ sockaddr_in6_to_WS_storage( addr, (struct sockaddr_in6 *)(buf + i) );
}
else
{
- *(struct sockaddr_in *)addr = *(struct sockaddr_in *)(buf + i);
- memset( (char *)addr + sizeof(struct sockaddr_in), 0,
- sizeof(SOCKADDR_STORAGE) - sizeof(struct sockaddr_in) );
+ sockaddr_in_to_WS_storage( addr, (struct sockaddr_in *)(buf + i) );
}
if (++addr >= servers + num) break;
}
More information about the wine-cvs
mailing list