Annotation of 43BSDReno/usr.sbin/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 provided
        !             6:  * that: (1) source distributions retain this entire copyright notice and
        !             7:  * comment, and (2) distributions including binaries display the following
        !             8:  * acknowledgement:  ``This product includes software developed by the
        !             9:  * University of California, Berkeley and its contributors'' in the
        !            10:  * documentation or other materials provided with the distribution and in
        !            11:  * all advertising materials mentioning features or use of this software.
        !            12:  * Neither the name of the University nor the names of its contributors may
        !            13:  * be used to endorse or promote products derived from this software without
        !            14:  * specific prior written permission.
        !            15:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
        !            16:  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
        !            17:  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
        !            18:  */
        !            19: 
        !            20: #ifndef lint
        !            21: char copyright[] =
        !            22: "@(#) Copyright (c) 1983, 1988 Regents of the University of California.\n\
        !            23:  All rights reserved.\n";
        !            24: #endif /* not lint */
        !            25: 
        !            26: #ifndef lint
        !            27: static char sccsid[] = "@(#)implog.c   5.13 (Berkeley) 6/1/90";
        !            28: #endif /* not lint */
        !            29: 
        !            30: #include <sys/param.h>
        !            31: #include <sys/time.h>
        !            32: #include <sys/signal.h>
        !            33: #include <sys/file.h>
        !            34: #include <sys/stat.h>
        !            35: #include <sys/socket.h>
        !            36: 
        !            37: #include <net/if.h>
        !            38: 
        !            39: #include <netinet/in.h>
        !            40: #define        IMPMESSAGES
        !            41: #define        IMPLEADERS
        !            42: #include <netimp/if_imp.h>
        !            43: 
        !            44: #include <sgtty.h>
        !            45: #include <stdio.h>
        !            46: #include "pathnames.h"
        !            47: 
        !            48: u_char buf[1024];
        !            49: int    showdata = 1;
        !            50: int    showcontents = 0;
        !            51: int    rawheader = 0;
        !            52: int    follow = 0;
        !            53: int    skip = 0;
        !            54: int    link = -1;
        !            55: int    host = -1;
        !            56: int    imp = -1;
        !            57: int    packettype = -1;
        !            58: extern int errno;
        !            59: int    log;
        !            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:        int argc;
        !            77:        char **argv;
        !            78: {
        !            79:        extern int errno, optind;
        !            80:        extern char *optarg;
        !            81:        struct stat b;
        !            82:        off_t size, lseek();
        !            83:        char *logfile, *strerror();
        !            84:        int ch;
        !            85:        long hostfrom, impfrom;
        !            86: 
        !            87:        while ((ch = getopt(argc, argv, "DFLcfh:i:l:rt:")) != EOF)
        !            88:                switch(ch) {
        !            89:                case 'D':
        !            90:                        showdata = 0;
        !            91:                        break;
        !            92:                case 'F':
        !            93:                        skip++;
        !            94:                        /* FALLTHROUGH */
        !            95:                case 'f':
        !            96:                        follow++;
        !            97:                        break;
        !            98:                case 'L':
        !            99:                        link = IMPLINK_IP;
        !           100:                        break;
        !           101:                case 'c':
        !           102:                        showcontents++;
        !           103:                        break;
        !           104:                case 'h':
        !           105:                        host = atoi(optarg);
        !           106:                        break;
        !           107:                case 'i':
        !           108:                        imp = atoi(optarg);
        !           109:                        break;
        !           110:                case 'l':
        !           111:                        link = atoi(optarg);
        !           112:                        break;
        !           113:                case 'r':
        !           114:                        rawheader++;
        !           115:                        break;
        !           116:                case 't':
        !           117:                        packettype = atoi(optarg);
        !           118:                        break;
        !           119:                case '?':
        !           120:                default:
        !           121:                        fprintf(stderr,
        !           122: "usage: implog [-DFLcfr] [-h host] [-i imp] [-l link] [-t type] [logfile]\n");
        !           123:                        exit(2);
        !           124:                }
        !           125:        argc -= optind;
        !           126:        argv += optind;
        !           127: 
        !           128:        logfile = argc ? *argv : _PATH_IMPLOG;
        !           129:        log = open(logfile, O_RDONLY, 0);
        !           130:        if (log < 0 || fstat(log, &b)) {
        !           131:                fprintf(stderr, "implog: %s: %s\n", logfile, strerror(errno));
        !           132:                exit(1);
        !           133:        }
        !           134:        size = b.st_size;
        !           135:        if (skip)
        !           136:                (void)lseek(log, size, L_SET);
        !           137: again:
        !           138:        while (read(log, (char *)&from, sizeof(from)) == sizeof(from)) {
        !           139:                if (from.sin_family == 0) {
        !           140:                        printf("restarted: %.24s\n", ctime(&from.sin_time));
        !           141:                        continue;
        !           142:                }
        !           143:                if (host >= 0 || imp >= 0) {
        !           144:                        long addr = ntohl(from.sin_addr.s_addr);
        !           145: 
        !           146:                        if (IN_CLASSA(addr)) {
        !           147:                                hostfrom = ((addr>>16) & 0xFF);
        !           148:                                impfrom = addr & 0xFF;
        !           149:                        } else if (IN_CLASSB(addr)) {
        !           150:                                hostfrom = ((addr>>8) & 0xFF);
        !           151:                                impfrom = addr & 0xFF;
        !           152:                        } else {
        !           153:                                hostfrom = ((addr>>4) & 0xF);
        !           154:                                impfrom = addr & 0xF;
        !           155:                        }
        !           156:                }
        !           157:                if (host >= 0 && hostfrom != host) {
        !           158:                        (void)lseek(log, (long)from.sin_cc, L_INCR);
        !           159:                        continue;
        !           160:                }
        !           161:                if (imp >= 0 && impfrom != imp) {
        !           162:                        (void)lseek(log, (long)from.sin_cc, L_INCR);
        !           163:                        continue;
        !           164:                }
        !           165:                process(log, &from);
        !           166:        }
        !           167:        while (follow) {
        !           168:                (void)fflush(stdout);
        !           169:                (void)sleep(5);
        !           170:                (void)fstat(log, &b);
        !           171:                if (b.st_size > size) {
        !           172:                        size = b.st_size;
        !           173:                        goto again;
        !           174:                }
        !           175:        }
        !           176: }
        !           177: 
        !           178: int    impdata(), impbadleader(), impdown(), impnoop();
        !           179: int    imprfnm(), impincomplete(), imphostdead(), imphostunreach();
        !           180: int    impbaddata(), impreset(), impretry(), impnotify(), imptrying();
        !           181: int    impready(), impundef();
        !           182: 
        !           183: struct messages {
        !           184:        u_char  m_type;         /* type of message */
        !           185:        int     (*m_func)();    /* routine to process message */
        !           186: } mtypes[] = {
        !           187:        { IMPTYPE_DATA,         impdata },
        !           188:        { IMPTYPE_BADLEADER,    impbadleader },
        !           189:        { IMPTYPE_DOWN,         impdown },
        !           190:        { IMPTYPE_NOOP,         impnoop },
        !           191:        { IMPTYPE_RFNM,         imprfnm },
        !           192:        { IMPTYPE_INCOMPLETE,   impincomplete },
        !           193:        { IMPTYPE_HOSTDEAD,     imphostdead },
        !           194:        { IMPTYPE_HOSTUNREACH,  imphostunreach },
        !           195:        { IMPTYPE_BADDATA,      impbaddata },
        !           196:        { IMPTYPE_RESET,        impreset },
        !           197:        { IMPTYPE_RETRY,        impretry },
        !           198:        { IMPTYPE_NOTIFY,       impnotify },
        !           199:        { IMPTYPE_TRYING,       imptrying },
        !           200:        { IMPTYPE_READY,        impready },
        !           201:        { -1,                   impundef }
        !           202: };
        !           203: 
        !           204: /*
        !           205:  * Print a packet.
        !           206:  */
        !           207: process(l, f)
        !           208:        int l;
        !           209:        struct sockstamp *f;
        !           210: {
        !           211:        register struct messages *mp;
        !           212:        struct imp_leader *ip;
        !           213:        int (*fn)();
        !           214: 
        !           215:        if (read(l, (char *)buf, f->sin_cc) != f->sin_cc) {
        !           216:                perror("implog: read");
        !           217:                return;
        !           218:        }
        !           219:        ip = (struct imp_leader *)buf;
        !           220:        ip->il_imp = ntohs(ip->il_imp);
        !           221:        if (ip->il_format != IMP_NFF)
        !           222:                fn = impundef;
        !           223:        else {
        !           224:                for (mp = mtypes; mp->m_type != (u_char)-1; mp++)
        !           225:                        if (mp->m_type == ip->il_mtype)
        !           226:                                break;
        !           227:                fn = mp->m_func;
        !           228:        }
        !           229:        if (ip->il_mtype == IMPTYPE_DATA) {
        !           230:                if (link >= 0 && ip->il_link != link)
        !           231:                        return;
        !           232:                if (!showdata)
        !           233:                        return;
        !           234:        }
        !           235:        if (packettype >= 0 && ip->il_mtype != packettype)
        !           236:                return;
        !           237:        printf("%.24s: ", ctime(&f->sin_time));
        !           238:        if (f->sin_cc < sizeof(struct control_leader))
        !           239:                printf("(truncated header, %d bytes): ", f->sin_cc);
        !           240:        (*fn)(ip, f->sin_cc);
        !           241:        if (rawheader && fn != impundef) {
        !           242:                putchar('\t');
        !           243:                impundef(ip, f->sin_cc);
        !           244:        }
        !           245: }
        !           246: 
        !           247: impdata(ip, cc)
        !           248:        register struct imp_leader *ip;
        !           249:        int cc;
        !           250: {
        !           251:        printf("<DATA, source=%d/%u, link=", ip->il_host, (u_short)ip->il_imp);
        !           252:        if (ip->il_link == IMPLINK_IP)
        !           253:                printf("ip,");
        !           254:        else
        !           255:                printf("%d,", ip->il_link);
        !           256:        printf(" len=%u bytes>\n", ntohs((u_short)ip->il_length) >> 3);
        !           257:        if (showcontents) {
        !           258:                register u_char *cp = ((u_char *)ip) + sizeof(*ip);
        !           259:                register int i;
        !           260: 
        !           261:                i = (ntohs(ip->il_length) >> 3) - sizeof(struct imp_leader);
        !           262:                cc = MIN(i, cc);
        !           263:                printf("data: (%d bytes)", cc);
        !           264:                for (i = 0; i < cc; i++, cp++) {
        !           265:                        if (i % 25 == 0)
        !           266:                                printf("\n");
        !           267:                        printf("%02x ", *cp);
        !           268:                }
        !           269:                putchar('\n');
        !           270:        }
        !           271: }
        !           272: 
        !           273: char *badleader[] = {
        !           274:        "error flip-flop set",
        !           275:        "message < 80 bits",
        !           276:        "illegal type field",
        !           277:        "opposite leader type"
        !           278: };
        !           279: 
        !           280: /* ARGSUSED */
        !           281: impbadleader(ip, cc)
        !           282:        register struct imp_leader *ip;
        !           283:        int cc;
        !           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: /* ARGSUSED */
        !           293: impdown(ip, cc)
        !           294:        register struct imp_leader *ip;
        !           295:        int cc;
        !           296: {
        !           297:        int tdown, tbackup;
        !           298: 
        !           299:        printf("imp going down %s", impmessage[ip->il_link & IMP_DMASK]);
        !           300:        tdown = ((ip->il_link >> IMPDOWN_WHENSHIFT) & IMPDOWN_WHENMASK) *
        !           301:            IMPDOWN_WHENUNIT;
        !           302:        if ((ip->il_link & IMP_DMASK) != IMPDOWN_GOING)
        !           303:                printf(" in %d minutes", tdown);
        !           304:        tbackup = ip->il_subtype * IMPDOWN_WHENUNIT;
        !           305:        printf(": back up ");
        !           306:        if (tbackup)
        !           307:                printf("%d minutes\n", tbackup);
        !           308:        else
        !           309:                printf("immediately\n");
        !           310: }
        !           311: 
        !           312: /* ARGSUSED */
        !           313: impnoop(ip, cc)
        !           314:        register struct imp_leader *ip;
        !           315:        int cc;
        !           316: {
        !           317:        printf("noop: host %d, imp %u\n", ip->il_host, ip->il_imp);
        !           318: }
        !           319: 
        !           320: /* ARGSUSED */
        !           321: imprfnm(ip, cc)
        !           322:        register struct imp_leader *ip;
        !           323:        int cc;
        !           324: {
        !           325:        printf("rfnm: htype=%x, source=%d/%u, link=",
        !           326:                ip->il_htype, ip->il_host, ip->il_imp);
        !           327:        if (ip->il_link == IMPLINK_IP)
        !           328:                printf("ip,");
        !           329:        else
        !           330:                printf("%d,", ip->il_link);
        !           331:        printf(" subtype=%x\n", ip->il_subtype);
        !           332: }
        !           333: 
        !           334: char *hostdead[] = {
        !           335:        "#0",
        !           336:        "ready-line negated",
        !           337:        "tardy receiving messages",
        !           338:        "ncc doesn't know host",
        !           339:        "imp software won't allow messages",
        !           340:        "host down for scheduled pm",
        !           341:        "host down for hardware work",
        !           342:        "host down for software work",
        !           343:        "host down for emergency restart",
        !           344:        "host down because of power outage",
        !           345:        "host stopped at a breakpoint",
        !           346:        "host down due to hardware failure",
        !           347:        "host not scheduled to be up",
        !           348:        "#13",
        !           349:        "#14",
        !           350:        "host in the process of coming up"
        !           351: };
        !           352: 
        !           353: /* ARGSUSED */
        !           354: imphostdead(ip, cc)
        !           355:        register struct imp_leader *ip;
        !           356:        int cc;
        !           357: {
        !           358:        printf("host %u/%u dead: ", ip->il_host, ip->il_imp);
        !           359:        if (ip->il_link & IMP_DMASK)
        !           360:                printf("down %s, ", impmessage[ip->il_link & IMP_DMASK]);
        !           361:        if (ip->il_subtype <= IMPHOST_COMINGUP)
        !           362:                printf("%s\n", hostdead[ip->il_subtype]);
        !           363:        else
        !           364:                printf("subtype=%x\n", ip->il_subtype);
        !           365: }
        !           366: 
        !           367: char *hostunreach[] = {
        !           368:        "destination imp can't be reached",
        !           369:        "destination host isn't up",
        !           370:        "host doesn't support long leader",
        !           371:        "communication is prohibited"
        !           372: };
        !           373: 
        !           374: /* ARGSUSED */
        !           375: imphostunreach(ip, cc)
        !           376:        register struct imp_leader *ip;
        !           377:        int cc;
        !           378: {
        !           379:        printf("host %u/%u unreachable: ", ip->il_host, ip->il_imp);
        !           380:        if (ip->il_subtype <= IMPREACH_PROHIBITED)
        !           381:                printf("%s\n", hostunreach[ip->il_subtype]);
        !           382:        else
        !           383:                printf("subtype=%x\n", ip->il_subtype);
        !           384: }
        !           385: 
        !           386: /* ARGSUSED */
        !           387: impbaddata(ip, cc)
        !           388:        register struct imp_leader *ip;
        !           389:        int cc;
        !           390: {
        !           391:        printf("error in data: htype=%x, source=%u/%u, link=",
        !           392:                ip->il_htype, ip->il_host, ip->il_imp);
        !           393:        if (ip->il_link == IMPLINK_IP)
        !           394:                printf("ip, ");
        !           395:        else
        !           396:                printf("%d, ", ip->il_link);
        !           397:        printf("subtype=%x\n", ip->il_subtype);
        !           398: }
        !           399: 
        !           400: char *incomplete[] = {
        !           401:        "host didn't take data fast enough",
        !           402:        "message was too long",
        !           403:        "message transmission time > 15 seconds",
        !           404:        "imp/circuit failure",
        !           405:        "no resources within 15 seconds",
        !           406:        "source imp i/o failure during receipt"
        !           407: };
        !           408: 
        !           409: /* ARGSUSED */
        !           410: impincomplete(ip, cc)
        !           411:        register struct imp_leader *ip;
        !           412:        int cc;
        !           413: {
        !           414:        printf("incomplete: htype=%x, source=%u/%u, link=",
        !           415:                ip->il_htype, ip->il_host, ip->il_imp);
        !           416:        if (ip->il_link == IMPLINK_IP)
        !           417:                printf("ip,");
        !           418:        else
        !           419:                printf("%d,", ip->il_link);
        !           420:        if (ip->il_subtype <= IMPCOMPLETE_IMPIO)
        !           421:                printf(" %s\n", incomplete[ip->il_subtype]);
        !           422:        else
        !           423:                printf(" subtype=%x\n", ip->il_subtype);
        !           424: }
        !           425: 
        !           426: /* ARGSUSED */
        !           427: impreset(ip, cc)
        !           428:        struct imp_leader *ip;
        !           429:        int cc;
        !           430: {
        !           431:        printf("reset complete\n");
        !           432: }
        !           433: 
        !           434: char *retry[] = {
        !           435:        "imp buffer wasn't available",
        !           436:        "connection block unavailable"
        !           437: };
        !           438: 
        !           439: /* ARGSUSED */
        !           440: impretry(ip, cc)
        !           441:        register struct imp_leader *ip;
        !           442:        int cc;
        !           443: {
        !           444:        printf("refused, try again: ");
        !           445:        if (ip->il_subtype <= IMPRETRY_BLOCK)
        !           446:                printf("%s\n", retry[ip->il_subtype]);
        !           447:        else
        !           448:                printf("subtype=%x\n", ip->il_subtype);
        !           449: }
        !           450: 
        !           451: char *notify[] = {
        !           452:        "#0",
        !           453:        "#1",
        !           454:        "connection not available",
        !           455:        "reassembly space not available at destination",
        !           456:        "message number not available",
        !           457:        "transaction block for message not available"
        !           458: };
        !           459: 
        !           460: /* ARGSUSED */
        !           461: impnotify(ip, cc)
        !           462:        register struct imp_leader *ip;
        !           463:        int cc;
        !           464: {
        !           465:        printf("refused, will notify: ");
        !           466:        if (ip->il_subtype <= 5)
        !           467:                printf("%s\n", notify[ip->il_subtype]);
        !           468:        else
        !           469:                printf("subtype=%x\n", ip->il_subtype);
        !           470: }
        !           471: 
        !           472: /* ARGSUSED */
        !           473: imptrying(ip, cc)
        !           474:        struct imp_leader *ip;
        !           475:        int cc;
        !           476: {
        !           477:        printf("refused, still trying\n");
        !           478: }
        !           479: 
        !           480: /* ARGSUSED */
        !           481: impready(ip, cc)
        !           482:        struct imp_leader *ip;
        !           483:        int cc;
        !           484: {
        !           485:        printf("ready\n");
        !           486: }
        !           487: 
        !           488: /* ARGSUSED */
        !           489: impundef(ip, cc)
        !           490:        register struct imp_leader *ip;
        !           491:        int cc;
        !           492: {
        !           493:        printf("<fmt=%x, net=%x, flags=%x, mtype=", ip->il_format,
        !           494:                ip->il_network, ip->il_flags);
        !           495:        printf("%x, htype=%x,\n\t host=%d(x%x), imp=%u(x%x), link=",
        !           496:                ip->il_mtype, ip->il_htype, ip->il_host, ip->il_host,
        !           497:                ip->il_imp, ip->il_imp);
        !           498:        if (ip->il_link == IMPLINK_IP)
        !           499:                printf("ip,");
        !           500:        else
        !           501:                printf("%d (x%x),", ip->il_link, ip->il_link);
        !           502:        printf(" subtype=%x", ip->il_subtype);
        !           503:        if (cc >= sizeof(struct imp_leader) && ip->il_length)
        !           504:                printf(" len=%u bytes", ntohs((u_short)ip->il_length) >> 3);
        !           505:        printf(">\n");
        !           506: }

unix.superglobalmegacorp.com

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