|
|
1.1 root 1: #ifndef lint
2: static char sccsid[] = "@(#)main.c 4.9 83/05/30";
3: #endif
4:
5: #include <sys/param.h>
6: #include <sys/vmmac.h>
7: #include <machine/pte.h>
8: #include <ctype.h>
9: #include <errno.h>
10: #include <netdb.h>
11: #include <nlist.h>
12: #include <stdio.h>
13:
14: struct nlist nl[] = {
15: #define N_MBSTAT 0
16: { "_mbstat" },
17: #define N_IPSTAT 1
18: { "_ipstat" },
19: #define N_TCB 2
20: { "_tcb" },
21: #define N_TCPSTAT 3
22: { "_tcpstat" },
23: #define N_UDB 4
24: { "_udb" },
25: #define N_UDPSTAT 5
26: { "_udpstat" },
27: #define N_RAWCB 6
28: { "_rawcb" },
29: #define N_SYSMAP 7
30: { "_Sysmap" },
31: #define N_SYSSIZE 8
32: { "_Syssize" },
33: #define N_IFNET 9
34: { "_ifnet" },
35: #define N_HOSTS 10
36: { "_hosts" },
37: #define N_RTHOST 11
38: { "_rthost" },
39: #define N_RTNET 12
40: { "_rtnet" },
41: #define N_ICMPSTAT 13
42: { "_icmpstat" },
43: #define N_RTSTAT 14
44: { "_rtstat" },
45: "",
46: };
47:
48: extern int protopr();
49: extern int tcp_stats(), udp_stats(), ip_stats(), icmp_stats();
50:
51: struct protox {
52: u_char pr_index; /* index into nlist of cb head */
53: u_char pr_sindex; /* index into nlist of stat block */
54: u_char pr_wanted; /* 1 if wanted, 0 otherwise */
55: int (*pr_cblocks)(); /* control blocks printing routine */
56: int (*pr_stats)(); /* statistics printing routine */
57: char *pr_name; /* well-known name */
58: } protox[] = {
59: { N_TCB, N_TCPSTAT, 1, protopr,
60: tcp_stats, "tcp" },
61: { N_UDB, N_UDPSTAT, 1, protopr,
62: udp_stats, "udp" },
63: { -1, N_IPSTAT, 1, 0,
64: ip_stats, "ip" },
65: { -1, N_ICMPSTAT, 1, 0,
66: icmp_stats, "icmp" },
67: { -1, -1, 0, 0,
68: 0, 0 }
69: };
70:
71: struct pte *Sysmap;
72:
73: char *system = "/vmunix";
74: char *kmemf = "/dev/kmem";
75: int kmem;
76: int kflag;
77: int Aflag;
78: int aflag;
79: int hflag;
80: int iflag;
81: int mflag;
82: int nflag;
83: int rflag;
84: int sflag;
85: int tflag;
86: int interval;
87: char usage[] = "[ -Aaihmnrst ] [ interval ] [ system ] [ core ]";
88:
89: main(argc, argv)
90: int argc;
91: char *argv[];
92: {
93: int i;
94: char *cp, *name;
95: register struct protoent *p;
96:
97: name = argv[0];
98: argc--, argv++;
99: while (argc > 0 && **argv == '-') {
100: for (cp = &argv[0][1]; *cp; cp++)
101: switch(argv[0][1]) {
102:
103: case 'A':
104: Aflag++;
105: break;
106:
107: case 'a':
108: aflag++;
109: break;
110:
111: case 'h':
112: hflag++;
113: break;
114:
115: case 'i':
116: iflag++;
117: break;
118:
119: case 'm':
120: mflag++;
121: break;
122:
123: case 'n':
124: nflag++;
125: break;
126:
127: case 'r':
128: rflag++;
129: break;
130:
131: case 's':
132: sflag++;
133: break;
134:
135: case 't':
136: tflag++;
137: break;
138:
139: default:
140: use:
141: printf("usage: %s %s\n", name, usage);
142: exit(1);
143: }
144: argv++, argc--;
145: }
146: if (argc > 0 && isdigit(argv[0][0])) {
147: interval = atoi(argv[0]);
148: if (interval <= 0)
149: goto use;
150: argv++, argc--;
151: iflag++;
152: }
153: if (argc > 0) {
154: system = *argv;
155: argv++, argc--;
156: }
157: nlist(system, nl);
158: if (nl[0].n_type == 0) {
159: fprintf(stderr, "%s: no namelist\n", system);
160: exit(1);
161: }
162: if (argc > 0) {
163: kmemf = *argv;
164: kflag++;
165: }
166: kmem = open(kmemf, 0);
167: if (kmem < 0) {
168: fprintf(stderr, "cannot open ");
169: perror(kmemf);
170: exit(1);
171: }
172: if (kflag) {
173: off_t off;
174:
175: off = nl[N_SYSMAP].n_value & 0x7fffffff;
176: lseek(kmem, off, 0);
177: nl[N_SYSSIZE].n_value *= 4;
178: Sysmap = (struct pte *)malloc(nl[N_SYSSIZE].n_value);
179: if (Sysmap == 0) {
180: perror("Sysmap");
181: exit(1);
182: }
183: read(kmem, Sysmap, nl[N_SYSSIZE].n_value);
184: }
185: if (mflag) {
186: mbpr(nl[N_MBSTAT].n_value);
187: exit(0);
188: }
189: /*
190: * Keep file descriptors open to avoid overhead
191: * of open/close on each call to get* routines.
192: */
193: sethostent(1);
194: setnetent(1);
195: if (iflag) {
196: intpr(interval, nl[N_IFNET].n_value);
197: exit(0);
198: }
199: if (hflag) {
200: hostpr(nl[N_HOSTS].n_value);
201: exit(0);
202: }
203: if (rflag) {
204: if (sflag)
205: rt_stats(nl[N_RTSTAT].n_value);
206: else
207: routepr(nl[N_RTHOST].n_value, nl[N_RTNET].n_value);
208: exit(0);
209: }
210: setprotoent(1);
211: setservent(1);
212: while (p = getprotoent()) {
213: register struct protox *tp;
214:
215: for (tp = protox; tp->pr_name; tp++)
216: if (strcmp(tp->pr_name, p->p_name) == 0)
217: break;
218: if (tp->pr_name == 0 || tp->pr_wanted == 0)
219: continue;
220: if (sflag && tp->pr_stats) {
221: (*tp->pr_stats)(nl[tp->pr_sindex].n_value, p->p_name);
222: continue;
223: }
224: if (tp->pr_cblocks)
225: (*tp->pr_cblocks)(nl[tp->pr_index].n_value, p->p_name);
226: }
227: endprotoent();
228: }
229:
230: /*
231: * Seek into the kernel for a value.
232: */
233: klseek(fd, base, off)
234: int fd, base, off;
235: {
236:
237: if (kflag) {
238: /* get kernel pte */
239: #ifdef vax
240: base &= 0x7fffffff;
241: #endif
242: base = ctob(Sysmap[btop(base)].pg_pfnum) + (base & PGOFSET);
243: }
244: lseek(fd, base, off);
245: }
246:
247: char *
248: plural(n)
249: int n;
250: {
251:
252: return (n != 1 ? "s" : "");
253: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.