|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.