#include #include #include #include #include #include #include #include #include int main(void) { struct rt_msghdr *rtm; struct sockaddr *sa; struct sockaddr_in *sin; int mib[7]; size_t needed; char *pbuf, *next, *lim; mib[0] = CTL_NET; mib[1] = PF_ROUTE; mib[2] = 0; mib[3] = AF_INET; mib[4] = NET_RT_DUMP; mib[5] = 0; mib[6] = 0; if (sysctl(mib, 7, NULL, &needed, NULL, 0) < 0) { perror("sysctl"); exit(1); } if ((pbuf = (void*)calloc(needed, 1)) == NULL) { perror("calloc"); exit(1); } if (sysctl(mib, 7, pbuf, &needed, NULL, 0) < 0) { perror("sysctl"); exit(1); } lim = pbuf + needed; for (next = pbuf; next < lim; next += rtm->rtm_msglen) { rtm = (struct rt_msghdr *)next; if (rtm->rtm_version != RTM_VERSION) continue; sa = (struct sockaddr *)(next + rtm->rtm_hdrlen); if (sa->sa_family != AF_INET) continue; if ((rtm->rtm_addrs & RTA_DST) && (rtm->rtm_addrs & RTA_GATEWAY) && (rtm->rtm_addrs & RTA_NETMASK)) { sin = (struct sockaddr_in *)(sa + RTAX_DST); printf("destination: %s\n", inet_ntoa(sin->sin_addr.s_addr)); sin = (struct sockaddr_in *)(sa + RTAX_GATEWAY); printf("gateway: %s\n", inet_ntoa(sin->sin_addr.s_addr)); sin = (struct sockaddr_in *)(sa + RTAX_NETMASK); printf("netmask: %s\n", inet_ntoa(sin->sin_addr.s_addr)); printf("-----\n"); } } }