Annotation of 43BSD/ucb/netstat/if.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[] = "@(#)if.c       5.3 (Berkeley) 4/23/86";
                      9: #endif not lint
                     10: 
                     11: #include <sys/types.h>
                     12: #include <sys/socket.h>
                     13: 
                     14: #include <net/if.h>
                     15: #include <netinet/in.h>
                     16: #include <netinet/in_var.h>
                     17: #include <netns/ns.h>
                     18: 
                     19: #include <stdio.h>
                     20: 
                     21: extern int kmem;
                     22: extern int tflag;
                     23: extern int nflag;
                     24: extern char *interface;
                     25: extern int unit;
                     26: extern char *routename(), *netname();
                     27: 
                     28: /*
                     29:  * Print a description of the network interfaces.
                     30:  */
                     31: intpr(interval, ifnetaddr)
                     32:        int interval;
                     33:        off_t ifnetaddr;
                     34: {
                     35:        struct ifnet ifnet;
                     36:        union {
                     37:                struct ifaddr ifa;
                     38:                struct in_ifaddr in;
                     39:        } ifaddr;
                     40:        off_t ifaddraddr;
                     41:        char name[16];
                     42: 
                     43:        if (ifnetaddr == 0) {
                     44:                printf("ifnet: symbol not defined\n");
                     45:                return;
                     46:        }
                     47:        if (interval) {
                     48:                sidewaysintpr(interval, ifnetaddr);
                     49:                return;
                     50:        }
                     51:        klseek(kmem, ifnetaddr, 0);
                     52:        read(kmem, &ifnetaddr, sizeof ifnetaddr);
                     53:        printf("%-5.5s %-5.5s %-10.10s  %-12.12s %-7.7s %-5.5s %-7.7s %-5.5s",
                     54:                "Name", "Mtu", "Network", "Address", "Ipkts", "Ierrs",
                     55:                "Opkts", "Oerrs");
                     56:        printf(" %-6.6s", "Collis");
                     57:        if (tflag)
                     58:                printf(" %-6.6s", "Timer");
                     59:        putchar('\n');
                     60:        ifaddraddr = 0;
                     61:        while (ifnetaddr || ifaddraddr) {
                     62:                struct sockaddr_in *sin;
                     63:                register char *cp;
                     64:                int n;
                     65:                char *index();
                     66:                struct in_addr in, inet_makeaddr();
                     67: 
                     68:                if (ifaddraddr == 0) {
                     69:                        klseek(kmem, ifnetaddr, 0);
                     70:                        read(kmem, &ifnet, sizeof ifnet);
                     71:                        klseek(kmem, (off_t)ifnet.if_name, 0);
                     72:                        read(kmem, name, 16);
                     73:                        name[15] = '\0';
                     74:                        ifnetaddr = (off_t) ifnet.if_next;
                     75:                        if (interface != 0 &&
                     76:                            (strcmp(name, interface) != 0 || unit != ifnet.if_unit))
                     77:                                continue;
                     78:                        cp = index(name, '\0');
                     79:                        *cp++ = ifnet.if_unit + '0';
                     80:                        if ((ifnet.if_flags&IFF_UP) == 0)
                     81:                                *cp++ = '*';
                     82:                        *cp = '\0';
                     83:                        ifaddraddr = (off_t)ifnet.if_addrlist;
                     84:                }
                     85:                printf("%-5.5s %-5d ", name, ifnet.if_mtu);
                     86:                if (ifaddraddr == 0) {
                     87:                        printf("%-10.10s  ", "none");
                     88:                        printf("%-12.12s ", "none");
                     89:                } else {
                     90:                        klseek(kmem, ifaddraddr, 0);
                     91:                        read(kmem, &ifaddr, sizeof ifaddr);
                     92:                        ifaddraddr = (off_t)ifaddr.ifa.ifa_next;
                     93:                        switch (ifaddr.ifa.ifa_addr.sa_family) {
                     94:                        case AF_UNSPEC:
                     95:                                printf("%-10.10s  ", "none");
                     96:                                printf("%-12.12s ", "none");
                     97:                                break;
                     98:                        case AF_INET:
                     99:                                sin = (struct sockaddr_in *)&ifaddr.in.ia_addr;
                    100: #ifdef notdef
                    101:                                /* can't use inet_makeaddr because kernel
                    102:                                 * keeps nets unshifted.
                    103:                                 */
                    104:                                in = inet_makeaddr(ifaddr.in.ia_subnet,
                    105:                                        INADDR_ANY);
                    106:                                printf("%-10.10s  ", netname(in));
                    107: #else
                    108:                                printf("%-10.10s  ",
                    109:                                        netname(htonl(ifaddr.in.ia_subnet),
                    110:                                                ifaddr.in.ia_subnetmask));
                    111: #endif
                    112:                                printf("%-12.12s ", routename(sin->sin_addr));
                    113:                                break;
                    114:                        case AF_NS:
                    115:                                {
                    116:                                struct sockaddr_ns *sns =
                    117:                                (struct sockaddr_ns *)&ifaddr.in.ia_addr;
                    118:                                long net;
                    119:                                char host[8];
                    120:                                *(union ns_net *) &net = sns->sns_addr.x_net;
                    121:                                sprintf(host, "%lxH", ntohl(net));
                    122:                                upHex(host);
                    123:                                printf("ns:%-8s ", host);
                    124: 
                    125:                                printf("%-12s ",ns_phost(sns));
                    126:                                }
                    127:                                break;
                    128:                        default:
                    129:                                printf("af%2d: ", ifaddr.ifa.ifa_addr.sa_family);
                    130:                                for (cp = (char *)&ifaddr.ifa.ifa_addr +
                    131:                                    sizeof(struct sockaddr) - 1;
                    132:                                    cp >= ifaddr.ifa.ifa_addr.sa_data; --cp)
                    133:                                        if (*cp != 0)
                    134:                                                break;
                    135:                                n = cp - (char *)ifaddr.ifa.ifa_addr.sa_data + 1;
                    136:                                cp = (char *)ifaddr.ifa.ifa_addr.sa_data;
                    137:                                if (n <= 6)
                    138:                                        while (--n)
                    139:                                                printf("%02d.", *cp++ & 0xff);
                    140:                                else
                    141:                                        while (--n)
                    142:                                                printf("%02d", *cp++ & 0xff);
                    143:                                printf("%02d ", *cp & 0xff);
                    144:                                break;
                    145:                        }
                    146:                }
                    147:                printf("%-7d %-5d %-7d %-5d %-6d",
                    148:                    ifnet.if_ipackets, ifnet.if_ierrors,
                    149:                    ifnet.if_opackets, ifnet.if_oerrors,
                    150:                    ifnet.if_collisions);
                    151:                if (tflag)
                    152:                        printf(" %-6d", ifnet.if_timer);
                    153:                putchar('\n');
                    154:        }
                    155: }
                    156: 
                    157: #define        MAXIF   10
                    158: struct iftot {
                    159:        char    ift_name[16];           /* interface name */
                    160:        int     ift_ip;                 /* input packets */
                    161:        int     ift_ie;                 /* input errors */
                    162:        int     ift_op;                 /* output packets */
                    163:        int     ift_oe;                 /* output errors */
                    164:        int     ift_co;                 /* collisions */
                    165: } iftot[MAXIF];
                    166: 
                    167: /*
                    168:  * Print a running summary of interface statistics.
                    169:  * Repeat display every interval seconds, showing
                    170:  * statistics collected over that interval.  First
                    171:  * line printed at top of screen is always cumulative.
                    172:  */
                    173: sidewaysintpr(interval, off)
                    174:        int interval;
                    175:        off_t off;
                    176: {
                    177:        struct ifnet ifnet;
                    178:        off_t firstifnet;
                    179:        register struct iftot *ip, *total;
                    180:        register int line;
                    181:        struct iftot *lastif, *sum, *interesting;
                    182:        int maxtraffic;
                    183: 
                    184:        klseek(kmem, off, 0);
                    185:        read(kmem, &firstifnet, sizeof (off_t));
                    186:        lastif = iftot;
                    187:        sum = iftot + MAXIF - 1;
                    188:        total = sum - 1;
                    189:        interesting = iftot;
                    190:        for (off = firstifnet, ip = iftot; off;) {
                    191:                char *cp;
                    192: 
                    193:                klseek(kmem, off, 0);
                    194:                read(kmem, &ifnet, sizeof ifnet);
                    195:                klseek(kmem, (int)ifnet.if_name, 0);
                    196:                ip->ift_name[0] = '(';
                    197:                read(kmem, ip->ift_name + 1, 15);
                    198:                if (interface && strcmp(ip->ift_name + 1, interface) == 0 &&
                    199:                    unit == ifnet.if_unit)
                    200:                        interesting = ip;
                    201:                ip->ift_name[15] = '\0';
                    202:                cp = index(ip->ift_name, '\0');
                    203:                sprintf(cp, "%d)", ifnet.if_unit);
                    204:                ip++;
                    205:                if (ip >= iftot + MAXIF - 2)
                    206:                        break;
                    207:                off = (off_t) ifnet.if_next;
                    208:        }
                    209:        lastif = ip;
                    210: banner:
                    211:        printf("    input   %-6.6s    output       ", interesting->ift_name);
                    212:        if (lastif - iftot > 0)
                    213:                printf("   input  (Total)    output       ");
                    214:        for (ip = iftot; ip < iftot + MAXIF; ip++) {
                    215:                ip->ift_ip = 0;
                    216:                ip->ift_ie = 0;
                    217:                ip->ift_op = 0;
                    218:                ip->ift_oe = 0;
                    219:                ip->ift_co = 0;
                    220:        }
                    221:        putchar('\n');
                    222:        printf("%-7.7s %-5.5s %-7.7s %-5.5s %-5.5s ",
                    223:                "packets", "errs", "packets", "errs", "colls");
                    224:        if (lastif - iftot > 0)
                    225:                printf("%-7.7s %-5.5s %-7.7s %-5.5s %-5.5s ",
                    226:                        "packets", "errs", "packets", "errs", "colls");
                    227:        putchar('\n');
                    228:        fflush(stdout);
                    229:        line = 0;
                    230: loop:
                    231:        sum->ift_ip = 0;
                    232:        sum->ift_ie = 0;
                    233:        sum->ift_op = 0;
                    234:        sum->ift_oe = 0;
                    235:        sum->ift_co = 0;
                    236:        for (off = firstifnet, ip = iftot; off && ip < lastif; ip++) {
                    237:                klseek(kmem, off, 0);
                    238:                read(kmem, &ifnet, sizeof ifnet);
                    239:                if (ip == interesting)
                    240:                        printf("%-7d %-5d %-7d %-5d %-5d ",
                    241:                                ifnet.if_ipackets - ip->ift_ip,
                    242:                                ifnet.if_ierrors - ip->ift_ie,
                    243:                                ifnet.if_opackets - ip->ift_op,
                    244:                                ifnet.if_oerrors - ip->ift_oe,
                    245:                                ifnet.if_collisions - ip->ift_co);
                    246:                ip->ift_ip = ifnet.if_ipackets;
                    247:                ip->ift_ie = ifnet.if_ierrors;
                    248:                ip->ift_op = ifnet.if_opackets;
                    249:                ip->ift_oe = ifnet.if_oerrors;
                    250:                ip->ift_co = ifnet.if_collisions;
                    251:                sum->ift_ip += ip->ift_ip;
                    252:                sum->ift_ie += ip->ift_ie;
                    253:                sum->ift_op += ip->ift_op;
                    254:                sum->ift_oe += ip->ift_oe;
                    255:                sum->ift_co += ip->ift_co;
                    256:                off = (off_t) ifnet.if_next;
                    257:        }
                    258:        if (lastif - iftot > 0)
                    259:                printf("%-7d %-5d %-7d %-5d %-5d\n",
                    260:                        sum->ift_ip - total->ift_ip,
                    261:                        sum->ift_ie - total->ift_ie,
                    262:                        sum->ift_op - total->ift_op,
                    263:                        sum->ift_oe - total->ift_oe,
                    264:                        sum->ift_co - total->ift_co);
                    265:        *total = *sum;
                    266:        fflush(stdout);
                    267:        line++;
                    268:        if (interval)
                    269:                sleep(interval);
                    270:        if (line == 21)
                    271:                goto banner;
                    272:        goto loop;
                    273:        /*NOTREACHED*/
                    274: }

unix.superglobalmegacorp.com

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