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