Annotation of 43BSD/ucb/netstat/main.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: char copyright[] =
                      9: "@(#) Copyright (c) 1983 Regents of the University of California.\n\
                     10:  All rights reserved.\n";
                     11: #endif not lint
                     12: 
                     13: #ifndef lint
                     14: static char sccsid[] = "@(#)main.c     5.7 (Berkeley) 5/22/86";
                     15: #endif not lint
                     16: 
                     17: #include <sys/param.h>
                     18: #include <sys/vmmac.h>
                     19: #include <sys/socket.h>
                     20: #include <machine/pte.h>
                     21: #include <ctype.h>
                     22: #include <errno.h>
                     23: #include <netdb.h>
                     24: #include <nlist.h>
                     25: #include <stdio.h>
                     26: 
                     27: struct nlist nl[] = {
                     28: #define        N_MBSTAT        0
                     29:        { "_mbstat" },
                     30: #define        N_IPSTAT        1
                     31:        { "_ipstat" },
                     32: #define        N_TCB           2
                     33:        { "_tcb" },
                     34: #define        N_TCPSTAT       3
                     35:        { "_tcpstat" },
                     36: #define        N_UDB           4
                     37:        { "_udb" },
                     38: #define        N_UDPSTAT       5
                     39:        { "_udpstat" },
                     40: #define        N_RAWCB         6
                     41:        { "_rawcb" },
                     42: #define        N_SYSMAP        7
                     43:        { "_Sysmap" },
                     44: #define        N_SYSSIZE       8
                     45:        { "_Syssize" },
                     46: #define        N_IFNET         9
                     47:        { "_ifnet" },
                     48: #define        N_HOSTS         10
                     49:        { "_hosts" },
                     50: #define        N_RTHOST        11
                     51:        { "_rthost" },
                     52: #define        N_RTNET         12
                     53:        { "_rtnet" },
                     54: #define        N_ICMPSTAT      13
                     55:        { "_icmpstat" },
                     56: #define        N_RTSTAT        14
                     57:        { "_rtstat" },
                     58: #define        N_NFILE         15
                     59:        { "_nfile" },
                     60: #define        N_FILE          16
                     61:        { "_file" },
                     62: #define        N_UNIXSW        17
                     63:        { "_unixsw" },
                     64: #define N_RTHASHSIZE   18
                     65:        { "_rthashsize" },
                     66: #define N_IDP          19
                     67:        { "_nspcb"},
                     68: #define N_IDPSTAT      20
                     69:        { "_idpstat"},
                     70: #define N_SPPSTAT      21
                     71:        { "_spp_istat"},
                     72: #define N_NSERR                22
                     73:        { "_ns_errstat"},
                     74:        "",
                     75: };
                     76: 
                     77: /* internet protocols */
                     78: extern int protopr();
                     79: extern int tcp_stats(), udp_stats(), ip_stats(), icmp_stats();
                     80: extern int nsprotopr();
                     81: extern int spp_stats(), idp_stats(), nserr_stats();
                     82: 
                     83: struct protox {
                     84:        u_char  pr_index;               /* index into nlist of cb head */
                     85:        u_char  pr_sindex;              /* index into nlist of stat block */
                     86:        u_char  pr_wanted;              /* 1 if wanted, 0 otherwise */
                     87:        int     (*pr_cblocks)();        /* control blocks printing routine */
                     88:        int     (*pr_stats)();          /* statistics printing routine */
                     89:        char    *pr_name;               /* well-known name */
                     90: } protox[] = {
                     91:        { N_TCB,        N_TCPSTAT,      1,      protopr,
                     92:          tcp_stats,    "tcp" },
                     93:        { N_UDB,        N_UDPSTAT,      1,      protopr,
                     94:          udp_stats,    "udp" },
                     95:        { -1,           N_IPSTAT,       1,      0,
                     96:          ip_stats,     "ip" },
                     97:        { -1,           N_ICMPSTAT,     1,      0,
                     98:          icmp_stats,   "icmp" },
                     99:        { -1,           -1,             0,      0,
                    100:          0,            0 }
                    101: };
                    102: 
                    103: struct protox nsprotox[] = {
                    104:        { N_IDP,        N_IDPSTAT,      1,      nsprotopr,
                    105:          idp_stats,    "idp" },
                    106:        { N_IDP,        N_SPPSTAT,      1,      nsprotopr,
                    107:          spp_stats,    "spp" },
                    108:        { -1,           N_NSERR,        1,      0,
                    109:          nserr_stats,  "ns_err" },
                    110:        { -1,           -1,             0,      0,
                    111:          0,            0 }
                    112: };
                    113: 
                    114: struct pte *Sysmap;
                    115: 
                    116: char   *system = "/vmunix";
                    117: char   *kmemf = "/dev/kmem";
                    118: int    kmem;
                    119: int    kflag;
                    120: int    Aflag;
                    121: int    aflag;
                    122: int    hflag;
                    123: int    iflag;
                    124: int    mflag;
                    125: int    nflag;
                    126: int    rflag;
                    127: int    sflag;
                    128: int    tflag;
                    129: int    fflag;
                    130: int    interval;
                    131: char   *interface;
                    132: int    unit;
                    133: char   usage[] = "[ -Aaihmnrst ] [-f address_family] [-I interface] [ interval ] [ system ] [ core ]";
                    134: 
                    135: int    af = AF_UNSPEC;
                    136: 
                    137: main(argc, argv)
                    138:        int argc;
                    139:        char *argv[];
                    140: {
                    141:        int i;
                    142:        char *cp, *name;
                    143:        register struct protoent *p;
                    144:        register struct protox *tp;
                    145: 
                    146:        name = argv[0];
                    147:        argc--, argv++;
                    148:        while (argc > 0 && **argv == '-') {
                    149:                for (cp = &argv[0][1]; *cp; cp++)
                    150:                switch(*cp) {
                    151: 
                    152:                case 'A':
                    153:                        Aflag++;
                    154:                        break;
                    155: 
                    156:                case 'a':
                    157:                        aflag++;
                    158:                        break;
                    159: 
                    160:                case 'h':
                    161:                        hflag++;
                    162:                        break;
                    163: 
                    164:                case 'i':
                    165:                        iflag++;
                    166:                        break;
                    167: 
                    168:                case 'm':
                    169:                        mflag++;
                    170:                        break;
                    171: 
                    172:                case 'n':
                    173:                        nflag++;
                    174:                        break;
                    175: 
                    176:                case 'r':
                    177:                        rflag++;
                    178:                        break;
                    179: 
                    180:                case 's':
                    181:                        sflag++;
                    182:                        break;
                    183: 
                    184:                case 't':
                    185:                        tflag++;
                    186:                        break;
                    187: 
                    188:                case 'u':
                    189:                        af = AF_UNIX;
                    190:                        break;
                    191: 
                    192:                case 'f':
                    193:                        argv++;
                    194:                        argc--;
                    195:                        if (strcmp(*argv, "ns") == 0)
                    196:                                af = AF_NS;
                    197:                        else if (strcmp(*argv, "inet") == 0)
                    198:                                af = AF_INET;
                    199:                        else if (strcmp(*argv, "unix") == 0)
                    200:                                af = AF_UNIX;
                    201:                        else {
                    202:                                fprintf(stderr, "%s: unknown address family\n",
                    203:                                        *argv);
                    204:                                exit(10);
                    205:                        }
                    206:                        break;
                    207:                        
                    208:                case 'I':
                    209:                        iflag++;
                    210:                        if (*(interface = cp + 1) == 0) {
                    211:                                if ((interface = argv[1]) == 0)
                    212:                                        break;
                    213:                                argv++;
                    214:                                argc--;
                    215:                        }
                    216:                        for (cp = interface; isalpha(*cp); cp++)
                    217:                                ;
                    218:                        unit = atoi(cp);
                    219:                        *cp-- = 0;
                    220:                        break;
                    221: 
                    222:                default:
                    223: use:
                    224:                        printf("usage: %s %s\n", name, usage);
                    225:                        exit(1);
                    226:                }
                    227:                argv++, argc--;
                    228:        }
                    229:        if (argc > 0 && isdigit(argv[0][0])) {
                    230:                interval = atoi(argv[0]);
                    231:                if (interval <= 0)
                    232:                        goto use;
                    233:                argv++, argc--;
                    234:                iflag++;
                    235:        }
                    236:        if (argc > 0) {
                    237:                system = *argv;
                    238:                argv++, argc--;
                    239:        }
                    240:        nlist(system, nl);
                    241:        if (nl[0].n_type == 0) {
                    242:                fprintf(stderr, "%s: no namelist\n", system);
                    243:                exit(1);
                    244:        }
                    245:        if (argc > 0) {
                    246:                kmemf = *argv;
                    247:                kflag++;
                    248:        }
                    249:        kmem = open(kmemf, 0);
                    250:        if (kmem < 0) {
                    251:                fprintf(stderr, "cannot open ");
                    252:                perror(kmemf);
                    253:                exit(1);
                    254:        }
                    255:        if (kflag) {
                    256:                off_t off;
                    257: 
                    258:                off = nl[N_SYSMAP].n_value & 0x7fffffff;
                    259:                lseek(kmem, off, 0);
                    260:                nl[N_SYSSIZE].n_value *= 4;
                    261:                Sysmap = (struct pte *)malloc(nl[N_SYSSIZE].n_value);
                    262:                if (Sysmap == 0) {
                    263:                        perror("Sysmap");
                    264:                        exit(1);
                    265:                }
                    266:                read(kmem, Sysmap, nl[N_SYSSIZE].n_value);
                    267:        }
                    268:        if (mflag) {
                    269:                mbpr(nl[N_MBSTAT].n_value);
                    270:                exit(0);
                    271:        }
                    272:        /*
                    273:         * Keep file descriptors open to avoid overhead
                    274:         * of open/close on each call to get* routines.
                    275:         */
                    276:        sethostent(1);
                    277:        setnetent(1);
                    278:        if (iflag) {
                    279:                intpr(interval, nl[N_IFNET].n_value);
                    280:                exit(0);
                    281:        }
                    282:        if (hflag) {
                    283:                hostpr(nl[N_HOSTS].n_value);
                    284:                exit(0);
                    285:        }
                    286:        if (rflag) {
                    287:                if (sflag)
                    288:                        rt_stats(nl[N_RTSTAT].n_value);
                    289:                else
                    290:                        routepr(nl[N_RTHOST].n_value, nl[N_RTNET].n_value,
                    291:                                nl[N_RTHASHSIZE].n_value);
                    292:                exit(0);
                    293:        }
                    294:     if (af == AF_INET || af == AF_UNSPEC) {
                    295:        setprotoent(1);
                    296:        setservent(1);
                    297:        while (p = getprotoent()) {
                    298: 
                    299:                for (tp = protox; tp->pr_name; tp++)
                    300:                        if (strcmp(tp->pr_name, p->p_name) == 0)
                    301:                                break;
                    302:                if (tp->pr_name == 0 || tp->pr_wanted == 0)
                    303:                        continue;
                    304:                if (sflag) {
                    305:                        if (tp->pr_stats)
                    306:                                (*tp->pr_stats)(nl[tp->pr_sindex].n_value,
                    307:                                        p->p_name);
                    308:                } else
                    309:                        if (tp->pr_cblocks)
                    310:                                (*tp->pr_cblocks)(nl[tp->pr_index].n_value,
                    311:                                        p->p_name);
                    312:        }
                    313:        endprotoent();
                    314:     }
                    315:     if (af == AF_NS || af == AF_UNSPEC) {
                    316:        for (tp = nsprotox; tp->pr_name; tp++) {
                    317:                if (sflag) {
                    318:                        if (tp->pr_stats)
                    319:                                (*tp->pr_stats)(nl[tp->pr_sindex].n_value,
                    320:                                        tp->pr_name);
                    321:                } else
                    322:                        if (tp->pr_cblocks)
                    323:                                (*tp->pr_cblocks)(nl[tp->pr_index].n_value,
                    324:                                        tp->pr_name);
                    325:        }
                    326:     }
                    327:     if ((af == AF_UNIX || af == AF_UNSPEC) && !sflag)
                    328:            unixpr(nl[N_NFILE].n_value, nl[N_FILE].n_value,
                    329:                nl[N_UNIXSW].n_value);
                    330:     exit(0);
                    331: }
                    332: 
                    333: /*
                    334:  * Seek into the kernel for a value.
                    335:  */
                    336: klseek(fd, base, off)
                    337:        int fd, base, off;
                    338: {
                    339: 
                    340:        if (kflag) {
                    341:                /* get kernel pte */
                    342: #ifdef vax
                    343:                base &= 0x7fffffff;
                    344: #endif
                    345:                base = ctob(Sysmap[btop(base)].pg_pfnum) + (base & PGOFSET);
                    346:        }
                    347:        lseek(fd, base, off);
                    348: }
                    349: 
                    350: char *
                    351: plural(n)
                    352:        int n;
                    353: {
                    354: 
                    355:        return (n != 1 ? "s" : "");
                    356: }

unix.superglobalmegacorp.com

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