(SIGAR-198) implement net_route_list on AIX
This commit is contained in:
		
							parent
							
								
									a45a09478f
								
							
						
					
					
						commit
						39fef6c396
					
				@ -75,6 +75,9 @@
 | 
			
		||||
#include <sys/ioctl.h>
 | 
			
		||||
#include <netinet/in6_var.h>
 | 
			
		||||
 | 
			
		||||
/* for getkerninfo */
 | 
			
		||||
#include <sys/kinfo.h>
 | 
			
		||||
 | 
			
		||||
/* not defined in aix 4.3 */
 | 
			
		||||
#ifndef SBITS
 | 
			
		||||
#define SBITS 16
 | 
			
		||||
@ -1494,11 +1497,94 @@ int sigar_cpu_info_list_get(sigar_t *sigar,
 | 
			
		||||
 | 
			
		||||
    return SIGAR_OK;
 | 
			
		||||
}
 | 
			
		||||
/* XXX net_route_list copy-n-pasted from darwin_sigar.c; only diff is getkerninfo instead of sysctl */
 | 
			
		||||
#define rt_s_addr(sa) ((struct sockaddr_in *)(sa))->sin_addr.s_addr
 | 
			
		||||
 | 
			
		||||
#ifndef SA_SIZE
 | 
			
		||||
#define SA_SIZE(sa)                                             \
 | 
			
		||||
    (  (!(sa) || ((struct sockaddr *)(sa))->sa_len == 0) ?      \
 | 
			
		||||
        sizeof(long)            :                               \
 | 
			
		||||
        1 + ( (((struct sockaddr *)(sa))->sa_len - 1) | (sizeof(long) - 1) ) )
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
int sigar_net_route_list_get(sigar_t *sigar,
 | 
			
		||||
                             sigar_net_route_list_t *routelist)
 | 
			
		||||
{
 | 
			
		||||
    return SIGAR_ENOTIMPL;
 | 
			
		||||
    size_t needed;
 | 
			
		||||
    int bit;
 | 
			
		||||
    char *buf, *next, *lim;
 | 
			
		||||
    struct rt_msghdr *rtm;
 | 
			
		||||
 | 
			
		||||
    needed = getkerninfo(KINFO_RT_DUMP, NULL, NULL, 0);
 | 
			
		||||
    if (needed <= 0) {
 | 
			
		||||
        return errno;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    buf = malloc(needed);
 | 
			
		||||
 | 
			
		||||
    if (getkerninfo(KINFO_RT_DUMP, buf, &needed, 0) < 0) {
 | 
			
		||||
        return errno;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    sigar_net_route_list_create(routelist);
 | 
			
		||||
 | 
			
		||||
    lim = buf + needed;
 | 
			
		||||
 | 
			
		||||
    for (next = buf; next < lim; next += rtm->rtm_msglen) {
 | 
			
		||||
        struct sockaddr *sa;
 | 
			
		||||
        sigar_net_route_t *route;
 | 
			
		||||
        rtm = (struct rt_msghdr *)next;
 | 
			
		||||
 | 
			
		||||
        if (rtm->rtm_type != RTM_GET) {
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        sa = (struct sockaddr *)(rtm + 1);
 | 
			
		||||
 | 
			
		||||
        if (sa->sa_family != AF_INET) {
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        SIGAR_NET_ROUTE_LIST_GROW(routelist);
 | 
			
		||||
        route = &routelist->data[routelist->number++];
 | 
			
		||||
        SIGAR_ZERO(route);
 | 
			
		||||
 | 
			
		||||
        route->flags = rtm->rtm_flags;
 | 
			
		||||
        if_indextoname(rtm->rtm_index, route->ifname);
 | 
			
		||||
 | 
			
		||||
        for (bit=RTA_DST;
 | 
			
		||||
             bit && ((char *)sa < lim);
 | 
			
		||||
             bit <<= 1)
 | 
			
		||||
        {
 | 
			
		||||
            if ((rtm->rtm_addrs & bit) == 0) {
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
            switch (bit) {
 | 
			
		||||
              case RTA_DST:
 | 
			
		||||
                sigar_net_address_set(route->destination,
 | 
			
		||||
                                      rt_s_addr(sa));
 | 
			
		||||
                break;
 | 
			
		||||
              case RTA_GATEWAY:
 | 
			
		||||
                if (sa->sa_family == AF_INET) {
 | 
			
		||||
                    sigar_net_address_set(route->gateway,
 | 
			
		||||
                                          rt_s_addr(sa));
 | 
			
		||||
                }
 | 
			
		||||
                break;
 | 
			
		||||
              case RTA_NETMASK:
 | 
			
		||||
                sigar_net_address_set(route->mask,
 | 
			
		||||
                                      rt_s_addr(sa));
 | 
			
		||||
                break;
 | 
			
		||||
              case RTA_IFA:
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            sa = (struct sockaddr *)((char *)sa + SA_SIZE(sa));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    free(buf);
 | 
			
		||||
 | 
			
		||||
    return SIGAR_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int sigar_net_interface_stat_get(sigar_t *sigar,
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user