use IpAddrTable instead of ApdapterInfo for net_interface_config
This commit is contained in:
parent
6c21782915
commit
c77dd61985
|
@ -491,6 +491,7 @@ struct sigar_t {
|
|||
sigar_win32_pinfo_t pinfo;
|
||||
sigar_cache_t *netif_adapters;
|
||||
sigar_cache_t *netif_mib_rows;
|
||||
sigar_cache_t *netif_addr_rows;
|
||||
|
||||
WORD ws_version;
|
||||
int ws_error;
|
||||
|
|
|
@ -418,6 +418,7 @@ int sigar_os_open(sigar_t **sigar_ptr)
|
|||
FALSE);
|
||||
|
||||
sigar->netif_mib_rows = NULL;
|
||||
sigar->netif_addr_rows = NULL;
|
||||
sigar->netif_adapters = NULL;
|
||||
sigar->pinfo.pid = -1;
|
||||
sigar->ws_version = 0;
|
||||
|
@ -453,6 +454,10 @@ int sigar_os_close(sigar_t *sigar)
|
|||
sigar_cache_destroy(sigar->netif_mib_rows);
|
||||
}
|
||||
|
||||
if (sigar->netif_addr_rows) {
|
||||
sigar_cache_destroy(sigar->netif_addr_rows);
|
||||
}
|
||||
|
||||
if (sigar->netif_adapters) {
|
||||
sigar_cache_destroy(sigar->netif_adapters);
|
||||
}
|
||||
|
@ -1985,6 +1990,63 @@ static int sigar_get_ipaddr_table(sigar_t *sigar,
|
|||
}
|
||||
}
|
||||
|
||||
#ifndef MIB_IPADDR_PRIMARY
|
||||
#define MIB_IPADDR_PRIMARY 0x0001
|
||||
#endif
|
||||
|
||||
static int sigar_get_netif_ipaddr(sigar_t *sigar,
|
||||
DWORD index,
|
||||
MIB_IPADDRROW **ipaddr)
|
||||
{
|
||||
sigar_cache_entry_t *entry;
|
||||
*ipaddr = NULL;
|
||||
|
||||
if (sigar->netif_addr_rows) {
|
||||
entry = sigar_cache_get(sigar->netif_addr_rows, index);
|
||||
if (entry->value) {
|
||||
*ipaddr = (MIB_IPADDRROW *)entry->value;
|
||||
}
|
||||
}
|
||||
else {
|
||||
int status, i;
|
||||
MIB_IPADDRTABLE *mib;
|
||||
|
||||
sigar->netif_addr_rows = sigar_cache_new(10);
|
||||
|
||||
status = sigar_get_ipaddr_table(sigar, &mib);
|
||||
if (status != SIGAR_OK) {
|
||||
return status;
|
||||
}
|
||||
|
||||
for (i=0; i<mib->dwNumEntries; i++) {
|
||||
MIB_IPADDRROW *row = &mib->table[i];
|
||||
|
||||
/* unused2 == wType */
|
||||
if (!(row->unused2 & MIB_IPADDR_PRIMARY)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
entry = sigar_cache_get(sigar->netif_addr_rows,
|
||||
row->dwIndex);
|
||||
if (!entry->value) {
|
||||
entry->value = malloc(sizeof(*row));
|
||||
}
|
||||
memcpy(entry->value, row, sizeof(*row));
|
||||
|
||||
if (row->dwIndex == index) {
|
||||
*ipaddr = row;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (*ipaddr) {
|
||||
return SIGAR_OK;
|
||||
}
|
||||
else {
|
||||
return ENOENT;
|
||||
}
|
||||
}
|
||||
|
||||
SIGAR_DECLARE(int) sigar_net_info_get(sigar_t *sigar,
|
||||
sigar_net_info_t *netinfo)
|
||||
{
|
||||
|
@ -2258,6 +2320,7 @@ sigar_net_interface_config_get(sigar_t *sigar,
|
|||
sigar_net_interface_config_t *ifconfig)
|
||||
{
|
||||
MIB_IFROW *ifr;
|
||||
MIB_IPADDRROW *ipaddr;
|
||||
int status;
|
||||
|
||||
status = get_mib_ifrow(sigar, name, &ifr);
|
||||
|
@ -2282,56 +2345,37 @@ sigar_net_interface_config_get(sigar_t *sigar,
|
|||
ifconfig->flags |= SIGAR_IFF_UP|SIGAR_IFF_RUNNING;
|
||||
}
|
||||
|
||||
if (ifr->dwType == MIB_IF_TYPE_LOOPBACK) {
|
||||
ifconfig->flags |= SIGAR_IFF_LOOPBACK;
|
||||
status = sigar_get_netif_ipaddr(sigar,
|
||||
ifr->dwIndex,
|
||||
&ipaddr);
|
||||
|
||||
if (status != SIGAR_OK) {
|
||||
return status;
|
||||
}
|
||||
|
||||
sigar_net_address_set(ifconfig->address,
|
||||
0x0100007f); /* 127.0.0.1 */
|
||||
ipaddr->dwAddr);
|
||||
|
||||
sigar_net_address_set(ifconfig->netmask,
|
||||
0x000000FF); /* 255.0.0.0 */
|
||||
sigar_net_address_set(ifconfig->destination,
|
||||
ifconfig->address.addr.in);
|
||||
sigar_net_address_set(ifconfig->broadcast, 0);
|
||||
ipaddr->dwMask);
|
||||
|
||||
sigar_net_address_set(ifconfig->broadcast,
|
||||
ipaddr->dwBCastAddr);
|
||||
|
||||
/* hack for MS_LOOPBACK_ADAPTER */
|
||||
if (strnEQ(name, NETIF_LA, sizeof(NETIF_LA)-1)) {
|
||||
ifr->dwType = MIB_IF_TYPE_LOOPBACK;
|
||||
}
|
||||
|
||||
if (ifr->dwType == MIB_IF_TYPE_LOOPBACK) {
|
||||
ifconfig->flags |= SIGAR_IFF_LOOPBACK;
|
||||
|
||||
SIGAR_SSTRCPY(ifconfig->type,
|
||||
SIGAR_NIC_LOOPBACK);
|
||||
}
|
||||
else {
|
||||
IP_ADAPTER_INFO *adapter;
|
||||
status = sigar_get_adapter_info(sigar,
|
||||
ifr->dwIndex,
|
||||
&adapter);
|
||||
|
||||
if (status == SIGAR_OK) {
|
||||
char *addr;
|
||||
long iaddr;
|
||||
IP_ADDR_STRING *ip = &adapter->IpAddressList;
|
||||
|
||||
/* last address in the list is the primary */
|
||||
while (ip->Next) {
|
||||
ip = ip->Next;
|
||||
}
|
||||
addr = ip->IpAddress.String;
|
||||
iaddr = inet_addr(addr);
|
||||
sigar_net_address_set(ifconfig->address,
|
||||
iaddr);
|
||||
|
||||
addr = ip->IpMask.String;
|
||||
sigar_net_address_set(ifconfig->netmask,
|
||||
inet_addr(addr));
|
||||
|
||||
if (ifr->dwType == MIB_IF_TYPE_ETHERNET) {
|
||||
ifconfig->flags |=
|
||||
SIGAR_IFF_BROADCAST|SIGAR_IFF_MULTICAST;
|
||||
sigar_net_address_set(ifconfig->broadcast,
|
||||
iaddr | 0xFF000000);
|
||||
}
|
||||
}
|
||||
|
||||
/* hack for MS_LOOPBACK_ADAPTER */
|
||||
if (strnEQ(name, NETIF_LA, sizeof(NETIF_LA)-1)) {
|
||||
ifconfig->flags |= SIGAR_IFF_LOOPBACK;
|
||||
}
|
||||
|
||||
SIGAR_SSTRCPY(ifconfig->type,
|
||||
SIGAR_NIC_ETHERNET);
|
||||
|
|
Loading…
Reference in New Issue