Module: wine Branch: master Commit: f8463f28a9b62886c200c5a09ef02d94f7b39723 URL: http://source.winehq.org/git/wine.git/?a=commit;h=f8463f28a9b62886c200c5a09e...
Author: Huw Davies huw@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; }