Annotation of cci/usr/src/usr.bin/bsc/cmd/batch/bsctrace.c, revision 1.1.1.1

1.1       root        1: /*     D.L.Buck and Associates, Inc. - 8/27/84
                      2:  *
                      3:  *     COPYRIGHT NOTICE:
                      4:  *             Copyright c 8/27/84 - An unpublished work by 
                      5:  *             D.L.Buck and Associates, Inc.
                      6:  *
                      7:  *     PROPRIETARY RIGHTS NOTICE:
                      8:  *             All rights reserved. This document and program contains
                      9:  *             proprietary information of D.L.Buck and Associates,Inc.
                     10:  *             of San Jose, California, U.S.A., embodying confidential
                     11:  *             information,  ideas, and expressions,  no part of which
                     12:  *             may be reproduced, or transmitted in any form or by any
                     13:  *             means,  electronic,  mechanical,  or otherwise, without
                     14:  *             the written permission of D.L.Buck and Associates, Inc.
                     15:  *
                     16:  *     NAME
                     17:  *             bsctrace - BISYNC Monitor Information Display Utility
                     18:  *
                     19:  *     SYNOPSIS
                     20:  *             bsctrace [-data=tttt] [-verbose] [file]
                     21:  *
                     22:  *     DESCRIPTION
                     23:  *             BSCTRACE interprets trace information as recorded by
                     24:  *             BSCMON.   The -data option is used to cause printing
                     25:  *             of the actual data, in addition to the state trace.
                     26:  *
                     27:  *     ALGORITHM
                     28:  *             I. Initialize:
                     29:  *                     A. trace messages
                     30:  *                     B. ASCII character set table
                     31:  *                     C. trmat (trace matrix -- index to all bsc state
                     32:  *                        transitions and their meanings)
                     33:  *                     D. trace buffer
                     34:  *                     E. command line options: 
                     35:  *                             1. verbose
                     36:  *                             2. data display format (hex, ASCII, EBCDIC)
                     37:  *                     F. if data or verbose options set, set up trace
                     38:  *                        report header
                     39:  *                     G. open trace device
                     40:  *            II. Process trace data:
                     41:  *                     A. Read a trace buffer full of stuff from the trace
                     42:  *                        device
                     43:  *                     B. for-loop: keep extracting trace packets until the
                     44:  *                        end of the trace buffer is reached, and:
                     45:  *                             1. if data or verbose set and new page,
                     46:  *                                print trace report header
                     47:  *                             2. switch on trace type:
                     48:  *                                     a. send, receive,decision,error, or
                     49:  *                                        function types:
                     50:  *                                             i. get time packet was received
                     51:  *                                            ii. if data and verbose not set:
                     52:  *                                                     print only time rcv'd,
                     53:  *                                                     state #, and state type
                     54:  *                                                else 
                     55:  *                                                     pull transition meaning
                     56:  *                                                     from trmat and print it
                     57:  *                                                     with time rcv'd, state # *                                                      and state type
                     58:  *                                            iii. get another packet from the
                     59:  *                                                 trace buffer
                     60:  *                                             iv. if it's not complete, set
                     61:  *                                                 trace buffer pointer to end
                     62:  *                                                 of buffer to end loop and
                     63:  *                                                 force another read beginning *                                                  at next trace packet.
                     64:  *                                              v. break switch
                     65:  *                                     b. class trace type:
                     66:  *                                             i. get time packet was received
                     67:  *                                            ii. if data and verbose not set:
                     68:  *                                                print only time rcv'd, state
                     69:  *                                                #, and state type
                     70:  *                                                else pull class message
                     71:  *                                                and print it, too.
                     72:  *                                           iii. get another packet from the
                     73:  *                                                trace buffer
                     74:  *                                            iv. if it's not complete, set
                     75:  *                                                trace buffer pointer to end
                     76:  *                                                of buffer to end loop and
                     77:  *                                                force another read beginning 
                     78:  *                                                at next trace packet.
                     79:  *                                             v. break switch
                     80:  *                                     c. overruns trace type:
                     81:  *                                             i. i-v as above, except that
                     82:  *                                                if data or verbose set,
                     83:  *                                                print number of overruns.
                     84:  *                                                overrun count is kept in
                     85:  *                                                the trace state postion of
                     86:  *                                                trace packets.
                     87:  *                                     d. data packet sent/received type:
                     88:  *                                             i. i-v as above, except that
                     89:  *                                                if data or verbose set,
                     90:  *                                                display data one character
                     91:  *                                                at a time, using the ASCII
                     92:  *                                                character set table to 
                     93:  *                                                display in hex, ASCII, or
                     94:  *                                                EBCDIC as user specified.
                     95:  *                     C. close trace device
                     96:  */
                     97: 
                     98: #include <stdio.h>
                     99: /*
                    100: #include <sys/types.h>
                    101: */
                    102: #include <bsc/bsctr.h>
                    103: #include "local.h"
                    104: #if defined BSD42
                    105: #include <sys/time.h>
                    106: #else
                    107: #include <time.h>
                    108: #endif
                    109: 
                    110: extern int errno;
                    111: extern char *sys_errlist[];
                    112: 
                    113: #define        HEX     1
                    114: #define        ASCII   2
                    115: #define        EBCDIC  3
                    116: #define PAGELEN 60     /* for date and verbose mode reports */
                    117: 
                    118: #ifndef lint
                    119: static char sccsid[] = "@(#)bsctrace.c 1.15 REL";
                    120: #endif
                    121: 
                    122: static long trmat[55][55];     /* index to trace text file; 
                    123:                                   trace text file contains all possible bsc
                    124:                                   state transitions and their meanings */
                    125: 
                    126: #define MAX_C 11       /* # of packet types */
                    127: char *c_info[] = {
                    128:                "Receive timeout",
                    129:                "Enquiry message",
                    130:                "End of transmission, or disconnect",
                    131:                "Negative acknowledgement",
                    132:                "Text block - last of series",
                    133:                "Text block - not last of series",
                    134:                "Wait acknowledgement",
                    135:                "Reverse interrupt",
                    136:                "Even acknowledgement",
                    137:                "Odd acknowledgement",
                    138:                "Temporary transmit delay"
                    139:        };
                    140: 
                    141: /* ASCII character set */
                    142: char *tbl1[] = {
                    143:        "00 NU NU ",
                    144:        "01 SH SH ",
                    145:        "02 SX SX ",
                    146:        "03 EX EX ",
                    147:        "04 04 ET ",
                    148:        "05 HT EQ ",
                    149:        "06 06 AK ",
                    150:        "07 RB BL ",
                    151:        "08 08 BS ",
                    152:        "09 09 HT ",
                    153:        "0A 0A LF ",
                    154:        "0B VT VT ",
                    155:        "0C FF FF ",
                    156:        "0D CR CR ",
                    157:        "0E SO SO ",
                    158:        "0F SI SI ",
                    159:        "10 DL DL ",
                    160:        "11 D1 D1 ",
                    161:        "12 D2 D2 ",
                    162:        "13 D3 D3 ",
                    163:        "14 14 D4 ",
                    164:        "15 15 NK ",
                    165:        "16 BS SY ",
                    166:        "17 17 EB ",
                    167:        "18 CN CN ",
                    168:        "19 EM EM ",
                    169:        "1A 1A SB ",
                    170:        "1B 1B EC ",
                    171:        "1C 1C FS ",
                    172:        "1D GS GS ",
                    173:        "1E 1E RS ",
                    174:        "1F US US ",
                    175:        "20 20 SP ",
                    176:        "21 21  ! ",
                    177:        "22 FS  \" ",
                    178:        "23 23  # ",
                    179:        "24 24  $ ",
                    180:        "25 LF  % ",
                    181:        "26 EB  & ",
                    182:        "27 EC  ' ",
                    183:        "28 28  ( ",
                    184:        "29 29  ) ",
                    185:        "2A 2A  * ",
                    186:        "2B 2B  + ",
                    187:        "2C 2C  , ",
                    188:        "2D EQ  - ",
                    189:        "2E AK  . ",
                    190:        "2F BL  / ",
                    191:        "30 30  0 ",
                    192:        "31 31  1 ",
                    193:        "32 SY  2 ",
                    194:        "33 33  3 ",
                    195:        "34 34  4 ",
                    196:        "35 RS  5 ",
                    197:        "36 36  6 ",
                    198:        "37 ET  7 ",
                    199:        "38 38  8 ",
                    200:        "39 39  9 ",
                    201:        "3A 3A  : ",
                    202:        "3B 3B  ; ",
                    203:        "3C D4  < ",
                    204:        "3D NK  = ",
                    205:        "3E 3E  > ",
                    206:        "3F SB  ? ",
                    207:        "40 SP  @ ",
                    208:        "41 41  A ",
                    209:        "42 42  B ",
                    210:        "43 43  C ",
                    211:        "44 44  D ",
                    212:        "45 45  E ",
                    213:        "46 46  F ",
                    214:        "47 47  G ",
                    215:        "48 48  H ",
                    216:        "49 49  I ",
                    217:        "4A 4A  J ",
                    218:        "4B  .  K ",
                    219:        "4C  <  L ",
                    220:        "4D  (  M ",
                    221:        "4E  +  N ",
                    222:        "4F 4F  O ",
                    223:        "50  &  P ",
                    224:        "51 51  Q ",
                    225:        "52 52  R ",
                    226:        "53 53  S ",
                    227:        "54 54  T ",
                    228:        "55 55  U ",
                    229:        "56 56  V ",
                    230:        "57 57  W ",
                    231:        "58 58  X ",
                    232:        "59 59  Y ",
                    233:        "5A  !  Z ",
                    234:        "5B  $  [ ",
                    235:        "5C  *  \\ ",
                    236:        "5D  )  ] ",
                    237:        "5E  ;  ^ ",
                    238:        "5F  ^  _ ",
                    239:        "60  -  `",
                    240:        "61  /  a",
                    241:        "62 62  b",
                    242:        "63 63  c",
                    243:        "64 64  d",
                    244:        "65 65  e",
                    245:        "66 66  f",
                    246:        "67 67  g",
                    247:        "68 68  h",
                    248:        "69 69  i",
                    249:        "6A  |  j",
                    250:        "6B  ,  k",
                    251:        "6C  %  l",
                    252:        "6D  _  m",
                    253:        "6E  >  n",
                    254:        "6F  ?  o",
                    255:        "70 70  p",
                    256:        "71 71  q",
                    257:        "72 72  r",
                    258:        "73 73  s",
                    259:        "74 74  t",
                    260:        "75 75  u",
                    261:        "76 76  v",
                    262:        "77 77  w",
                    263:        "78 78  x",
                    264:        "79  `  y",
                    265:        "7A  :  z",
                    266:        "7B  #  {",
                    267:        "7C  @  |",
                    268:        "7D  '  }",
                    269:        "7E  =  ~",
                    270:        "7F  \" RB" };
                    271: char *tbl2[] = {
                    272:        "80 80 ",
                    273:        "81  a ",
                    274:        "82  b ",
                    275:        "83  c ",
                    276:        "84  d ",
                    277:        "85  e ",
                    278:        "86  f ",
                    279:        "87  g ",
                    280:        "88  h ",
                    281:        "89  i ",
                    282:        "8A 8A ",
                    283:        "8B 8B ",
                    284:        "8C 8C ",
                    285:        "8D 8D ",
                    286:        "8E 8E ",
                    287:        "8F 8F ",
                    288:        "90 90 ",
                    289:        "91  j ",
                    290:        "92  k ",
                    291:        "93  l ",
                    292:        "94  m ",
                    293:        "95  n ",
                    294:        "96  o ",
                    295:        "97  p ",
                    296:        "98  q ",
                    297:        "99  r ",
                    298:        "9A 9A ",
                    299:        "9B 9B ",
                    300:        "9C 9C ",
                    301:        "9D 9D ",
                    302:        "9E 9E ",
                    303:        "9F 9F ",
                    304:        "A0 A0 ",
                    305:        "A1  ~ ",
                    306:        "A2  s ",
                    307:        "A3  t ",
                    308:        "A4  u ",
                    309:        "A5  v ",
                    310:        "A6  w ",
                    311:        "A7  x ",
                    312:        "A8  y ",
                    313:        "A9  z ",
                    314:        "AA AA ",
                    315:        "AB AB ",
                    316:        "AC AC ",
                    317:        "AD  [ ",
                    318:        "AE AE ",
                    319:        "AF AF ",
                    320:        "B0 B0 ",
                    321:        "B1 B1 ",
                    322:        "B2 B2 ",
                    323:        "B3 B3 ",
                    324:        "B4 B4 ",
                    325:        "B5 B5 ",
                    326:        "B6 B6 ",
                    327:        "B7 B7 ",
                    328:        "B8 B8 ",
                    329:        "B9 B9 ",
                    330:        "BA BA ",
                    331:        "BB BB ",
                    332:        "BC BC ",
                    333:        "BD  ] ",
                    334:        "BE BE ",
                    335:        "BF BF ",
                    336:        "C0  { ",
                    337:        "C1  A ",
                    338:        "C2  B ",
                    339:        "C3  C ",
                    340:        "C4  D ",
                    341:        "C5  E ",
                    342:        "C6  F ",
                    343:        "C7  G ",
                    344:        "C8  H ",
                    345:        "C9  I ",
                    346:        "CA CA ",
                    347:        "CB CB ",
                    348:        "CC CC ",
                    349:        "CD CD ",
                    350:        "CE CE ",
                    351:        "CF CF ",
                    352:        "D0  } ",
                    353:        "D1  J ",
                    354:        "D2  K ",
                    355:        "D3  L ",
                    356:        "D4  M ",
                    357:        "D5  N ",
                    358:        "D6  O ",
                    359:        "D7  P ",
                    360:        "D8  Q ",
                    361:        "D9  R ",
                    362:        "DA DA ",
                    363:        "DB DB ",
                    364:        "DC DC ",
                    365:        "DD DD ",
                    366:        "DE DE ",
                    367:        "DF DF ",
                    368:        "E0  \\",
                    369:        "E1 E1",
                    370:        "E2  S",
                    371:        "E3  T",
                    372:        "E4  U",
                    373:        "E5  V",
                    374:        "E6  W",
                    375:        "E7  X",
                    376:        "E8  Y",
                    377:        "E9  Z",
                    378:        "EA EA",
                    379:        "EB EB",
                    380:        "EC EC",
                    381:        "ED ED",
                    382:        "EE EE",
                    383:        "EF EF",
                    384:        "F0  0",
                    385:        "F1  1",
                    386:        "F2  2",
                    387:        "F3  3",
                    388:        "F4  4",
                    389:        "F5  5",
                    390:        "F6  6",
                    391:        "F7  7",
                    392:        "F8  8",
                    393:        "F9  9",
                    394:        "FA FA",
                    395:        "FB FB",
                    396:        "FC FC ",
                    397:        "FD FD ",
                    398:        "FE FE ",
                    399:        "FF FF"
                    400:        };
                    401: char tracebuf[TBUFSIZE];       /* trace information buffer */
                    402: 
                    403: int xy_ctr;                    /* count # of data chars on a line */
                    404: char first[81];                        /* 1st 4 bytes of characters for data display
                    405:                                   go here */
                    406: char second[81];               /* 2nd 4 bytes of characters for data display
                    407:                                   go here */
                    408: char *header[] = { "\f\n",
                    409:                "\t\t\tBSC State Trace Report\n",
                    410:                "\t\t\t\tmm/dd/yy\n",
                    411: "---------------------------------------------------------------------------\n",
                    412:                "  Time\t |State\t|  Type\t|  Message\n",
                    413: "---------------------------------------------------------------------------\n"
                    414: };
                    415: char *fptr;                    /* first pointer */
                    416: char *sptr;                    /* second pointer */
                    417: int counter;                   /* report line count for verbose mode */
                    418: void exit();
                    419: 
                    420: main(argc,argv)
                    421: int argc;
                    422: char * argv[];
                    423: {
                    424:        struct tm *localtime();
                    425:        register int len;               /* length of data just read from trfd*/
                    426:        register int left = 0;          /* # of chars left in the tracebuf */
                    427:        int data = 0;                   /* data display indicator */
                    428:        register int idx = 0;           /* convenient index */
                    429:        int trfd = 0;                   /* trace information file descriptor */
                    430:        register struct bsctr *trb;     /* ptr to current trace packet */
                    431:        char *tptr;                     /* ptr to ascii char set table */
                    432:        register int chr_count;
                    433:        int verbose = 0;
                    434:        FILE *fopen();
                    435:        FILE *trtxt;
                    436:        long ftell();           /* function returns current value of offset
                    437:                                   relative to beginning of file */
                    438:        long whence;            /* contains value returned by ftell */
                    439:        long time();
                    440:        long currtime;
                    441: 
                    442:        char line[81];
                    443: 
                    444:        char *lptr;
                    445:        register char *pos;             /* trb->tr_data pointer */
                    446:        register char last_type = ' ';  /* last packet type */
                    447:        register int from;              /* bsc state this packet started from */
                    448:        register int to;                /* bsc state this packet went to */
                    449:        register int last_state, save_state;
                    450:        register struct tm *t;
                    451:        long xtime;
                    452: #ifdef ZEROTIME
                    453:        struct tm tm;
                    454:        t = &tm;
                    455: #endif
                    456: 
                    457:        lptr = &line[0];
                    458: 
                    459: /* get options from command line */
                    460:        for (counter = 1; counter < argc; ++counter) {
                    461:                if (strcmp(argv[counter],"-verbose") == 0 ||
                    462:                    strncmp(argv[counter],"-data",5) == 0) {
                    463: 
                    464:                /* set up trmat */
                    465:                        if ((trtxt = fopen("trace.text","r")) == NULL &&
                    466:                            (trtxt=fopen("/usr/lib/bsc/trace.text","r"))== NULL)
                    467:                        {       fprintf(stderr,
                    468:                                "bsctrace: can't open trace text file\n");
                    469:                                exit(1);        }
                    470: 
                    471: /* fill the trace text matrix (trmat) -- open trace.text file, which contains
                    472:    a list of state transitions and explanations for each one, e.g.
                    473:        1 0   Start
                    474:        8 9   Correct ACK
                    475:        .
                    476:        .
                    477:        .
                    478:    save the offset at which the explanation occurs in "whence". 
                    479:    trmat[from][to] becomes the value in whence. this saves much
                    480:    file manipulation later when the trace report is prepared. */
                    481:    
                    482:                        whence = ftell(trtxt);
                    483:                        while (fgets(line,sizeof line,trtxt) != NULL)   {
                    484:                        /* "from" state is line[0] */
                    485:                                from = atoi(lptr);
                    486:                        /* "to" state is line[2] */
                    487:                                lptr += 2;
                    488:                                to = atoi(lptr);
                    489:                                whence += 6L; /* offset in tracetext file where
                    490:                                                 description of state transition
                    491:                                                 [from][to] is kept */
                    492:                                trmat[from][to] = whence;
                    493:                                lptr = &line[0];
                    494:                                whence = ftell(trtxt);
                    495:                        }
                    496:                        if (strcmp(argv[counter],"-data=hex") == 0) {
                    497:                                data = HEX;
                    498:                                continue;
                    499:                        }
                    500:                        if (strcmp(argv[counter],"-data=ebcdic") == 0) {
                    501:                                data = EBCDIC;
                    502:                                continue;
                    503:                        }
                    504:                        if (strcmp(argv[counter],"-data=ascii") == 0) {
                    505:                                data = ASCII;
                    506:                                continue;
                    507:                        }
                    508:                        if (strcmp(argv[counter],"-verbose") == 0)      {
                    509:                                ++verbose;
                    510:                                continue;
                    511:                        }
                    512:                }
                    513:                if (argv[counter][0] == '-' || counter != argc-1) {
                    514:                        fprintf(stderr,"bsctrace: invalid parameter (%s)\n",
                    515:                                 argv[counter]);
                    516:                        exit(1);
                    517:                }
                    518: 
                    519: 
                    520:                trfd = open(argv[counter],0);   /* open the trace device */
                    521:                if (trfd < 0) {
                    522:                        fprintf(stderr,
                    523:                         "bsctrace: can't read trace information file %s: %s\n",
                    524:                                argv[counter],sys_errlist[errno]);
                    525:                        exit(1);
                    526:                }
                    527:        }
                    528: 
                    529:        if (data || verbose)    { /* set up trace report header */
                    530:                currtime = time((long*)0);
                    531:                t = localtime(&currtime);
                    532:                sprintf(header[2],"\t\t\t\t%02d/%02d/%02d\n",
                    533:                t->tm_mon+1,t->tm_mday,t->tm_year);
                    534:        }
                    535: 
                    536:        /* begin reading trace information */
                    537:        last_state = 0;
                    538:        counter = PAGELEN;      /* force headers to display first */
                    539: 
                    540: again:
                    541:        while ((len = left + read(trfd,&tracebuf[left],sizeof tracebuf - left)) > 0)
                    542: 
                    543:                for(trb = (struct bsctr *)tracebuf;
                    544:                    trb < (struct bsctr *) &tracebuf[len]; ) {
                    545:                        if ((data || verbose) && counter >= PAGELEN)
                    546:                                disp_header();
                    547: 
                    548:                    switch (trb->tr_type) {
                    549:                    case 'd':   /* decision */
                    550:                    case 'e':   /* error    */
                    551:                    case 'f':   /* function */
                    552:                    case 'r':   /* receive  */
                    553:                    case 's':   /* send     */
                    554: 
                    555: /* if ZEROTIME is defined in local.h, use time as is. Otherwise do localtime
                    556:    to get the actual time. */
                    557:                        xtime = btol(&trb->tr_time);
                    558: #ifndef ZEROTIME
                    559:                        t = localtime(&xtime);
                    560: #else
                    561:                        t->tm_hour = (xtime/60)/60;
                    562:                        t->tm_min = (xtime/60)%60;
                    563:                        t->tm_sec = xtime%60;
                    564: #endif
                    565:                        if (!verbose && !data)
                    566:                                printf("%02d:%02d:%02d %2d %c\n",
                    567:                                        t->tm_hour,t->tm_min,t->tm_sec,
                    568:                                        trb->tr_state,trb->tr_type);
                    569:                        else    {
                    570:                                if (last_type >= 'x')
                    571:                                        disp_data();
                    572: 
                    573:                                save_state = last_state;
                    574:                                whence = trmat[last_state][trb->tr_state];
                    575:                                last_state = trb->tr_state;
                    576:                                if (whence)     {
                    577:                                        fseek(trtxt,whence,0);
                    578:                                      if (fgets(line,sizeof line, trtxt) == NULL) {
                    579:                                      fprintf(stderr,
                    580:                                      "bsctrace: last_state %d, whernce %d\n",
                    581:                                        save_state,whence);
                    582:                                      fprintf(stderr,
                    583:                                      "bsctrace: can't read trace text file\n");
                    584:                                       exit(1); }
                    585: 
                    586:                                        line[strlen(line)-1] = '\0';
                    587:                                }
                    588:                                else
                    589:                                        line[0] = '\0';
                    590: 
                    591:                                printf("%02d:%02d:%02d | %2d\t| %c\t| ",
                    592:                                        t->tm_hour,t->tm_min,t->tm_sec,
                    593:                                        trb->tr_state,trb->tr_type);
                    594:                                chr_count = strlen(line);
                    595:                                if (chr_count < 50 || chr_count == 0) 
                    596:                                        printf("%s\n",line);
                    597:                                else    {
                    598:                                        bcopy(first,line,50);
                    599:                                        lptr = &line[50];
                    600:                                        printf("%s\n",first);
                    601:                                        printf("\t |\t|\t| %s\n",lptr);
                    602:                                        if (++counter>=PAGELEN)
                    603:                                                disp_header();
                    604:                                }
                    605:                                ++counter;
                    606:                        }
                    607: 
                    608:                        last_type = trb->tr_type;
                    609:                        trb = (struct bsctr *)&trb->tr_val;
                    610:                        left=chk_left(trb,len);
                    611:                        break;
                    612: 
                    613:                    case 'c':   /* class */
                    614:                        xtime = btol(&trb->tr_time);
                    615: #ifndef ZEROTIME
                    616:                        t = localtime(&xtime);
                    617: #else
                    618:                        t->tm_hour = (xtime/60)/60;
                    619:                        t->tm_min = (xtime/60)%60;
                    620:                        t->tm_sec = xtime%60;
                    621: #endif
                    622:                        if (!verbose && !data)
                    623:                                printf("%02d:%02d:%02d %2d %c\n",
                    624:                                        t->tm_hour,t->tm_min,t->tm_sec,
                    625:                                        trb->tr_state,trb->tr_type);
                    626:                        else    {
                    627:                                if (last_type >= 'x')
                    628:                                        disp_data();
                    629: 
                    630:                                printf("%02d:%02d:%02d | %2d\t| %c\t|",
                    631:                                        t->tm_hour,t->tm_min,t->tm_sec,
                    632:                                        trb->tr_state,trb->tr_type);
                    633:                                if (trb->tr_state + 1 < MAX_C)
                    634:                                        printf(" %s\n",c_info[trb->tr_state+1]);
                    635:                                else
                    636:                                        fputs("\n",stdout);
                    637:                                ++counter;
                    638:                        }
                    639:                        last_type = trb->tr_type;
                    640:                        trb = (struct bsctr *)&trb->tr_val;
                    641:                        left = chk_left (trb, len);
                    642:                        break;
                    643:                
                    644:                    case 'o':   /* overruns */
                    645:                        xtime = btol(&trb->tr_time);
                    646: #ifndef ZEROTIME
                    647:                        t = localtime(&xtime);
                    648: #else
                    649:                        t->tm_hour = (xtime/60)/60;
                    650:                        t->tm_min = (xtime/60)%60;
                    651:                        t->tm_sec = xtime%60;
                    652: #endif
                    653:                        if (!verbose && !data)
                    654:                                printf("%02d:%02d:%02d %2d %c\n",
                    655:                                t->tm_hour,t->tm_min,t->tm_sec,
                    656:                                trb->tr_state,trb->tr_type);
                    657:                        else    {       
                    658:                                if (last_type >= 'x')
                    659:                                        disp_data();
                    660: 
                    661:                                printf ("%02d:%02d:%02d | %2d\t| %c\t| %s %d\n",
                    662:                                t->tm_hour,t->tm_min,t->tm_sec,trb->tr_state,
                    663:                                trb->tr_type,"Trace overruns:",trb->tr_state);
                    664: 
                    665:                                ++counter;
                    666:                        }
                    667:                        last_type = trb->tr_type;
                    668:                        trb = (struct bsctr *)&trb->tr_val;
                    669:                        left = chk_left (trb, len);
                    670:                        break;
                    671: 
                    672:                   case 'y':
                    673:                   case 'x':    /* data being sent (x) or rcv'ed (y) */
                    674:                        xtime = btol(&trb->tr_time);
                    675: #ifndef ZEROTIME
                    676:                        t = localtime(&xtime);
                    677: #else
                    678:                        t->tm_hour = (xtime/60)/60;
                    679:                        t->tm_min = (xtime/60)%60;
                    680:                        t->tm_sec = xtime%60;
                    681: #endif
                    682:                        if (!data && !verbose)  {
                    683:                                if (last_type != trb->tr_type)
                    684:                                        printf("%02d:%02d:%02d %2d %s\n",
                    685:                                        t->tm_hour,t->tm_min,t->tm_sec,
                    686:                                        trb->tr_state,
                    687:                                        (trb->tr_type == 'x')?"TD":"RD");
                    688:                        }
                    689:                        else    {
                    690:                                if (last_type>='x' && last_type!=trb->tr_type) 
                    691:                                        disp_data();
                    692:                                if (last_type != trb->tr_type)  {
                    693:                                        printf("%02d:%02d:%02d | %2d\t| %s\t| ",
                    694:                                        t->tm_hour,t->tm_min,t->tm_sec,
                    695:                                        trb->tr_state,
                    696:                                        (trb->tr_type == 'x')?"TD":"RD");
                    697: 
                    698:                                        xy_ctr = 0;
                    699:                                        fptr = first;
                    700:                                        sptr = second;
                    701:                                }
                    702: 
                    703:                                if (data && trb->tr_val)        {
                    704:                                pos = &trb->tr_data[0];
                    705: 
                    706:                                while (pos != &trb->tr_data[trb->tr_val]){
                    707:                                        idx = *pos & 0xff;
                    708:                                        tptr=((idx< 0x80)?tbl1[idx]:tbl2[idx-0x80]);
                    709:                                                pos++;
                    710:                                        if (data == EBCDIC)     {
                    711:                                                *fptr++ = tptr[3];
                    712:                                                *sptr++ = tptr[4];
                    713:                                        }
                    714:                                        if (data == ASCII)      {       
                    715:                                                *fptr++ = tptr[6];
                    716:                                                *sptr++ = tptr[7];
                    717:                                        }
                    718:                                        if (data == HEX)        {
                    719:                                                *fptr++ = tptr[0];
                    720:                                                *sptr++ = tptr[1];
                    721:                                        }
                    722:                                        ++xy_ctr;
                    723:                                        if (xy_ctr == 50)       {
                    724:                                                *fptr = *sptr = '\0';
                    725:                                                printf("%s\n",first);
                    726:                                                if (++counter>=PAGELEN)
                    727:                                                        disp_header();
                    728:                                                printf("\t |\t|\t| %s\n",
                    729:                                                       second);
                    730:                                                xy_ctr = 0;
                    731:                                                fptr = first;
                    732:                                                sptr = second;
                    733:                                                if (++counter >= PAGELEN)
                    734:                                                        disp_header();
                    735:                                        printf("\t |\t|\t| ");
                    736:                                        }
                    737:                                        continue;
                    738:                                    }
                    739:                                }
                    740:                        }
                    741:                        if (trb->tr_val & 1)    /* round to word */
                    742:                                ++trb->tr_val;
                    743:                        last_type = trb->tr_type;
                    744:                        trb = (struct bsctr *)&trb->tr_data[trb->tr_val];
                    745:                        left = chk_left (trb, len);
                    746:                        break;
                    747: 
                    748:                    default:
                    749:                        printf("*** Unknown trace type: %c (0x%x) 0x%X 0x%x\n",
                    750:                                trb->tr_type,trb->tr_type,trb->tr_time,
                    751:                                trb->tr_state);
                    752:                        goto again;
                    753:                        /* abort() */
                    754:                }
                    755:                if (left) break;        /* need to read more */
                    756:        }
                    757:        close(trfd);
                    758: }
                    759: 
                    760: /* chk_left - check whether or not there are enough characters left in the
                    761:    trace buffer for a complete packet */
                    762: chk_left(trb,len)
                    763: register struct bsctr *trb;
                    764: register int len;
                    765: {
                    766:        register int left;
                    767: 
                    768:        left = &tracebuf[len] - (char *)trb;
                    769:        if (left < 6 || (trb->tr_type >= 'x' && left < 8) ||
                    770:            (trb->tr_type >= 'x' && left < (8 + trb->tr_val))) {
                    771:                bcopy (tracebuf, (char *)trb, left);
                    772:                return(left);
                    773:        }
                    774:        else return(0);
                    775: }
                    776: /* disp_data - display x and/or y packet data */
                    777: disp_data()
                    778: {
                    779:        if (xy_ctr)     {
                    780:                *fptr = *sptr = '\0';
                    781:                puts(first);
                    782:                if (++counter >= PAGELEN)
                    783:                        disp_header();
                    784:                printf("\t |\t|\t| %s\n",second);
                    785:                xy_ctr = 0;
                    786:                ++counter;
                    787:        }
                    788:        else    {
                    789:                putchar('\n');
                    790:                ++counter;
                    791:        }
                    792: 
                    793:        if (counter >= PAGELEN)
                    794:                disp_header();
                    795: }
                    796: 
                    797: /* disp_header - display verbose/data mode report header */
                    798: disp_header()
                    799: {
                    800:        for (counter = 0; counter < 6; ++counter)
                    801:                fputs(header[counter],stdout);
                    802: }
                    803: 
                    804: btol(bptr)
                    805: char *bptr;
                    806: {      register long lx;
                    807:        lx = (bptr[0] << 24) | (bptr[1] << 16) | (bptr[2] << 8) | (bptr[3]);    
                    808:        return(lx);
                    809: }

unix.superglobalmegacorp.com

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