(SIGAR-199) arp_list linux impl
This commit is contained in:
parent
9207af5536
commit
9847f6a454
|
@ -2317,10 +2317,135 @@ int sigar_nfs_server_v3_get(sigar_t *sigar,
|
||||||
(sigar_nfs_v3_t *)nfs);
|
(sigar_nfs_v3_t *)nfs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#include <net/if_arp.h>
|
||||||
|
|
||||||
|
static char *get_hw_type(int type)
|
||||||
|
{
|
||||||
|
switch (type) {
|
||||||
|
case ARPHRD_AX25:
|
||||||
|
return "ax25";
|
||||||
|
case ARPHRD_ECONET:
|
||||||
|
return "ec";
|
||||||
|
case ARPHRD_ETHER:
|
||||||
|
return "ether";
|
||||||
|
case ARPHRD_FDDI:
|
||||||
|
return "fddi";
|
||||||
|
case ARPHRD_DLCI:
|
||||||
|
return "dlci";
|
||||||
|
case ARPHRD_FRAD:
|
||||||
|
return "frad";
|
||||||
|
case ARPHRD_HDLC:
|
||||||
|
return "hdlc";
|
||||||
|
case ARPHRD_LAPB:
|
||||||
|
return "lapb";
|
||||||
|
case ARPHRD_HIPPI:
|
||||||
|
return "hippi";
|
||||||
|
case ARPHRD_IRDA:
|
||||||
|
return "irda";
|
||||||
|
case ARPHRD_LOOPBACK:
|
||||||
|
return "loop";
|
||||||
|
case ARPHRD_NETROM:
|
||||||
|
return "netrom";
|
||||||
|
case ARPHRD_PPP:
|
||||||
|
return "ppp";
|
||||||
|
case ARPHRD_ROSE:
|
||||||
|
return "rose";
|
||||||
|
case ARPHRD_SIT:
|
||||||
|
return "sit";
|
||||||
|
case ARPHRD_SLIP:
|
||||||
|
return "slip";
|
||||||
|
case ARPHRD_CSLIP:
|
||||||
|
return "cslip";
|
||||||
|
case ARPHRD_SLIP6:
|
||||||
|
return "slip6";
|
||||||
|
case ARPHRD_CSLIP6:
|
||||||
|
return "cslip6";
|
||||||
|
case ARPHRD_ADAPT:
|
||||||
|
return "adaptive";
|
||||||
|
case ARPHRD_IEEE802:
|
||||||
|
return "tr";
|
||||||
|
case ARPHRD_IEEE802_TR:
|
||||||
|
return "tr";
|
||||||
|
case ARPHRD_TUNNEL:
|
||||||
|
return "tunnel";
|
||||||
|
case ARPHRD_X25:
|
||||||
|
return "x25";
|
||||||
|
default:
|
||||||
|
return "unknown";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int sigar_arp_list_get(sigar_t *sigar,
|
int sigar_arp_list_get(sigar_t *sigar,
|
||||||
sigar_arp_list_t *arplist)
|
sigar_arp_list_t *arplist)
|
||||||
{
|
{
|
||||||
return SIGAR_ENOTIMPL;
|
FILE *fp;
|
||||||
|
char buffer[1024];
|
||||||
|
char net_addr[128], hwaddr[128], mask_addr[128];
|
||||||
|
int flags, type, status;
|
||||||
|
sigar_arp_t *arp;
|
||||||
|
|
||||||
|
arplist->size = arplist->number = 0;
|
||||||
|
|
||||||
|
if (!(fp = fopen(PROC_FS_ROOT "net/arp", "r"))) {
|
||||||
|
return errno;
|
||||||
|
}
|
||||||
|
|
||||||
|
sigar_arp_list_create(arplist);
|
||||||
|
|
||||||
|
(void)fgets(buffer, sizeof(buffer), fp); /* skip header */
|
||||||
|
while (fgets(buffer, sizeof(buffer), fp)) {
|
||||||
|
int num;
|
||||||
|
|
||||||
|
SIGAR_ARP_LIST_GROW(arplist);
|
||||||
|
arp = &arplist->data[arplist->number++];
|
||||||
|
|
||||||
|
/* XXX rid sscanf */
|
||||||
|
num = sscanf(buffer, "%128s 0x%x 0x%x %128s %128s %16s",
|
||||||
|
net_addr, &type, &flags,
|
||||||
|
hwaddr, mask_addr, arp->ifname);
|
||||||
|
|
||||||
|
if (num < 6) {
|
||||||
|
--arplist->number;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
arp->flags = flags;
|
||||||
|
status = inet_pton(AF_INET, net_addr, &arp->address.addr);
|
||||||
|
if (status > 0) {
|
||||||
|
arp->address.family = SIGAR_AF_INET;
|
||||||
|
}
|
||||||
|
else if ((status = inet_pton(AF_INET6, net_addr, &arp->address.addr)) > 0) {
|
||||||
|
arp->address.family = SIGAR_AF_INET6;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
sigar_log_printf(sigar, SIGAR_LOG_WARN,
|
||||||
|
"[arp] failed to parse address='%s' (%s)\n", net_addr,
|
||||||
|
((status == 0) ? "Invalid format" : sigar_strerror(sigar, errno)));
|
||||||
|
--arplist->number;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
num = sscanf(hwaddr, "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
|
||||||
|
&arp->hwaddr.addr.mac[0],
|
||||||
|
&arp->hwaddr.addr.mac[1],
|
||||||
|
&arp->hwaddr.addr.mac[2],
|
||||||
|
&arp->hwaddr.addr.mac[3],
|
||||||
|
&arp->hwaddr.addr.mac[4],
|
||||||
|
&arp->hwaddr.addr.mac[5]);
|
||||||
|
if (num < 6) {
|
||||||
|
sigar_log_printf(sigar, SIGAR_LOG_WARN,
|
||||||
|
"[arp] failed to parse hwaddr='%s' (%s)\n", hwaddr);
|
||||||
|
--arplist->number;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
arp->hwaddr.family = SIGAR_AF_LINK;
|
||||||
|
|
||||||
|
SIGAR_SSTRCPY(arp->type, get_hw_type(type));
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose(fp);
|
||||||
|
|
||||||
|
return SIGAR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int sigar_proc_port_get(sigar_t *sigar, int protocol,
|
int sigar_proc_port_get(sigar_t *sigar, int protocol,
|
||||||
|
|
Loading…
Reference in New Issue