|
|
1.1 root 1: /*
2: * Copyright (c) 1983, 1988 Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted
6: * provided that the above copyright notice and this paragraph are
7: * duplicated in all such forms and that any documentation,
8: * advertising materials, and other materials related to such
9: * distribution and use acknowledge that the software was developed
10: * by the University of California, Berkeley. The name of the
11: * University may not be used to endorse or promote products derived
12: * from this software without specific prior written permission.
13: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15: * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
16: */
17:
18: #ifndef lint
19: char copyright[] =
20: "@(#) Copyright (c) 1983, 1988 Regents of the University of California.\n\
21: All rights reserved.\n";
22: #endif /* not lint */
23:
24: #ifndef lint
25: static char sccsid[] = "@(#)implog.c 5.10 (Berkeley) 6/18/88";
26: #endif /* not lint */
27:
28: #include <stdio.h>
29: #include <signal.h>
30: #include <sgtty.h>
31:
32: #include <sys/time.h>
33: #include <sys/types.h>
34: #include <sys/file.h>
35: #include <sys/stat.h>
36: #include <sys/socket.h>
37:
38: #include <net/if.h>
39:
40: #include <netinet/in.h>
41: #define IMPMESSAGES
42: #define IMPLEADERS
43: #include <netimp/if_imp.h>
44:
45: #define min(a, b) ((a) < (b) ? (a) : (b))
46:
47: u_char buf[1024];
48: int showdata = 1;
49: int showcontents = 0;
50: int rawheader = 0;
51: int follow = 0;
52: int skip = 0;
53: int link = -1;
54: int host = -1;
55: int imp = -1;
56: int packettype = -1;
57: extern int errno;
58: int log;
59: char *logfile = "/usr/adm/implog";
60:
61: /*
62: * Socket address, internet style, with
63: * unused space taken by timestamp and packet
64: * size.
65: */
66: struct sockstamp {
67: short sin_family;
68: u_short sin_port;
69: struct in_addr sin_addr;
70: time_t sin_time;
71: int sin_cc;
72: };
73: struct sockstamp from;
74:
75: main(argc, argv)
76: char *argv[];
77: {
78: struct stat b;
79: off_t size;
80: char *cp;
81: int hostfrom, impfrom;
82:
83: argc--, argv++;
84: while (argc > 0 && argv[0][0] == '-') {
85: if (strcmp(*argv, "-D") == 0) {
86: showdata = 0;
87: argv++, argc--;
88: continue;
89: }
90: if (strcmp(*argv, "-f") == 0) {
91: follow++;
92: argv++, argc--;
93: continue;
94: }
95: if (strcmp(*argv, "-F") == 0) {
96: skip++;
97: follow++;
98: argv++, argc--;
99: continue;
100: }
101: if (strcmp(*argv, "-c") == 0) {
102: showcontents++;
103: argv++, argc--;
104: continue;
105: }
106: if (strcmp(*argv, "-r") == 0) {
107: rawheader++;
108: argv++, argc--;
109: continue;
110: }
111: if (strcmp(*argv, "-l") == 0) {
112: argc--, argv++;
113: if (argc > 0) {
114: link = atoi(*argv);
115: argc--, argv++;
116: } else
117: link = IMPLINK_IP;
118: continue;
119: }
120: if (strcmp(*argv, "-h") == 0) {
121: argc--, argv++;
122: if (argc < 1) {
123: printf("-h: missing host #\n");
124: exit(2);
125: }
126: host = atoi(*argv);
127: argv++, argc--;
128: continue;
129: }
130: if (strcmp(*argv, "-i") == 0) {
131: argc--, argv++;
132: if (argc < 1) {
133: printf("-i: missing imp #\n");
134: exit(2);
135: }
136: imp = atoi(*argv);
137: argv++, argc--;
138: continue;
139: }
140: if (strcmp(*argv, "-t") == 0) {
141: argc--, argv++;;
142: if (argc < 1) {
143: printf("-t: missing packet type\n");
144: exit(2);
145: }
146: packettype = atoi(*argv);
147: argv++, argc--;;
148: continue;
149: }
150: printf("usage: implog [ -D ] [ -c ] [ -f ] [ -F ] [ -r ] [-h #] [-i #] [ -t # ] [-l [#]] [logfile]\n");
151: exit(2);
152: }
153: if (argc > 0)
154: logfile = argv[0];
155: log = open(logfile, 0);
156: if (log < 0) {
157: perror(logfile);
158: exit(1);
159: }
160: fstat(log, &b);
161: size = b.st_size;
162: if (skip)
163: (void) lseek(log, size, L_SET);
164: again:
165: while (read(log, (char *)&from, sizeof(from)) == sizeof(from)) {
166: if (from.sin_family == 0) {
167: printf("restarted: %.24s\n", ctime(&from.sin_time));
168: continue;
169: }
170: if (host >= 0) {
171: long addr = ntohs(from.sin_addr.s_addr);
172:
173: if (IN_CLASSA(addr)) {
174: hostfrom = ((addr>>16) & 0xFF);
175: impfrom = addr & 0xFF;
176: } else if (IN_CLASSB(addr)) {
177: hostfrom = ((addr>>8) & 0xFF);
178: impfrom = addr & 0xFF;
179: } else {
180: hostfrom = ((addr>>4) & 0xF);
181: impfrom = addr & 0xF;
182: }
183: }
184: if (host >= 0 && hostfrom != host) {
185: lseek(log, from.sin_cc, 1);
186: continue;
187: }
188: if (imp >= 0 && impfrom != imp) {
189: lseek(log, from.sin_cc, 1);
190: continue;
191: }
192: process(log, &from);
193: }
194: while (follow) {
195: fflush(stdout);
196: sleep(5);
197: fstat(log, &b);
198: if (b.st_size > size) {
199: size = b.st_size;
200: goto again;
201: }
202: }
203: }
204:
205: int impdata(), impbadleader(), impdown(), impnoop();
206: int imprfnm(), impincomplete(), imphostdead(), imphostunreach();
207: int impbaddata(), impreset(), impretry(), impnotify(), imptrying();
208: int impready(), impundef();
209:
210: struct messages {
211: u_char m_type; /* type of message */
212: int (*m_func)(); /* routine to process message */
213: } mtypes[] = {
214: { IMPTYPE_DATA, impdata },
215: { IMPTYPE_BADLEADER, impbadleader },
216: { IMPTYPE_DOWN, impdown },
217: { IMPTYPE_NOOP, impnoop },
218: { IMPTYPE_RFNM, imprfnm },
219: { IMPTYPE_INCOMPLETE, impincomplete },
220: { IMPTYPE_HOSTDEAD, imphostdead },
221: { IMPTYPE_HOSTUNREACH, imphostunreach },
222: { IMPTYPE_BADDATA, impbaddata },
223: { IMPTYPE_RESET, impreset },
224: { IMPTYPE_RETRY, impretry },
225: { IMPTYPE_NOTIFY, impnotify },
226: { IMPTYPE_TRYING, imptrying },
227: { IMPTYPE_READY, impready },
228: { -1, impundef }
229: };
230:
231: /*
232: * Print a packet.
233: */
234: process(l, f)
235: int l;
236: struct sockstamp *f;
237: {
238: register struct messages *mp;
239: struct imp_leader *ip;
240: int (*fn)();
241:
242: if (read(l, (char *)buf, f->sin_cc) != f->sin_cc) {
243: perror("read");
244: return;
245: }
246: ip = (struct imp_leader *)buf;
247: ip->il_imp = ntohs(ip->il_imp);
248: if (ip->il_format != IMP_NFF)
249: fn = impundef;
250: else {
251: for (mp = mtypes; mp->m_type != (u_char)-1; mp++)
252: if (mp->m_type == ip->il_mtype)
253: break;
254: fn = mp->m_func;
255: }
256: if (ip->il_mtype == IMPTYPE_DATA) {
257: if (link >= 0 && ip->il_link != link)
258: return;
259: if (!showdata)
260: return;
261: }
262: if (packettype >= 0 && ip->il_mtype != packettype)
263: return;
264: printf("%.24s: ", ctime(&f->sin_time));
265: if (f->sin_cc < sizeof(struct control_leader))
266: printf("(truncated header, %d bytes): ", f->sin_cc);
267: (*fn)(ip, f->sin_cc);
268: if (rawheader && fn != impundef) {
269: putchar('\t');
270: impundef(ip, f->sin_cc);
271: }
272: }
273:
274: impdata(ip, cc)
275: register struct imp_leader *ip;
276: {
277: printf("<DATA, source=%d/%d, link=", ip->il_host, (u_short)ip->il_imp);
278: if (ip->il_link == IMPLINK_IP)
279: printf("ip,");
280: else
281: printf("%d,", ip->il_link);
282: printf(" len=%d bytes>\n", ntohs((u_short)ip->il_length) >> 3);
283: if (showcontents) {
284: register u_char *cp = ((u_char *)ip) + sizeof(*ip);
285: register int i;
286:
287: i = (ntohs(ip->il_length) >> 3) - sizeof(struct imp_leader);
288: cc = min(i, cc);
289: printf("data: (%d bytes)", cc);
290: for (i = 0; i < cc; i++, cp++) {
291: if (i % 25 == 0)
292: printf("\n");
293: printf("%02x ", *cp);
294: }
295: putchar('\n');
296: }
297: }
298:
299: char *badleader[] = {
300: "error flip-flop set",
301: "message < 80 bits",
302: "illegal type field",
303: "opposite leader type"
304: };
305:
306: impbadleader(ip)
307: register struct imp_leader *ip;
308: {
309: printf("bad leader: ");
310: if (ip->il_subtype > IMPLEADER_OPPOSITE)
311: printf("%x\n", ip->il_subtype);
312: else
313: printf("%s\n", badleader[ip->il_subtype]);
314: }
315:
316: impdown(ip)
317: register struct imp_leader *ip;
318: {
319: int tdown, tbackup;
320:
321: printf("imp going down %s", impmessage[ip->il_link & IMP_DMASK]);
322: tdown = ((ip->il_link >> IMPDOWN_WHENSHIFT) & IMPDOWN_WHENMASK) *
323: IMPDOWN_WHENUNIT;
324: if ((ip->il_link & IMP_DMASK) != IMPDOWN_GOING)
325: printf(" in %d minutes", tdown);
326: tbackup = ip->il_subtype * IMPDOWN_WHENUNIT;
327: printf(": back up ");
328: if (tbackup)
329: printf("%d minutes\n", tbackup);
330: else
331: printf("immediately\n");
332: }
333:
334: impnoop(ip)
335: register struct imp_leader *ip;
336: {
337: printf("noop: host %d, imp %d\n", ip->il_host,
338: (u_short)ip->il_imp);
339: }
340:
341: imprfnm(ip)
342: register struct imp_leader *ip;
343: {
344: printf("rfnm: htype=%x, source=%d/%d, link=",
345: ip->il_htype, ip->il_host, ip->il_imp);
346: if (ip->il_link == IMPLINK_IP)
347: printf("ip,");
348: else
349: printf("%d,", ip->il_link);
350: printf(" subtype=%x\n", ip->il_subtype);
351: }
352:
353: char *hostdead[] = {
354: "#0",
355: "ready-line negated",
356: "tardy receiving messages",
357: "ncc doesn't know host",
358: "imp software won't allow messages",
359: "host down for scheduled pm",
360: "host down for hardware work",
361: "host down for software work",
362: "host down for emergency restart",
363: "host down because of power outage",
364: "host stopped at a breakpoint",
365: "host down due to hardware failure",
366: "host not scheduled to be up",
367: "#13",
368: "#14",
369: "host in the process of coming up"
370: };
371:
372: imphostdead(ip)
373: register struct imp_leader *ip;
374: {
375: printf("host %d/%d dead: ", ip->il_host, ip->il_imp);
376: if (ip->il_link & IMP_DMASK)
377: printf("down %s, ", impmessage[ip->il_link & IMP_DMASK]);
378: if (ip->il_subtype <= IMPHOST_COMINGUP)
379: printf("%s\n", hostdead[ip->il_subtype]);
380: else
381: printf("subtype=%x\n", ip->il_subtype);
382: }
383:
384: char *hostunreach[] = {
385: "destination imp can't be reached",
386: "destination host isn't up",
387: "host doesn't support long leader",
388: "communication is prohibited"
389: };
390:
391: imphostunreach(ip)
392: register struct imp_leader *ip;
393: {
394: printf("host %d/%d unreachable: ", ip->il_host, ip->il_imp);
395: if (ip->il_subtype <= IMPREACH_PROHIBITED)
396: printf("%s\n", hostunreach[ip->il_subtype]);
397: else
398: printf("subtype=%x\n", ip->il_subtype);
399: }
400:
401: impbaddata(ip)
402: register struct imp_leader *ip;
403: {
404: printf("error in data: htype=%x, source=%d/%d, link=",
405: ip->il_htype, ip->il_host, ip->il_imp);
406: if (ip->il_link == IMPLINK_IP)
407: printf("ip, ");
408: else
409: printf("%d, ", ip->il_link);
410: printf("subtype=%x\n", ip->il_subtype);
411: }
412:
413: char *incomplete[] = {
414: "host didn't take data fast enough",
415: "message was too long",
416: "message transmission time > 15 seconds",
417: "imp/circuit failure",
418: "no resources within 15 seconds",
419: "source imp i/o failure during receipt"
420: };
421:
422: impincomplete(ip)
423: register struct imp_leader *ip;
424: {
425: printf("incomplete: htype=%x, source=%d/%d, link=",
426: ip->il_htype, ip->il_host, ip->il_imp);
427: if (ip->il_link == IMPLINK_IP)
428: printf("ip,");
429: else
430: printf("%d,", ip->il_link);
431: if (ip->il_subtype <= IMPCOMPLETE_IMPIO)
432: printf(" %s\n", incomplete[ip->il_subtype]);
433: else
434: printf(" subtype=%x\n", ip->il_subtype);
435: }
436:
437: impreset(ip)
438: register struct imp_leader *ip;
439: {
440: printf("reset complete\n");
441: }
442:
443: char *retry[] = {
444: "imp buffer wasn't available",
445: "connection block unavailable"
446: };
447:
448: impretry(ip)
449: register struct imp_leader *ip;
450: {
451: printf("refused, try again: ");
452: if (ip->il_subtype <= IMPRETRY_BLOCK)
453: printf("%s\n", retry[ip->il_subtype]);
454: else
455: printf("subtype=%x\n", ip->il_subtype);
456: }
457:
458: char *notify[] = {
459: "#0",
460: "#1",
461: "connection not available",
462: "reassembly space not available at destination",
463: "message number not available",
464: "transaction block for message not available"
465: };
466:
467: impnotify(ip)
468: register struct imp_leader *ip;
469: {
470: printf("refused, will notify: ");
471: if (ip->il_subtype <= 5)
472: printf("%s\n", notify[ip->il_subtype]);
473: else
474: printf("subtype=%x\n", ip->il_subtype);
475: }
476:
477: imptrying(ip)
478: register struct imp_leader *ip;
479: {
480: printf("refused, still trying\n");
481: }
482:
483: impready(ip)
484: register struct imp_leader *ip;
485: {
486: printf("ready\n");
487: }
488:
489: impundef(ip, len)
490: register struct imp_leader *ip;
491: {
492: printf("<fmt=%x, net=%x, flags=%x, mtype=", ip->il_format,
493: ip->il_network, ip->il_flags);
494: printf("%x, htype=%x,\n\t host=%d(x%x), imp=%d(x%x), link=",
495: ip->il_mtype, ip->il_htype, ip->il_host, ip->il_host,
496: ip->il_imp, ip->il_imp);
497: if (ip->il_link == IMPLINK_IP)
498: printf("ip,");
499: else
500: printf("%d (x%x),", ip->il_link, ip->il_link);
501: printf(" subtype=%x", ip->il_subtype);
502: if (len >= sizeof(struct imp_leader) && ip->il_length)
503: printf(" len=%d bytes", ntohs((u_short)ip->il_length) >> 3);
504: printf(">\n");
505: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.