(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 <sys/ioctl.h>
 | 
				
			||||||
#include <netinet/in6_var.h>
 | 
					#include <netinet/in6_var.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* for getkerninfo */
 | 
				
			||||||
 | 
					#include <sys/kinfo.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* not defined in aix 4.3 */
 | 
					/* not defined in aix 4.3 */
 | 
				
			||||||
#ifndef SBITS
 | 
					#ifndef SBITS
 | 
				
			||||||
#define SBITS 16
 | 
					#define SBITS 16
 | 
				
			||||||
@ -1494,11 +1497,94 @@ int sigar_cpu_info_list_get(sigar_t *sigar,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    return SIGAR_OK;
 | 
					    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,
 | 
					int sigar_net_route_list_get(sigar_t *sigar,
 | 
				
			||||||
                             sigar_net_route_list_t *routelist)
 | 
					                             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,
 | 
					int sigar_net_interface_stat_get(sigar_t *sigar,
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user