more net_route stuff
This commit is contained in:
parent
962c8cfd1b
commit
d36d72b16c
|
@ -1379,29 +1379,25 @@ int sigar_cpu_info_list_get(sigar_t *sigar,
|
||||||
return SIGAR_OK;
|
return SIGAR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define rt_s_addr(sa) ((struct sockaddr_in *)(sa))->sin_addr.s_addr
|
||||||
|
|
||||||
int sigar_net_route_list_get(sigar_t *sigar,
|
int sigar_net_route_list_get(sigar_t *sigar,
|
||||||
sigar_net_route_list_t *routelist)
|
sigar_net_route_list_t *routelist)
|
||||||
{
|
{
|
||||||
#if 0 /*defined(SIGAR_FREEBSD5)*/
|
#if defined(SIGAR_FREEBSD5)
|
||||||
size_t needed;
|
size_t needed;
|
||||||
int mib[6];
|
int bit;
|
||||||
char *buf, *next, *lim;
|
char *buf, *next, *lim;
|
||||||
struct rt_msghdr *rtm;
|
struct rt_msghdr *rtm;
|
||||||
|
int mib[6] = { CTL_NET, PF_ROUTE, 0, 0, NET_RT_DUMP, 0 };
|
||||||
|
|
||||||
mib[0] = CTL_NET;
|
if (sysctl(mib, NMIB(mib), NULL, &needed, NULL, 0) < 0) {
|
||||||
mib[1] = PF_ROUTE;
|
|
||||||
mib[2] = 0; /* protocol */
|
|
||||||
mib[3] = 0; /* wildcard address family */
|
|
||||||
mib[4] = NET_RT_DUMP;
|
|
||||||
mib[5] = 0; /* no flags */
|
|
||||||
|
|
||||||
if (sysctl(mib, 6, NULL, &needed, NULL, 0) < 0) {
|
|
||||||
return errno;
|
return errno;
|
||||||
}
|
}
|
||||||
|
|
||||||
buf = malloc(needed);
|
buf = malloc(needed);
|
||||||
|
|
||||||
if (sysctl(mib, 6, buf, &needed, NULL, 0) < 0) {
|
if (sysctl(mib, NMIB(mib), buf, &needed, NULL, 0) < 0) {
|
||||||
free(buf);
|
free(buf);
|
||||||
return errno;
|
return errno;
|
||||||
}
|
}
|
||||||
|
@ -1414,6 +1410,10 @@ int sigar_net_route_list_get(sigar_t *sigar,
|
||||||
sigar_net_route_t *route;
|
sigar_net_route_t *route;
|
||||||
rtm = (struct rt_msghdr *)next;
|
rtm = (struct rt_msghdr *)next;
|
||||||
|
|
||||||
|
if (rtm->rtm_type != RTM_GET) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
sa = (struct sockaddr *)(rtm + 1);
|
sa = (struct sockaddr *)(rtm + 1);
|
||||||
|
|
||||||
if (sa->sa_family != AF_INET) {
|
if (sa->sa_family != AF_INET) {
|
||||||
|
@ -1425,6 +1425,32 @@ int sigar_net_route_list_get(sigar_t *sigar,
|
||||||
SIGAR_ZERO(route);
|
SIGAR_ZERO(route);
|
||||||
|
|
||||||
route->flags = rtm->rtm_flags;
|
route->flags = rtm->rtm_flags;
|
||||||
|
|
||||||
|
for (bit=RTA_DST;
|
||||||
|
bit && ((char *)sa < lim);
|
||||||
|
bit <<= 1)
|
||||||
|
{
|
||||||
|
if ((rtm->rtm_addrs & bit) == 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
switch (bit) {
|
||||||
|
case RTA_DST:
|
||||||
|
route->destination = rt_s_addr(sa);
|
||||||
|
break;
|
||||||
|
case RTA_GATEWAY:
|
||||||
|
if (sa->sa_family == AF_INET) {
|
||||||
|
route->gateway = rt_s_addr(sa);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case RTA_NETMASK:
|
||||||
|
route->mask = rt_s_addr(sa);
|
||||||
|
break;
|
||||||
|
case RTA_IFA:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
sa = (struct sockaddr *)((char *)sa + SA_SIZE(sa));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
free(buf);
|
free(buf);
|
||||||
|
|
Loading…
Reference in New Issue