From 30300843e0c66ca3eefa97f5787f95b07c256d2f Mon Sep 17 00:00:00 2001 From: Epoch Qwert Date: Sun, 23 Nov 2014 14:25:42 -0600 Subject: fixed gitignore. >_> added a bunch of new piddly shit. --- src/bin/rrd.c | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 src/bin/rrd.c (limited to 'src/bin/rrd.c') diff --git a/src/bin/rrd.c b/src/bin/rrd.c new file mode 100644 index 0000000..bbb907d --- /dev/null +++ b/src/bin/rrd.c @@ -0,0 +1,91 @@ +#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; + } + +} -- cgit v1.2.3