Annotation of 43BSD/etc/implog/implog.c, revision 1.1

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

unix.superglobalmegacorp.com

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