|
|
1.1 ! root 1: ! 2: #include <stdio.h> ! 3: #include <sys/types.h> ! 4: #include <sys/socket.h> ! 5: #include <sys/mbuf.h> ! 6: ! 7: #include <net/if.h> ! 8: #define KERNEL /* to get routehash and RTHASHSIZ */ ! 9: #include <net/route.h> ! 10: #include <netinet/in.h> ! 11: #include <netdb.h> ! 12: #include <nlist.h> ! 13: #include "nstat.h" ! 14: ! 15: ! 16: struct nlist routenl[] = { ! 17: # define N_RTHOST 0 ! 18: { "_rthost" }, ! 19: # define N_RTNET 1 ! 20: { "_rtnet" }, ! 21: # define N_RTSTAT 2 ! 22: { "_rtstat" }, ! 23: { "" }, ! 24: }; ! 25: static int getvm = 0; ! 26: extern long flaggiven; ! 27: extern int kmem; /* file descriptor of kmem file */ ! 28: extern char *routename(); ! 29: extern char *system; ! 30: ! 31: /* ! 32: * Definitions for showing gateway flags. ! 33: */ ! 34: struct bits { ! 35: short b_mask; ! 36: char b_val; ! 37: } bits[] = { ! 38: { RTF_UP, 'U' }, ! 39: { RTF_GATEWAY, 'G' }, ! 40: { RTF_HOST, 'H' }, ! 41: { 0 } ! 42: }; ! 43: ! 44: /* ! 45: * Print routing tables. ! 46: */ ! 47: routepr() ! 48: { ! 49: off_t hostaddr, netaddr; ! 50: struct mbuf mb; ! 51: register struct rtentry *rt; ! 52: register struct mbuf *m; ! 53: register struct bits *p; ! 54: struct netent *np; ! 55: struct hostent *hp; ! 56: char name[16], *flags; ! 57: struct mbuf *routehash[RTHASHSIZ]; ! 58: struct ifnet ifnet; ! 59: int first = 1, i, doinghost = 1; ! 60: ! 61: ! 62: if (!getvm) { ! 63: nlist(system, routenl); ! 64: ++getvm; ! 65: } ! 66: hostaddr = routenl[N_RTHOST].n_value; ! 67: netaddr = routenl[N_RTNET].n_value; ! 68: if (hostaddr == 0) { ! 69: printf("rthost: symbol not in namelist\n"); ! 70: return; ! 71: } ! 72: if (netaddr == 0) { ! 73: printf("rtnet: symbol not in namelist\n"); ! 74: return; ! 75: } ! 76: klseek(kmem, hostaddr, 0); ! 77: read(kmem, routehash, sizeof (routehash)); ! 78: printf("Routing Tables\n"); ! 79: printf("%-15.15s %-15.15s %-8.8s %-6.6s %-10.10s %s\n", ! 80: "Destination", "Gateway", ! 81: "Flags", "Refcnt", "Use", "Interface"); ! 82: again: ! 83: for (i = 0; i < RTHASHSIZ; i++) { ! 84: if (routehash[i] == 0) ! 85: continue; ! 86: m = routehash[i]; ! 87: while (m) { ! 88: struct sockaddr_in *sin; ! 89: ! 90: klseek(kmem, m, 0); ! 91: read(kmem, &mb, sizeof (mb)); ! 92: rt = mtod(&mb, struct rtentry *); ! 93: sin = (struct sockaddr_in *)&rt->rt_dst; ! 94: printf("%-15.15s ", ! 95: sin->sin_addr.s_addr ? ! 96: routename(sin->sin_addr) : "default"); ! 97: sin = (struct sockaddr_in *)&rt->rt_gateway; ! 98: printf("%-15.15s ", routename(sin->sin_addr)); ! 99: for (flags = name, p = bits; p->b_mask; p++) ! 100: if (p->b_mask & rt->rt_flags) ! 101: *flags++ = p->b_val; ! 102: *flags = '\0'; ! 103: printf("%-8.8s %-6d %-10d ", name, ! 104: rt->rt_refcnt, rt->rt_use); ! 105: if (rt->rt_ifp == 0) { ! 106: putchar('\n'); ! 107: m = mb.m_next; ! 108: continue; ! 109: } ! 110: klseek(kmem, rt->rt_ifp, 0); ! 111: read(kmem, &ifnet, sizeof (ifnet)); ! 112: klseek(kmem, (int)ifnet.if_name, 0); ! 113: read(kmem, name, 16); ! 114: printf("%s%d\n", name, ifnet.if_unit); ! 115: m = mb.m_next; ! 116: } ! 117: } ! 118: if (doinghost) { ! 119: klseek(kmem, netaddr, 0); ! 120: read(kmem, routehash, sizeof (routehash)); ! 121: doinghost = 0; ! 122: goto again; ! 123: } ! 124: } ! 125: ! 126: char * ! 127: routename(in) ! 128: struct in_addr in; ! 129: { ! 130: char *cp = 0; ! 131: static char line[50]; ! 132: int lna, net; ! 133: ! 134: net = inet_netof(in); ! 135: lna = inet_lnaof(in); ! 136: if (!nflag) { ! 137: if (lna == INADDR_ANY) { ! 138: struct netent *np = getnetbyaddr(net, AF_INET); ! 139: ! 140: if (np) ! 141: cp = np->n_name; ! 142: } else { ! 143: struct hostent *hp; ! 144: ! 145: hp = gethostbyaddr(&in, sizeof (struct in_addr), ! 146: AF_INET); ! 147: if (hp) ! 148: cp = hp->h_name; ! 149: } ! 150: } ! 151: if (cp) ! 152: strcpy(line, cp); ! 153: else { ! 154: u_char *ucp = (u_char *)∈ ! 155: if (lna == INADDR_ANY) ! 156: sprintf(line, "%u.%u.%u", ucp[0], ucp[1], ucp[2]); ! 157: else ! 158: sprintf(line, "%u.%u.%u.%u", ucp[0], ucp[1], ! 159: ucp[2], ucp[3]); ! 160: } ! 161: return (line); ! 162: } ! 163: ! 164: /* ! 165: * Print routing statistics ! 166: */ ! 167: rt_stats() ! 168: { ! 169: off_t off; ! 170: struct rtstat rtstat; ! 171: ! 172: if (!getvm) { ! 173: nlist(system, routenl); ! 174: ++getvm; ! 175: } ! 176: off = routenl[N_RTSTAT].n_value; ! 177: if (off == 0) { ! 178: printf("rtstat: symbol not in namelist\n"); ! 179: return; ! 180: } ! 181: klseek(kmem, off, 0); ! 182: read(kmem, (char *)&rtstat, sizeof (rtstat)); ! 183: printf("routing:\n"); ! 184: printf("\t%d bad routing redirect%s\n", ! 185: rtstat.rts_badredirect, plural(rtstat.rts_badredirect)); ! 186: printf("\t%d dynamically created route%s\n", ! 187: rtstat.rts_dynamic, plural(rtstat.rts_dynamic)); ! 188: printf("\t%d new gateway%s due to redirects\n", ! 189: rtstat.rts_newgateway, plural(rtstat.rts_newgateway)); ! 190: printf("\t%d destination%s found unreachable\n", ! 191: rtstat.rts_unreach, plural(rtstat.rts_unreach)); ! 192: printf("\t%d use%s of a wildcard route\n", ! 193: rtstat.rts_wildcard, plural(rtstat.rts_wildcard)); ! 194: } ! 195: /* ! 196: * ! 197: */ ! 198: printrt(rt) ! 199: register struct rtentry *rt; ! 200: { ! 201: struct mbuf mb; ! 202: register struct bits *p; ! 203: struct rtentry routentry; ! 204: struct netent *np; ! 205: struct hostent *hp; ! 206: char name[16], *flags; ! 207: struct mbuf *routehash[RTHASHSIZ]; ! 208: struct ifnet ifnet; ! 209: struct sockaddr_in *sin; ! 210: int first = 1, i, doinghost = 1; ! 211: ! 212: printf("---Ro_rt:");fflush(stdout); ! 213: ! 214: klseek(kmem, rt, 0); ! 215: read(kmem, &routentry, sizeof (routentry)); ! 216: rt = &routentry; ! 217: sin = (struct sockaddr_in *)&rt->rt_dst; ! 218: printf("Dest:%s; ", ! 219: sin->sin_addr.s_addr ? ! 220: routename(sin->sin_addr) : "default"); ! 221: sin = (struct sockaddr_in *)&rt->rt_gateway; ! 222: printf("\n\tGate:%s; ", routename(sin->sin_addr)); ! 223: for (flags = name, p = bits; p->b_mask; p++) ! 224: if (p->b_mask & rt->rt_flags) ! 225: *flags++ = p->b_val; ! 226: *flags = '\0'; ! 227: printf("flag:%s; refc:%d; use:%d ", name, ! 228: rt->rt_refcnt, rt->rt_use); ! 229: if (rt->rt_ifp == 0) { ! 230: return; ! 231: } ! 232: klseek(kmem, rt->rt_ifp, 0); ! 233: read(kmem, &ifnet, sizeof (ifnet)); ! 234: klseek(kmem, (int)ifnet.if_name, 0); ! 235: read(kmem, name, 16); ! 236: printf("interf:%s, unit:%d", name, ifnet.if_unit); ! 237: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.