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

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

unix.superglobalmegacorp.com

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