Annotation of 43BSDTahoe/etc/implog/implog.c, revision 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.