win32 net_interface_ipv6_config impl

This commit is contained in:
Doug MacEachern 2009-07-29 15:23:09 -07:00
parent f0b96796e1
commit 10051fa8ff
1 changed files with 38 additions and 8 deletions

View File

@ -21,6 +21,7 @@
#include "sigar_pdh.h"
#include "sigar_os.h"
#include "sigar_util.h"
#include "sigar_format.h"
#include <shellapi.h>
#define USING_WIDE_S(s) (s)->using_wide
@ -2219,12 +2220,11 @@ static int sigar_get_adapter_info(sigar_t *sigar,
}
static int sigar_get_adapters_addresses(sigar_t *sigar,
ULONG family, ULONG flags,
PIP_ADAPTER_ADDRESSES *addrs)
{
ULONG size = sigar->ifconf_len;
ULONG rc;
ULONG flags =
GAA_FLAG_SKIP_DNS_SERVER|GAA_FLAG_SKIP_MULTICAST;
DLLMOD_INIT(iphlpapi, FALSE);
@ -2233,7 +2233,7 @@ static int sigar_get_adapters_addresses(sigar_t *sigar,
}
*addrs = (PIP_ADAPTER_ADDRESSES)sigar->ifconf_buf;
rc = sigar_GetAdaptersAddresses(AF_UNSPEC,
rc = sigar_GetAdaptersAddresses(family,
flags,
NULL,
*addrs,
@ -2249,7 +2249,7 @@ static int sigar_get_adapters_addresses(sigar_t *sigar,
sigar->ifconf_len);
*addrs = (PIP_ADAPTER_ADDRESSES)sigar->ifconf_buf;
rc = sigar_GetAdaptersAddresses(AF_UNSPEC,
rc = sigar_GetAdaptersAddresses(family,
flags,
NULL,
*addrs,
@ -2637,10 +2637,40 @@ sigar_net_interface_list_get(sigar_t *sigar,
return SIGAR_OK;
}
int sigar_net_interface_ipv6_config_get(sigar_t *sigar, const char *name,
static int sigar_net_interface_ipv6_config_find(sigar_t *sigar, int index,
sigar_net_interface_config_t *ifconfig)
{
return SIGAR_ENOTIMPL;
int status;
PIP_ADAPTER_ADDRESSES aa, addrs;
ULONG flags = GAA_FLAG_INCLUDE_PREFIX;
status = sigar_get_adapters_addresses(sigar, AF_UNSPEC, flags, &aa);
if (status != SIGAR_OK) {
return status;
}
for (addrs = aa; addrs; addrs = addrs->Next) {
PIP_ADAPTER_UNICAST_ADDRESS addr;
if (addrs->IfIndex != index) {
continue;
}
for (addr = addrs->FirstUnicastAddress; addr; addr = addr->Next) {
struct sockaddr *sa = addr->Address.lpSockaddr;
if (sa->sa_family == AF_INET6) {
struct in6_addr *inet6 = SIGAR_SIN6_ADDR(sa);
sigar_net_address6_set(ifconfig->address6, inet6);
sigar_net_interface_scope6_set(ifconfig, inet6);
if (addrs->FirstPrefix) {
ifconfig->prefix6_length = addrs->FirstPrefix->PrefixLength;
}
return SIGAR_OK;
}
}
}
return SIGAR_ENOENT;
}
SIGAR_DECLARE(int)
@ -2724,7 +2754,7 @@ sigar_net_interface_config_get(sigar_t *sigar,
}
sigar_net_interface_ipv6_config_init(ifconfig);
sigar_net_interface_ipv6_config_get(sigar, name, ifconfig);
sigar_net_interface_ipv6_config_find(sigar, ifr->dwIndex, ifconfig);
return SIGAR_OK;
}