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_win32_pinfo_t pinfo;
|
||||||
sigar_cache_t *netif_adapters;
|
sigar_cache_t *netif_adapters;
|
||||||
sigar_cache_t *netif_mib_rows;
|
sigar_cache_t *netif_mib_rows;
|
||||||
|
sigar_cache_t *netif_addr_rows;
|
||||||
|
|
||||||
WORD ws_version;
|
WORD ws_version;
|
||||||
int ws_error;
|
int ws_error;
|
||||||
|
|
|
@ -418,6 +418,7 @@ int sigar_os_open(sigar_t **sigar_ptr)
|
||||||
FALSE);
|
FALSE);
|
||||||
|
|
||||||
sigar->netif_mib_rows = NULL;
|
sigar->netif_mib_rows = NULL;
|
||||||
|
sigar->netif_addr_rows = NULL;
|
||||||
sigar->netif_adapters = NULL;
|
sigar->netif_adapters = NULL;
|
||||||
sigar->pinfo.pid = -1;
|
sigar->pinfo.pid = -1;
|
||||||
sigar->ws_version = 0;
|
sigar->ws_version = 0;
|
||||||
|
@ -453,6 +454,10 @@ int sigar_os_close(sigar_t *sigar)
|
||||||
sigar_cache_destroy(sigar->netif_mib_rows);
|
sigar_cache_destroy(sigar->netif_mib_rows);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (sigar->netif_addr_rows) {
|
||||||
|
sigar_cache_destroy(sigar->netif_addr_rows);
|
||||||
|
}
|
||||||
|
|
||||||
if (sigar->netif_adapters) {
|
if (sigar->netif_adapters) {
|
||||||
sigar_cache_destroy(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_DECLARE(int) sigar_net_info_get(sigar_t *sigar,
|
||||||
sigar_net_info_t *netinfo)
|
sigar_net_info_t *netinfo)
|
||||||
{
|
{
|
||||||
|
@ -2258,6 +2320,7 @@ sigar_net_interface_config_get(sigar_t *sigar,
|
||||||
sigar_net_interface_config_t *ifconfig)
|
sigar_net_interface_config_t *ifconfig)
|
||||||
{
|
{
|
||||||
MIB_IFROW *ifr;
|
MIB_IFROW *ifr;
|
||||||
|
MIB_IPADDRROW *ipaddr;
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
status = get_mib_ifrow(sigar, name, &ifr);
|
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;
|
ifconfig->flags |= SIGAR_IFF_UP|SIGAR_IFF_RUNNING;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ifr->dwType == MIB_IF_TYPE_LOOPBACK) {
|
status = sigar_get_netif_ipaddr(sigar,
|
||||||
ifconfig->flags |= SIGAR_IFF_LOOPBACK;
|
ifr->dwIndex,
|
||||||
|
&ipaddr);
|
||||||
|
|
||||||
|
if (status != SIGAR_OK) {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
sigar_net_address_set(ifconfig->address,
|
sigar_net_address_set(ifconfig->address,
|
||||||
0x0100007f); /* 127.0.0.1 */
|
ipaddr->dwAddr);
|
||||||
|
|
||||||
sigar_net_address_set(ifconfig->netmask,
|
sigar_net_address_set(ifconfig->netmask,
|
||||||
0x000000FF); /* 255.0.0.0 */
|
ipaddr->dwMask);
|
||||||
sigar_net_address_set(ifconfig->destination,
|
|
||||||
ifconfig->address.addr.in);
|
sigar_net_address_set(ifconfig->broadcast,
|
||||||
sigar_net_address_set(ifconfig->broadcast, 0);
|
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_SSTRCPY(ifconfig->type,
|
||||||
SIGAR_NIC_LOOPBACK);
|
SIGAR_NIC_LOOPBACK);
|
||||||
}
|
}
|
||||||
else {
|
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 |=
|
ifconfig->flags |=
|
||||||
SIGAR_IFF_BROADCAST|SIGAR_IFF_MULTICAST;
|
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_SSTRCPY(ifconfig->type,
|
||||||
SIGAR_NIC_ETHERNET);
|
SIGAR_NIC_ETHERNET);
|
||||||
|
|
Loading…
Reference in New Issue