static void p_tree(struct radix_node *rn) { again: kget(rn, rnode); if (rnode.rn_bit < 0) { if (Aflag) printf("%-8.8lx ", (u_long)rn); if (rnode.rn_flags & RNF_ROOT) { if (Aflag) printf("(root node)%s", rnode.rn_dupedkey ? " =>\n" : "\n"); } else if (do_rtent) { kget(rn, rtentry); p_rtentry(&rtentry); if (Aflag) p_rtnode(); } else { p_sockaddr(kgetsa((struct sockaddr *)rnode.rn_key), NULL, 0, 44); putchar('\n'); } if ((rn = rnode.rn_dupedkey)) goto again; } else { if (Aflag && do_rtent) { printf("%-8.8lx ", (u_long)rn); p_rtnode(); } rn = rnode.rn_right; p_tree(rnode.rn_left); p_tree(rn); } }
/* * Print routing tables. */ void show(int argc, char *argv[]) { struct rt_msghdr *rtm; char *buf = NULL, *next, *lim = NULL; size_t needed; int mib[7], af = 0; int miblen; struct sockaddr *sa; if (argc > 1) { argv++; if (argc == 2 && **argv == '-') { switch (keyword(*argv + 1)) { case K_INET: af = AF_INET; break; #ifdef INET6 case K_INET6: af = AF_INET6; break; #endif case K_XNS: af = AF_NS; break; case K_LINK: af = AF_LINK; break; case K_ISO: case K_OSI: af = AF_ISO; break; case K_X25: af = AF_CCITT; break; default: goto bad; } } else bad: usage(*argv); } mib[0] = CTL_NET; mib[1] = PF_ROUTE; mib[2] = 0; mib[3] = 0; mib[4] = NET_RT_DUMP; mib[5] = 0; if (cpuflag >= 0) { mib[6] = cpuflag; miblen = 7; } else { miblen = 6; } if (sysctl(mib, miblen, NULL, &needed, NULL, 0) < 0) { perror("route-sysctl-estimate"); exit(1); } if (needed > 0) { if ((buf = malloc(needed)) == NULL) { printf("out of space\n"); exit(1); } if (sysctl(mib, miblen, buf, &needed, NULL, 0) < 0) { perror("sysctl of routing table"); exit(1); } lim = buf + needed; } printf("Routing tables\n"); if (buf != NULL) { for (next = buf; next < lim; next += rtm->rtm_msglen) { rtm = (struct rt_msghdr *)next; sa = (struct sockaddr *)(rtm + 1); if (af != 0 && sa->sa_family != af) continue; p_rtentry(rtm); } free(buf); } }