Annotation of 43BSDTahoe/etc/implog/implog.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

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