#include #include #include #include #include /* mostly ripped. just outputs routes from KRT on NetBSD. used to look closer at a difference of output from route and netstat. */ get_rtaddrs(int addrs, struct sockaddr *sa, struct sockaddr **rti_info) { int i; for (i = 0; i < RTAX_MAX; i++) { if (addrs & (1 << i)) { rti_info[i] = sa; sa = (struct sockaddr *)((char *)(sa) + RT_ROUNDUP(sa->sa_len)); } else rti_info[i] = NULL; } } void print_sa6(struct sockaddr *sa) { int i=0; struct sockaddr_in6 *sa6 = (struct sockaddr_in6 *)sa; struct in6_addr *in6 = &sa6->sin6_addr; if(sa) { for(i=0;i<16;i++) { printf("%02x",(unsigned char)in6->s6_addr[i]); i++; printf("%02x",(unsigned char)in6->s6_addr[i]); if(i != 15) printf(":"); } } else { printf("none"); } printf("\n"); } void p_rtentry(struct rt_msghdr *rtm) { struct sockadrr *sa = (struct sockaddr *)(rtm+1); struct sockaddr *rti_info[RTAX_MAX]; struct sockaddr_in6 *sa6 = (struct sockaddr_in6 *)sa; struct in6_addr *in6 = &sa6->sin6_addr; get_rtaddrs(rtm->rtm_addrs, sa, rti_info); printf("addr: "); print_sa6(rti_info[RTAX_DST]); printf("mask: "); print_sa6(rti_info[RTAX_NETMASK]); printf("gate: "); print_sa6(rti_info[RTAX_GATEWAY]); printf("\n"); } int main() { // sysctl(const int *name, u_int namelen, void *oldp, size_t *oldlenp, // const void *newp, size_t newlen); int needed; struct rt_msghdr *rtm; struct sockaddr *sa; char *buf,*next,*lim; int mib[6]; mib[0]=CTL_NET; mib[1]=PF_ROUTE; mib[2]=0; mib[3]=AF_INET6; mib[4]=NET_RT_DUMP; mib[5]=0; sysctl(mib,6,NULL,&needed,NULL,0); buf=malloc(needed); sysctl(mib,6,buf,&needed,NULL,0); lim=buf+needed; if (buf) { for (next = buf; next < lim; next += rtm->rtm_msglen) { rtm = (struct rt_msghdr *)next; sa = (struct sockaddr *)(rtm + 1); if (sa->sa_family != AF_INET6) continue; p_rtentry(rtm); } free(buf); buf = NULL; } }