Annotation of 43BSD/ucb/netstat/route.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1983 Regents of the University of California.
                      3:  * All rights reserved.  The Berkeley software License Agreement
                      4:  * specifies the terms and conditions for redistribution.
                      5:  */
                      6: 
                      7: #ifndef lint
                      8: static char sccsid[] = "@(#)route.c    5.6 (Berkeley) 86/04/23";
                      9: #endif
                     10: 
                     11: #include <sys/param.h>
                     12: #include <sys/socket.h>
                     13: #include <sys/mbuf.h>
                     14: 
                     15: #include <net/if.h>
                     16: #include <net/route.h>
                     17: #include <netinet/in.h>
                     18: 
                     19: #include <netns/ns.h>
                     20: 
                     21: #include <netdb.h>
                     22: 
                     23: extern int kmem;
                     24: extern int nflag;
                     25: extern char *routename(), *netname(), *ns_print();
                     26: 
                     27: /*
                     28:  * Definitions for showing gateway flags.
                     29:  */
                     30: struct bits {
                     31:        short   b_mask;
                     32:        char    b_val;
                     33: } bits[] = {
                     34:        { RTF_UP,       'U' },
                     35:        { RTF_GATEWAY,  'G' },
                     36:        { RTF_HOST,     'H' },
                     37:        { RTF_DYNAMIC,  'D' },
                     38:        { 0 }
                     39: };
                     40: 
                     41: /*
                     42:  * Print routing tables.
                     43:  */
                     44: routepr(hostaddr, netaddr, hashsizeaddr)
                     45:        off_t hostaddr, netaddr, hashsizeaddr;
                     46: {
                     47:        struct mbuf mb;
                     48:        register struct rtentry *rt;
                     49:        register struct mbuf *m;
                     50:        register struct bits *p;
                     51:        char name[16], *flags;
                     52:        struct mbuf **routehash;
                     53:        struct ifnet ifnet;
                     54:        int hashsize;
                     55:        int i, doinghost = 1;
                     56: 
                     57:        if (hostaddr == 0) {
                     58:                printf("rthost: symbol not in namelist\n");
                     59:                return;
                     60:        }
                     61:        if (netaddr == 0) {
                     62:                printf("rtnet: symbol not in namelist\n");
                     63:                return;
                     64:        }
                     65:        if (hashsizeaddr == 0) {
                     66:                printf("rthashsize: symbol not in namelist\n");
                     67:                return;
                     68:        }
                     69:        klseek(kmem, hashsizeaddr, 0);
                     70:        read(kmem, &hashsize, sizeof (hashsize));
                     71:        routehash = (struct mbuf **)malloc( hashsize*sizeof (struct mbuf *) );
                     72:        klseek(kmem, hostaddr, 0);
                     73:        read(kmem, routehash, hashsize*sizeof (struct mbuf *));
                     74:        printf("Routing tables\n");
                     75:        printf("%-20.20s %-20.20s %-8.8s %-6.6s %-10.10s %s\n",
                     76:                "Destination", "Gateway",
                     77:                "Flags", "Refcnt", "Use", "Interface");
                     78: again:
                     79:        for (i = 0; i < hashsize; i++) {
                     80:                if (routehash[i] == 0)
                     81:                        continue;
                     82:                m = routehash[i];
                     83:                while (m) {
                     84:                        struct sockaddr_in *sin;
                     85:                        struct sockaddr_ns *sns;
                     86: 
                     87:                        klseek(kmem, m, 0);
                     88:                        read(kmem, &mb, sizeof (mb));
                     89:                        rt = mtod(&mb, struct rtentry *);
                     90:                        if ((unsigned)rt < (unsigned)&mb ||
                     91:                            (unsigned)rt >= (unsigned)(&mb + 1)) {
                     92:                                printf("???\n");
                     93:                                return;
                     94:                        }
                     95: 
                     96:                        switch(rt->rt_dst.sa_family) {
                     97:                        case AF_INET:
                     98:                                sin = (struct sockaddr_in *)&rt->rt_dst;
                     99:                                printf("%-20.20s ",
                    100:                                    (sin->sin_addr.s_addr == 0) ? "default" :
                    101:                                    (rt->rt_flags & RTF_HOST) ?
                    102:                                    routename(sin->sin_addr) :
                    103:                                        netname(sin->sin_addr, 0));
                    104:                                sin = (struct sockaddr_in *)&rt->rt_gateway;
                    105:                                printf("%-20.20s ", routename(sin->sin_addr));
                    106:                                break;
                    107:                        case AF_NS:
                    108:                                printf("%-20s ",
                    109:                                    ns_print((struct sockaddr_ns *)&rt->rt_dst));
                    110:                                printf("%-20s ",
                    111:                                    ns_print((struct sockaddr_ns *)&rt->rt_gateway));
                    112:                                break;
                    113:                        default:
                    114:                                {
                    115:                                u_short *s = (u_short *)rt->rt_dst.sa_data;
                    116:                                printf("(%d)%x %x %x %x %x %x %x ",
                    117:                                    rt->rt_dst.sa_family,
                    118:                                    s[0], s[1], s[2], s[3], s[4], s[5], s[6]);
                    119:                                s = (u_short *)rt->rt_gateway.sa_data;
                    120:                                printf("(%d)%x %x %x %x %x %x %x ",
                    121:                                    rt->rt_gateway.sa_family,
                    122:                                    s[0], s[1], s[2], s[3], s[4], s[5], s[6]);
                    123:                                }
                    124:                        }
                    125:                        for (flags = name, p = bits; p->b_mask; p++)
                    126:                                if (p->b_mask & rt->rt_flags)
                    127:                                        *flags++ = p->b_val;
                    128:                        *flags = '\0';
                    129:                        printf("%-8.8s %-6d %-10d ", name,
                    130:                                rt->rt_refcnt, rt->rt_use);
                    131:                        if (rt->rt_ifp == 0) {
                    132:                                putchar('\n');
                    133:                                m = mb.m_next;
                    134:                                continue;
                    135:                        }
                    136:                        klseek(kmem, rt->rt_ifp, 0);
                    137:                        read(kmem, &ifnet, sizeof (ifnet));
                    138:                        klseek(kmem, (int)ifnet.if_name, 0);
                    139:                        read(kmem, name, 16);
                    140:                        printf("%s%d\n", name, ifnet.if_unit);
                    141:                        m = mb.m_next;
                    142:                }
                    143:        }
                    144:        if (doinghost) {
                    145:                klseek(kmem, netaddr, 0);
                    146:                read(kmem, routehash, hashsize*sizeof (struct mbuf *));
                    147:                doinghost = 0;
                    148:                goto again;
                    149:        }
                    150:        free(routehash);
                    151: }
                    152: 
                    153: char *
                    154: routename(in)
                    155:        struct in_addr in;
                    156: {
                    157:        register char *cp;
                    158:        static char line[50];
                    159:        struct hostent *hp;
                    160:        static char domain[MAXHOSTNAMELEN + 1];
                    161:        static int first = 1;
                    162:        char *index();
                    163: 
                    164:        if (first) {
                    165:                first = 0;
                    166:                if (gethostname(domain, MAXHOSTNAMELEN) == 0 &&
                    167:                    (cp = index(domain, '.')))
                    168:                        (void) strcpy(domain, cp + 1);
                    169:                else
                    170:                        domain[0] = 0;
                    171:        }
                    172:        cp = 0;
                    173:        if (!nflag) {
                    174:                hp = gethostbyaddr(&in, sizeof (struct in_addr),
                    175:                        AF_INET);
                    176:                if (hp) {
                    177:                        if ((cp = index(hp->h_name, '.')) &&
                    178:                            !strcmp(cp + 1, domain))
                    179:                                *cp = 0;
                    180:                        cp = hp->h_name;
                    181:                }
                    182:        }
                    183:        if (cp)
                    184:                strcpy(line, cp);
                    185:        else {
                    186: #define C(x)   ((x) & 0xff)
                    187:                in.s_addr = ntohl(in.s_addr);
                    188:                sprintf(line, "%u.%u.%u.%u", C(in.s_addr >> 24),
                    189:                        C(in.s_addr >> 16), C(in.s_addr >> 8), C(in.s_addr));
                    190:        }
                    191:        return (line);
                    192: }
                    193: 
                    194: /*
                    195:  * Return the name of the network whose address is given.
                    196:  * The address is assumed to be that of a net or subnet, not a host.
                    197:  */
                    198: char *
                    199: netname(in, mask)
                    200:        struct in_addr in;
                    201:        u_long mask;
                    202: {
                    203:        char *cp = 0;
                    204:        static char line[50];
                    205:        struct netent *np = 0;
                    206:        u_long net;
                    207:        register i;
                    208:        int subnetshift;
                    209: 
                    210:        in.s_addr = ntohl(in.s_addr);
                    211:        if (!nflag && in.s_addr) {
                    212:                if (mask == 0) {
                    213:                        if (IN_CLASSA(i)) {
                    214:                                mask = IN_CLASSA_NET;
                    215:                                subnetshift = 8;
                    216:                        } else if (IN_CLASSB(i)) {
                    217:                                mask = IN_CLASSB_NET;
                    218:                                subnetshift = 8;
                    219:                        } else {
                    220:                                mask = IN_CLASSC_NET;
                    221:                                subnetshift = 4;
                    222:                        }
                    223:                        /*
                    224:                         * If there are more bits than the standard mask
                    225:                         * would suggest, subnets must be in use.
                    226:                         * Guess at the subnet mask, assuming reasonable
                    227:                         * width subnet fields.
                    228:                         */
                    229:                        while (in.s_addr &~ mask)
                    230:                                mask = (long)mask >> subnetshift;
                    231:                }
                    232:                net = in.s_addr & mask;
                    233:                while ((mask & 1) == 0)
                    234:                        mask >>= 1, net >>= 1;
                    235:                np = getnetbyaddr(net, AF_INET);
                    236:                if (np)
                    237:                        cp = np->n_name;
                    238:        }
                    239:        if (cp)
                    240:                strcpy(line, cp);
                    241:        else if ((in.s_addr & 0xffffff) == 0)
                    242:                sprintf(line, "%u", C(in.s_addr >> 24));
                    243:        else if ((in.s_addr & 0xffff) == 0)
                    244:                sprintf(line, "%u.%u", C(in.s_addr >> 24) , C(in.s_addr >> 16));
                    245:        else if ((in.s_addr & 0xff) == 0)
                    246:                sprintf(line, "%u.%u.%u", C(in.s_addr >> 24),
                    247:                        C(in.s_addr >> 16), C(in.s_addr >> 8));
                    248:        else
                    249:                sprintf(line, "%u.%u.%u.%u", C(in.s_addr >> 24),
                    250:                        C(in.s_addr >> 16), C(in.s_addr >> 8), C(in.s_addr));
                    251:        return (line);
                    252: }
                    253: 
                    254: /*
                    255:  * Print routing statistics
                    256:  */
                    257: rt_stats(off)
                    258:        off_t off;
                    259: {
                    260:        struct rtstat rtstat;
                    261: 
                    262:        if (off == 0) {
                    263:                printf("rtstat: symbol not in namelist\n");
                    264:                return;
                    265:        }
                    266:        klseek(kmem, off, 0);
                    267:        read(kmem, (char *)&rtstat, sizeof (rtstat));
                    268:        printf("routing:\n");
                    269:        printf("\t%d bad routing redirect%s\n",
                    270:                rtstat.rts_badredirect, plural(rtstat.rts_badredirect));
                    271:        printf("\t%d dynamically created route%s\n",
                    272:                rtstat.rts_dynamic, plural(rtstat.rts_dynamic));
                    273:        printf("\t%d new gateway%s due to redirects\n",
                    274:                rtstat.rts_newgateway, plural(rtstat.rts_newgateway));
                    275:        printf("\t%d destination%s found unreachable\n",
                    276:                rtstat.rts_unreach, plural(rtstat.rts_unreach));
                    277:        printf("\t%d use%s of a wildcard route\n",
                    278:                rtstat.rts_wildcard, plural(rtstat.rts_wildcard));
                    279: }
                    280: short ns_nullh[] = {0,0,0};
                    281: short ns_bh[] = {-1,-1,-1};
                    282: 
                    283: char *
                    284: ns_print(sns)
                    285: struct sockaddr_ns *sns;
                    286: {
                    287:        struct ns_addr work;
                    288:        union { union ns_net net_e; u_long long_e; } net;
                    289:        u_short port;
                    290:        static char mybuf[50], cport[10], chost[25];
                    291:        char *host = "";
                    292:        register char *p; register u_char *q; u_char *q_lim;
                    293: 
                    294:        work = sns->sns_addr;
                    295:        port = ntohs(work.x_port);
                    296:        work.x_port = 0;
                    297:        net.net_e  = work.x_net;
                    298:        if (ns_nullhost(work) && net.long_e == 0) {
                    299:                if (port ) {
                    300:                        sprintf(mybuf, "*.%xH", port);
                    301:                        upHex(mybuf);
                    302:                } else
                    303:                        sprintf(mybuf, "*.*");
                    304:                return (mybuf);
                    305:        }
                    306: 
                    307:        if (bcmp(ns_bh, work.x_host.c_host, 6) == 0) { 
                    308:                host = "any";
                    309:        } else if (bcmp(ns_nullh, work.x_host.c_host, 6) == 0) {
                    310:                host = "*";
                    311:        } else {
                    312:                q = work.x_host.c_host;
                    313:                sprintf(chost, "%02x%02x%02x%02x%02x%02xH",
                    314:                        q[0], q[1], q[2], q[3], q[4], q[5]);
                    315:                for (p = chost; *p == '0' && p < chost + 12; p++);
                    316:                host = p;
                    317:        }
                    318:        if (port)
                    319:                sprintf(cport, ".%xH", htons(port));
                    320:        else
                    321:                *cport = 0;
                    322: 
                    323:        sprintf(mybuf,"%xH.%s%s", ntohl(net.long_e), host, cport);
                    324:        upHex(mybuf);
                    325:        return(mybuf);
                    326: }
                    327: 
                    328: char *
                    329: ns_phost(sns)
                    330: struct sockaddr_ns *sns;
                    331: {
                    332:        struct sockaddr_ns work;
                    333:        static union ns_net ns_zeronet;
                    334:        char *p;
                    335:        
                    336:        work = *sns;
                    337:        work.sns_addr.x_port = 0;
                    338:        work.sns_addr.x_net = ns_zeronet;
                    339: 
                    340:        p = ns_print(&work);
                    341:        if (strncmp("0H.", p, 3) == 0) p += 3;
                    342:        return(p);
                    343: }
                    344: upHex(p0)
                    345: char *p0;
                    346: {
                    347:        register char *p = p0;
                    348:        for (; *p; p++) switch (*p) {
                    349: 
                    350:        case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
                    351:                *p += ('A' - 'a');
                    352:        }
                    353: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.