Annotation of 43BSDReno/usr.sbin/implog/implog.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1983, 1988 Regents of the University of California.
                      3:  * All rights reserved.
                      4:  *
                      5:  * Redistribution and use in source and binary forms are permitted 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.