Annotation of 43BSDTahoe/cci/pt/dlpt.c, revision 1.1.1.1

1.1       root        1: /************************************************************************
                      2:  *                                                                     *
                      3:  *     dlpt    - download a CCI POWERTERMINAL or POWERTERMINAL II      *
                      4:  *                                                                     *
                      5:  ************************************************************************/
                      6: 
                      7: /************************************************************************
                      8:  *     Compilation Notes --                                            *
                      9:  *                                                                     *
                     10:  *     - The symbol  V7  must be defined when compiling for Version 7  *
                     11:  *       or Berkeley 4.2.                                              *
                     12:  *     - No flags are needed when compiling for S3.                    *
                     13:  *     - This file contains the changes to support the new Berkeley    *
                     14:  *       4.2 signaling mechanism that were present at one point, then  *
                     15:  *       deleted, and were restored in version 2.3.1.  These changes   *
                     16:  *       are required to make timed-out reads work correctly.          *
                     17:  *       Compile with NEWSEG set to get these changes.                 *
                     18:  *                                                                     *
                     19:  ************************************************************************/
                     20: 
                     21: /************************************************************************
                     22: Version 1.2.1 changes:
                     23: 
                     24: MDS    3/13/84         Implemented logic to circumvent 5/20 CPU port
                     25:                          problem.  CPU port loses input characters
                     26:                          transmitted by the terminal at 9600 baud.
                     27:                          Therefore, if this program receives an invalid
                     28:                          DA response and it is talking to a cpu port,
                     29:                          then act as if a valid ROM DA response was
                     30:                          received.
                     31:                        Implemented "force" option.  If specicified at
                     32:                          execution time the receipt of an invalid DA
                     33:                          response will be treated as a valid ROM DA
                     34:                          response.
                     35: 
                     36: *************************************************************************
                     37: 
                     38: Version 2.0.0 changes:
                     39: 
                     40: MDS    11/6/84         Implemented logic to support CCI POWERTERMINAL II.
                     41: 
                     42: *************************************************************************
                     43: 
                     44: Version 2.1.0 changes:
                     45: 
                     46:                        Version 2.1 is an interim version of dlpt created
                     47:                        by OSG.
                     48: 
                     49: *************************************************************************
                     50: 
                     51: Version 2.2.0 changes:
                     52: 
                     53: SP & BM @osg
                     54: MDS    2/20/85         1) -a prompt came up twice on PT1 when 'n'
                     55:                        given.  Fixed.
                     56:                        2) If tty is tty01 or console, and dlpt
                     57:                        cannot determine terminal type, message is
                     58:                        given for user to manually 'dlpt -f[12]'.
                     59:                        3) Added argument check to -t option to prevent
                     60:                        core dump if no arguments given with -t.
                     61:                        4) In function whoisit() changed fputs to write.
                     62:                        Fputs did not work on PERPOS-S.
                     63:                        5) Removed CR1 from ttyinit() for System 3.
                     64:                        CR1 caused a NULL,ACK to be output after CR
                     65:                        in Terminal loaded message.
                     66:                        6) Added XOFF/XON recognition to download by
                     67:                        adding IXON to ttyinit().
                     68:                        7) Changed source to default compile for S3
                     69:                        instead of V7.  For V7 need to set V7 flag.
                     70: 
                     71: *************************************************************************
                     72: 
                     73: Version 2.3.0 changes:
                     74: 
                     75: BJM @osg
                     76: BJM    3/6/85          Added XON/XOFF recognition to download for
                     77:                        Version 7 and Berkeley 4.2 version by setting
                     78:                        port to CBREAK mode for 'normal' download and
                     79:                        RAW mode for download in reliability mode.
                     80: 
                     81:                        Added conditional compilation statements for
                     82:                        19.2K baud.
                     83: 
                     84: *************************************************************************
                     85: 
                     86: Version 2.3.1 changes:
                     87: 
                     88: woe@ccicpg
                     89: WOE    6/17/85         Restored changes for new Berkeley 4.2 signalling
                     90:                        mechanisms under the compile-time define NEWSIG.
                     91:                        Timed-out reads require these changes since the
                     92:                        read system call is "automatically" retried when
                     93:                        interrupted by a SIGALRM (or any other handled/
                     94:                        ignored signal).
                     95: 
                     96: *************************************************************************/
                     97: 
                     98: 
                     99: /************************************************************************
                    100:  *                                                                     *
                    101:  *     Include files.                                                  *
                    102:  *                                                                     *
                    103:  ************************************************************************/
                    104: 
                    105: #include       "stdio.h"
                    106: #include       "signal.h"
                    107: 
                    108: #ifdef V7      /********* if Version 7                         *********/
                    109: 
                    110: #include       "sgtty.h"
                    111: 
                    112: #else          /********* else assume System 3                 *********/
                    113: 
                    114: #include       "termio.h"
                    115: 
                    116: #endif         /********* end of System 3                      *********/
                    117: 
                    118: #ifdef NEWSIG                  /* new signal mechanism */
                    119: #include       <setjmp.h>
                    120: #endif
                    121: 
                    122: /************************************************************************
                    123:  *                                                                     *
                    124:  *     Defines.                                                        *
                    125:  *                                                                     *
                    126:  ************************************************************************/
                    127: 
                    128: #define        VERSION         "2.3.1" /* version to be displayed by -v option */
                    129: 
                    130: typedef int BOOL;
                    131: 
                    132: #define PT1_DEFLD      "/lib/pt/DEFAULT.LD" /* default download file   */
                    133: #define PT2_DEFLD      "/lib/pt/PT2DEF.LD" /* default download file    */
                    134: #define TTY_PREFIX     "/dev/"         /* appended to -t field         */
                    135: 
                    136: #define        STX             0x02    /* cntrl b */
                    137: #define        ENQ             0x05    /* cntrl e */
                    138: #define        ACK             0x06    /* cntrl f */
                    139: #define        CAN             0x18    /* cntrl x */
                    140: #define BELL           0x07    /* cntrl g */
                    141: 
                    142: #define INVRESP                0       /* signal no valid DA response from tty */
                    143: #define PT1ROM         1       /* signal that PT1 ROM responded to DA  */
                    144: #define PT1RAM         2       /* signal that PT1 RAM responded to DA  */
                    145: #define PT2ROM         3       /* signal that PT2 ROM responded to DA  */
                    146: #define PT2RAM         4       /* signal that PT2 RAM responded to DA  */
                    147: 
                    148: #define TRUE           1
                    149: #define FALSE          0
                    150: 
                    151: #define        STX_TIMES       3       /* Number of times to send STX block    */
                    152: #define        NRETRIES        10      /* Number of retries for load block     */
                    153: #define LD_TIMEOUT     2       /* Loading timeout period               */
                    154: 
                    155: /************************************************************************
                    156:  *                                                                     *
                    157:  *     Local functions and variables.                                  *
                    158:  *                                                                     *
                    159:  ************************************************************************/
                    160: 
                    161: #ifdef NEWSIG                  /* new signal mechanism */
                    162: jmp_buf        jb;
                    163: #else
                    164: #define        timoread read
                    165: #define        timowrite write
                    166: #endif
                    167: 
                    168: char   stxrec [] = {STX,STX,STX,STX,STX,STX,STX,STX,STX,STX};
                    169: char   nulls [15];
                    170: char   can = CAN;
                    171: char   enq = ENQ;
                    172: char   ack = ACK;
                    173: char   devname[25] = TTY_PREFIX;
                    174: 
                    175: int    nullcnt = 14; 
                    176: int    timout;
                    177: int    bailout();
                    178: int    toterm;                 /* to terminal file descriptor          */
                    179: int    fromterm;               /* from terminal file descriptor        */
                    180: 
                    181: 
                    182: #ifdef V7      /********* if Version 7                         *********/
                    183: 
                    184: char           baudrate;       /* baudrate , set by ttysave or main    */
                    185: 
                    186: #else          /********* else assume System 3                 *********/
                    187: 
                    188: unsigned short baudrate;       /* baudrate , set by ttysave or main    */
                    189: 
                    190: #endif         /********* end of System 3                      *********/
                    191: 
                    192: 
                    193: char           *myname;        /* name of this program                 */
                    194: 
                    195: BOOL   rflag = FALSE;          /* reliability mode                     */
                    196: char   fflag = 0;              /* force mode (used if inv DA response  */
                    197: char   *intro[] = {
                    198:                        "\n",
                    199:                        "DO YOU WANT A TERMINAL LOAD SEQUENCE?",
                    200:                        " ",
                    201:                        "  If you do not answer within 15 seconds,",
                    202:                        "  the terminal load sequence will begin.",
                    203:                        " ",
                    204:                        "ENTER: y <return>  or  <return>  to load ",
                    205:                        "            n <return>  to avoid load :",
                    206:                        NULL
                    207:                };
                    208: 
                    209: char   *wrong[] = {    "INVALID ANSWER",
                    210:                        NULL
                    211:                };
                    212: 
                    213: char   *loading[]={
                    214:                        "\n",
                    215:                        "Terminal load in progress",
                    216:                        NULL
                    217:                };
                    218: 
                    219: 
                    220: /************************************************************************
                    221:  *                                                                     *
                    222:  *     main    - Do it.                                                *
                    223:  *                                                                     *
                    224:  ************************************************************************/
                    225: 
                    226: int
                    227: main (argc, argv)
                    228: int    argc;
                    229: char   **argv;
                    230: {
                    231:        char    *pt1file;
                    232:        char    *pt2file;
                    233:        int     who;            /* who is responding                    */
                    234:        char    *ttyname();
                    235:        BOOL    aflag = FALSE;  /* TRUE if inquire wanted before load   */
                    236: 
                    237:        myname = *argv++;       /* get the name of this program         */
                    238:        --argc;
                    239: 
                    240:        ttysave();      /* save ioctl params and init default baudrate */
                    241: 
                    242:        pt1file = PT1_DEFLD;    /* set default hex file for load        */
                    243:        pt2file = PT2_DEFLD;    /* set default hex file for load        */
                    244: 
                    245:        while( argc-- ) /* while there are arguments to process */
                    246:        {
                    247:                if( **argv == '-' )     /* while flags left */
                    248:                {
                    249:                        char    *fptr = *argv;  /* get ptr to flags */
                    250: 
                    251:                        while( *++fptr )        /* while flags left */
                    252:                        {
                    253:                                char    atobaud();
                    254: 
                    255:                                switch( *fptr ) /* process a flag  */
                    256:                                {
                    257: 
                    258:                                case 'a':       /* ask if load wanted */
                    259:                                        aflag = TRUE;
                    260:                                        break;
                    261: 
                    262:                                case 'b':       /* specific baud rate */
                    263:                                        if( fptr[1] != '\0' )
                    264:                                        {
                    265:                                                baudrate = atobaud(++fptr);
                    266:                                                if(baudrate == (char) -1 )
                    267:                                                {
                    268:                                                  fprintf(stderr,
                    269:                                                    "%s: %s - invalid baud\n",
                    270:                                                    myname, fptr);
                    271:                                                  usage();
                    272:                                                }
                    273:                                                fptr = "x";     /* fake out */
                    274:                                                break;
                    275:                                        }
                    276:                                        else
                    277:                                        {
                    278:                                                if( argc < 1 )
                    279:                                                        usage();
                    280:                                                baudrate = atobaud(*++argv);
                    281:                                                --argc;
                    282:                                                if(baudrate == (char) -1 )
                    283:                                                {
                    284:                                                   fprintf(stderr,
                    285:                                                     "%s: %s - invalid baud\n",
                    286:                                                     myname, *argv);
                    287:                                                   usage();
                    288:                                                }
                    289:                                        }
                    290:                                        break;
                    291: 
                    292:                                case 'f':       /* force mode           *
                    293:                                                 * to force load if     *
                    294:                                                 * invalid DA response  */
                    295:                                        /* get type '1' or '2' for      *
                    296:                                         *   PT1 or PT2                 */
                    297:                                        fflag = *++fptr;
                    298:                                        break;
                    299: 
                    300:                                case 'r':       /*reliability mode */
                    301:                                        rflag = TRUE;
                    302:                                        break;
                    303: 
                    304:                                case 't':       /* specific port        */
                    305:                                        if( fptr[1] != 0 )
                    306:                                        {
                    307:                                                strcat(devname,++fptr);
                    308:                                                fptr = "x"; /* fake out */
                    309:                                        }
                    310:                                        else
                    311:                                        {
                    312:                                                if( argc < 1 )
                    313:                                                        usage();
                    314:                                                strcat(devname, *++argv);
                    315:                                                --argc;
                    316:                                        }
                    317:                                        if(freopen(devname,"w",stdout) ==
                    318:                                                (FILE *)NULL)
                    319:                                        {
                    320:                                          fprintf(stderr,
                    321:                                            "%s: cannot open port for write - %s\n",
                    322:                                            myname,devname);
                    323:                                          usage();
                    324:                                        }
                    325:                                        if(freopen(devname,"r",stdin) ==
                    326:                                                (FILE *)NULL)
                    327:                                        {
                    328:                                          fprintf(stderr,
                    329:                                            "%s: cannot open port for read - %s\n",
                    330:                                            myname,devname);
                    331:                                          usage();
                    332:                                        }
                    333:                                        break;
                    334: 
                    335:                                case 'v':       /* display version */
                    336:                                        printf("%s: Version %s\n",myname,
                    337:                                                        VERSION);
                    338:                                        exit(0);
                    339:                                        break;
                    340: 
                    341:                                default:
                    342:                                        fprintf(stderr,
                    343:                                                "%s: %c - unknown flag\n",
                    344:                                                myname, *fptr); 
                    345:                                        usage();
                    346:                                        break;
                    347:                                }
                    348:                        }
                    349:                }
                    350:                else
                    351:                {
                    352:                                pt1file = *argv;
                    353:                                pt2file = *argv;
                    354:                }
                    355:                ++argv;
                    356:        }       
                    357: 
                    358:        signal (SIGALRM, bailout);
                    359:        toterm = 1;                     /* standard output              */
                    360:        fromterm = 0;                   /* standard input               */
                    361: 
                    362:        who = whoisit();                /* find out who is there        */
                    363: 
                    364:        if( who == INVRESP )    /* if an invalid or no response         */
                    365:            switch( fflag ) {   /* check for force wanted               */
                    366:                case '1':               /* if PT1 force wanted          */
                    367:                        who = PT1ROM;   /* force a PT1 download         */
                    368:                        break;
                    369: 
                    370:                case '2':               /* if PT2 force wanted          */
                    371:                        who = PT2ROM;   /* force a PT2 download         */
                    372:                        break;
                    373: 
                    374:                default: {              /* else no force                */
                    375:                        char *devwho;
                    376:                        devwho = ttyname(toterm); /* get name of port   */
                    377:                        if ((strcmp(devwho,"/dev/console") == 0) ||
                    378:                            (strcmp(devwho,"/dev/tty01") == 0)) {
                    379:                                printf(
                    380: "%s: from console or tty01, enter 'dlpt -f#'\n-f1 for PT1, -f2 for PT2\n", myname);
                    381:                                ttyrestore();
                    382:                                exit(0);
                    383:                        }
                    384:                        break;
                    385:                }
                    386:            }
                    387: 
                    388:        switch( who )           /* depending on who responded           */
                    389:        {
                    390:            case PT1RAM:                /* is a downloaded PT1 ( CT )   */
                    391:            case PT2RAM:                /* is a downloaded PT2          */
                    392:                ttytalk();
                    393:                printf("\r\nTerminal loaded\r\n");
                    394:                break;
                    395: 
                    396:            case PT1ROM:                /* is a non-downloaded PT1      */
                    397:                if((!aflag) || ((aflag) && (wantptload())))
                    398:                {
                    399:                        ttytalk();
                    400:                        putmsg(loading, 0);
                    401:                        dlpt1(pt1file);         /* load terminal        */
                    402: 
                    403:                        /************************************************
                    404:                         * NOTE: If terminal DTR is tied to CPU DCD     *
                    405:                         *   AND the terminal firmware re-initializes   *
                    406:                         *   the 8251 I/O chip, DCD is dropped which    *
                    407:                         *   causes this program to get killed at this  *
                    408:                         *   point.  This is the case for the PT        *
                    409:                         *   terminal as of 10/25/83.                   *
                    410:                         ************************************************/
                    411: 
                    412:                        sleep(3); /* wait for terminal to initialize    */
                    413:                        printf("Terminal download complete\r\n");
                    414:                }
                    415:                break;
                    416: 
                    417:            case PT2ROM:                /* is a non-downloaded PT2      */
                    418:                if((!aflag) || ((aflag) && (wantptload())))
                    419:                {
                    420:                        ttytalk();
                    421:                        putmsg(loading, 0);
                    422:                        dlpt2(pt2file);         /* load terminal        */
                    423:                        sleep(3); /* wait for terminal to initialize    */
                    424:                        printf("Terminal download complete\r\n");
                    425:                }
                    426:                break;
                    427: 
                    428:            default:
                    429:                break;
                    430:        }
                    431:        ttyrestore();
                    432: }
                    433: 
                    434: /************************************************************************
                    435:  *                                                                     *
                    436:  *     usage - print usage statement and abort                         *
                    437:  *                                                                     *
                    438:  ************************************************************************/
                    439: 
                    440: usage()
                    441: {
                    442:        fprintf(stderr,
                    443:        "Usage: %s [-a] [-fTermNo] [-r] [-b BaudRate] [-t ttyXX] [load file]\n",
                    444:                myname);
                    445:        exit(1);
                    446: }
                    447: 
                    448: 
                    449: /************************************************************************
                    450:  *                                                                     *
                    451:  *     PT down-load rtn                                                *
                    452:  *                                                                     *
                    453:  ************************************************************************/
                    454: dlpt1(hexfile)
                    455: 
                    456: char * hexfile;
                    457: 
                    458: {
                    459: 
                    460:        FILE *          in;             /* input file                   */
                    461:        int             i;              /* counter                      */
                    462:        int             rs;             /* record size                  */
                    463:        char            record [524];   /* record                       */
                    464:        int             cs;             /* checksum                     */
                    465:        char *          rp;             /* record pointer               */
                    466:        char            csum [2];       /* received checksum            */
                    467: 
                    468:        in = stdin;
                    469:        timout = 0;                     /* Alarm time-out flag          */
                    470: 
                    471:        if ((in = fopen (hexfile, "r")) == (FILE *)NULL)
                    472:                fatal ("Can't open input file.");
                    473: 
                    474:        ttyinit();      /* set up port for load                         */
                    475: 
                    476:        for (i = STX_TIMES ; i > 0 ; i--)
                    477:                if (write (toterm, stxrec, sizeof(stxrec)) != sizeof(stxrec))
                    478:                        fatal ("1. Can't write STX to terminal.");
                    479: 
                    480:        while ((rs = getrec1 (in, record)) > 0)
                    481:        {
                    482:            for (cs = 0, i = rs, rp = record ; i > 0 ; i--)
                    483:                cs += *rp++;
                    484: 
                    485:            for (i = NRETRIES ; i > 0 ; i--)
                    486:            {
                    487:                if (write (toterm, record, rs) != rs)
                    488:                                derror ("3. Can't write record to terminal.");
                    489: 
                    490:                if (write (toterm, nulls, nullcnt) != nullcnt)
                    491:                        derror ("4. Can't write NULLS to terminal.");
                    492: 
                    493:                if(rflag==TRUE)
                    494:                {
                    495:                        alarm(LD_TIMEOUT);  /*  time limit */
                    496:                        timout = 0;
                    497:                        if (timowrite (toterm, &ack, 1) != 1 || (timout))
                    498:                        {
                    499:                                derror ("6. Can't write ACK to terminal.");
                    500:                                continue;
                    501:                        }
                    502: 
                    503:                        alarm(LD_TIMEOUT);  /* time limit */
                    504:                        timout = 0;
                    505:                        if (timoread (fromterm, csum, 1) != 1 || (timout))
                    506:                        {
                    507:                                derror ("7. Can't read ACK from terminal.");
                    508:                                continue;
                    509:                        }
                    510: 
                    511:                        alarm(LD_TIMEOUT);  /* time limit */
                    512:                        timout = 0;
                    513:                        if (timoread (fromterm, csum + 1, 1) != 1 || (timout))
                    514:                        {
                    515:                                derror ("8. Can't read csum count from terminal.");
                    516:                                continue;
                    517:                        }
                    518: 
                    519:                        if (csum [0] != ACK)
                    520:                        {
                    521:                                derror ("9. Protocol violation not ACK.");
                    522:                                continue;
                    523:                        }
                    524: 
                    525:                        if (((cs & 0x3f)+0x20) == csum[1])
                    526:                                break;
                    527: 
                    528:                } /* end of reliabilaty logic */
                    529: 
                    530:                else
                    531:                        break;
                    532: 
                    533:            }   /* end of for loop */
                    534: 
                    535:                if (i == 0)
                    536:                        fatal ("10. Number of retries exceeded.");
                    537: 
                    538:                if (rs == 11)           /* Last record                  */
                    539:                        return;
                    540: 
                    541:        }
                    542: 
                    543:        if (rs == 0)
                    544:                fatal ("11. End of file reached before end-of-load record.");
                    545:        else
                    546:                fatal ("12. Bad record read.");
                    547: 
                    548:        }
                    549: 
                    550: /************************************************************************
                    551:  *                                                                     *
                    552:  * TITLE:      dlpt2 - down load CCI POWERTERMINAL II                  *
                    553:  *                                                                     *
                    554:  * RETURNS:    nothing                                                 *
                    555:  *                                                                     *
                    556:  ************************************************************************/
                    557: dlpt2( hexfile )
                    558: 
                    559: char   *hexfile;
                    560: 
                    561: {
                    562:        FILE *          in;             /* input file                   */
                    563:        int             i;              /* counter                      */
                    564:        int             rs;             /* record size                  */
                    565:        char            record [524];   /* record                       */
                    566: 
                    567:        in = stdin;
                    568:        timout = 0;                     /* Alarm time-out flag          */
                    569: 
                    570:        if ((in = fopen (hexfile, "r")) == (FILE *)NULL)
                    571:                fatal ("Can't open input file.");
                    572: 
                    573:        ttyinit();      /* set up port for load                         */
                    574: 
                    575:        ttyflush();     /* flush port before attempting com             */
                    576: 
                    577:        for (i = STX_TIMES ; i > 0 ; i--)
                    578:                if (write (toterm, stxrec, sizeof(stxrec)) != sizeof(stxrec))
                    579:                        fatal ("1. Can't write STX to terminal.");
                    580: 
                    581:        if( rflag == TRUE )     /* if rel mode wanted - tell PT2        */
                    582:        {
                    583:                if( write( toterm, &enq, 1 ) != 1 )
                    584:                {
                    585:                        d2error ("16. Can't write ENQ to terminal.");
                    586:                }
                    587:        }
                    588: 
                    589:        while( ( rs = getrec2(in, record) ) > 0 )
                    590:        {
                    591:            for( i = NRETRIES ; i > 0 ; i-- )
                    592:            {
                    593:                if( write ( toterm, record, rs ) != rs )
                    594:                                d2error ("3. Can't write record to terminal.");
                    595: 
                    596: /*
                    597:                if( write ( toterm, nulls, nullcnt ) != nullcnt )
                    598:                        d2error ("4. Can't write NULLS to terminal.");
                    599: */
                    600: 
                    601:                if( rflag == TRUE )
                    602:                {
                    603:                        char    resp;           /* resp char            */
                    604: 
                    605:                        alarm(LD_TIMEOUT);      /* time limit */
                    606:                        timout = 0;
                    607:                        if( (timoread( fromterm, &resp, 1 ) != 1 ) || (timout))
                    608:                        {
                    609:                                d2error ("17. Can't read ACK from terminal.");
                    610:                                continue;
                    611:                        }
                    612:                        if( resp == ACK )
                    613:                                break;          /* get txmit next char  */
                    614: 
                    615:                        d2error ("19. Protocol violation not ACK.");
                    616:                        continue;
                    617: 
                    618:                } /* end of reliabilaty logic   */
                    619: 
                    620:                else
                    621:                        break;          /* no verification wanted       */
                    622: 
                    623:            }   /* end of error retry loop      */
                    624: 
                    625:                if( i == 0 )
                    626:                        fatal ("20. Number of retries exceeded.");
                    627: 
                    628:                /* a complete record has been transmitted               */
                    629:                /* check if it was the last record                      */
                    630: 
                    631:                if( record[ 1 ] == '8' )        /* was it an S8 record? */
                    632:                        return;                 /* if so, done !!       */
                    633: 
                    634:        }
                    635: 
                    636:        if( rs == 0 )
                    637:                fatal ("21. End of file reached before end-of-load record.");
                    638:        else
                    639:                fatal ("22. Bad record read.");
                    640: 
                    641: }
                    642: 
                    643: /************************************************************************
                    644:  *                                                                     *
                    645:  *     derror - have an error handle and return                        *
                    646:  *                                                                     *
                    647:  ************************************************************************/
                    648: 
                    649: int
                    650: derror (s)
                    651: 
                    652: char *         s;
                    653: 
                    654: {
                    655: 
                    656:        alarm(0);       /* cancel alarms */
                    657:        write (toterm,&can,sizeof(can)); /* cancel */
                    658:        write (toterm,nulls,nullcnt); /* pad for next write */
                    659:        fputs(s, stderr);
                    660:        fputs("\r\n", stderr);
                    661:        return;
                    662: 
                    663: }
                    664: 
                    665: /************************************************************************
                    666:  *                                                                     *
                    667:  *     d2error - have an error handle and return                       *
                    668:  *                                                                     *
                    669:  ************************************************************************/
                    670: 
                    671: int
                    672: d2error (s)
                    673: 
                    674: char *s;
                    675: 
                    676: {
                    677:        alarm(0);       /* cancel alarms */
                    678:        fputs(s, stderr);
                    679:        fputs("\r\n", stderr);
                    680:        return;
                    681: }
                    682: 
                    683: /************************************************************************
                    684:  *                                                                     *
                    685:  *     getrec1 - Get a PT1 (CT) record to transmit.                    *
                    686:  *                                                                     *
                    687:  *     Returns:                                                        *
                    688:  *             -1      Error in file format.                           *
                    689:  *             0       End of file reached.                            *
                    690:  *             > 0     Size of record to transmit.                     *
                    691:  *                                                                     *
                    692:  ************************************************************************/
                    693: int
                    694: getrec1(fd, rp)
                    695: 
                    696: FILE *         fd;
                    697: char *         rp;
                    698: 
                    699: {
                    700: 
                    701:        int             c;
                    702:        int             nc;             /* number of characters         */
                    703:        int             l;              /* length of record bytes       */
                    704:        int             cc;             /* checksum                     */
                    705:        int             i;              /* counter                      */
                    706:        int             a;              /* address piece                */
                    707: 
                    708:        while ((c = getc (fd)) != ':')  /* Look for start of record     */
                    709:                if (c == EOF)
                    710:                        return 0;       /* End of file                  */
                    711: 
                    712:        /*****  Start record off.                                       */
                    713: 
                    714: /*%%%  printf("At record start\n");/*%%*/
                    715:        *rp++ = ':';
                    716:        nc = 1;
                    717: 
                    718:        /*****  Get number of hex bytes in record.                      */
                    719: 
                    720:        if ((l = getxb (fd, rp)) < 0)
                    721:                return -1;
                    722: 
                    723: /*%%%  printf("%d data bytes\n", l);/*%%*/
                    724:        cc = l;                         /* Start checksum               */
                    725:        rp += 2;                        /* Past two characters          */
                    726:        nc += 2;                        /* Two more characters          */
                    727: 
                    728:        /*****  Get address portion of data record.                     */
                    729: 
                    730:        for (i = 2 ; i > 0 ; i--)       /* Two hex bytes                */
                    731:                {
                    732:                if ((a = getxb (fd, rp)) < 0)
                    733:                        return -1;
                    734: 
                    735:                cc += a;                /* Figure address into checksum */
                    736:                rp += 2;                /* Past two characters          */
                    737:                nc += 2;                /* Two more characters          */
                    738:                }
                    739: 
                    740:        /*****  Read type byte, which should be zero.                   */
                    741: 
                    742:        if ((i = getxb (fd, rp)) != 0)
                    743:                return -1;
                    744: 
                    745:        cc += i;                        /* Figure type into checksum    */
                    746:        rp += 2;                        /* Past two characters          */
                    747:        nc += 2;                        /* Two more characters          */
                    748: 
                    749:        /*****  Read in the data record.                                */
                    750: 
                    751:        while (l-- > 0)                 /* Count down                   */
                    752:                {
                    753:                if ((i = getxb (fd, rp)) < 0)
                    754:                        return -1;
                    755: 
                    756: /*%%%  printf ("Read %d\n", i);/*%%*/
                    757:                cc += i;                /* Checksum                     */
                    758:                rp += 2;                /* Pointer                      */
                    759:                nc += 2;                /* Number of characters         */
                    760:                }
                    761: 
                    762:        cc = (-cc) & 0377;              /* Two's complement byte        */
                    763: 
                    764: /*%%%  printf ("Checksum = %x\n", cc);/*%%*/
                    765:        *rp = cc >> 4;
                    766:        *rp += *rp < 10 ? '0' : 'A' - 10;
                    767:        *++rp = cc & 0xF;
                    768:        *rp += *rp < 10 ? '0' : 'A' - 10;
                    769: 
                    770: /*%%%  printf ("record size = %d\n", nc + 2);/*%%*/
                    771:        return nc + 2;
                    772: 
                    773: }
                    774: 
                    775: /************************************************************************
                    776:  *                                                                     *
                    777:  * TITLE:      getrec2 - Get a POWERTERMINAL II record to transmit     *
                    778:  *                                                                     *
                    779:  * RETURNS:                                                            *
                    780:  *             -1      Error in file format.                           *
                    781:  *             0       End of file reached.                            *
                    782:  *             > 0     Size of record to transmit.                     *
                    783:  *                                                                     *
                    784:  ************************************************************************/
                    785: int
                    786: getrec2 (fd, rp)
                    787: 
                    788: FILE   *fd;
                    789: char   *rp;
                    790: 
                    791: {
                    792:        register char   *rrp;           /* register copy of record ptr  */
                    793:        char            c;              /* temp store of read char      */
                    794:        int             nc;             /* number of characters         */
                    795:        int             l;              /* length of record bytes       */
                    796: 
                    797:        rrp = rp;                       /* get addr in a register       */
                    798: 
                    799:        while(( c = getc( fd )) != 'S') /* Look for start of record     */
                    800:                if( c == EOF )
                    801:                        return( 0 );    /* End of file                  */
                    802: 
                    803:        *rrp++ = c ;                    /* put first char of record     */
                    804:        nc = 1;                         /* start the char counter       */
                    805: 
                    806:        if( ( *rrp++ = getc( fd ) ) < 0 )       /* get S-record type    */
                    807:                return( -1 );           /* if EOF, return               */
                    808:        nc++;                           /* incre num of chars           */
                    809: 
                    810:        if( ( l = getxb(fd, rrp) ) < 0) /* get num of bytes             */
                    811:                return -1;
                    812:        rrp += 2;                       /* Past two characters          */
                    813:        nc += 2;                        /* Two more characters          */
                    814: 
                    815:        /* get address, data, and checksum fields                       */
                    816: 
                    817:        l <<= 1 ;                       /* chg to num nibbles (times 2) */
                    818: 
                    819:        while( l-- > 0 ) {              /* l now contains num of nibbles*/
                    820:                if ( ( *rrp++ = getc( fd ) ) < 0)
                    821:                        return( -1 );
                    822:                nc++;                   /* bump char counter            */
                    823:        }
                    824: 
                    825:        return( nc );                   /* return num of chars in rec   */
                    826: 
                    827: }
                    828: 
                    829: /************************************************************************
                    830:  *                                                                     *
                    831:  *     getxb   - Get a hex byte.                                       *
                    832:  *                                                                     *
                    833:  *     Returns:                                                        *
                    834:  *             -1      Error in file format or end of file reached.    *
                    835:  *             >= 0    Integer value of byte.                          *
                    836:  *                                                                     *
                    837:  ************************************************************************/
                    838: 
                    839: int
                    840: getxb (fd, sp)
                    841: 
                    842: FILE *         fd;
                    843: char *         sp;
                    844: 
                    845: {
                    846: 
                    847:        register int    i, j;
                    848: 
                    849:        if ((i = getxn (fd, sp++)) < 0 || (j = getxn (fd, sp)) < 0)
                    850:                return -1;
                    851: 
                    852:        return (i << 4) | j;
                    853: 
                    854: }
                    855: 
                    856: /************************************************************************
                    857:  *                                                                     *
                    858:  *     getxn   - Get a hex nibble.                                     *
                    859:  *                                                                     *
                    860:  *     Returns:                                                        *
                    861:  *             -1      Error in file format or end of file reached.    *
                    862:  *             >= 0    Integer value of nibble.                        *
                    863:  *                                                                     *
                    864:  ************************************************************************/
                    865: 
                    866: int
                    867: getxn (fd, sp)
                    868: 
                    869: FILE *         fd;
                    870: char *         sp;
                    871: 
                    872: {
                    873: 
                    874:        register int    c;
                    875: 
                    876:        *sp = c = getc (fd);
                    877: 
                    878:        if (c >= '0' && c <= '9')
                    879:                return c - '0';
                    880:        else if (c >= 'A' && c <= 'F')
                    881:                return c - 'A' + 10;
                    882:        else if (c >= 'a' && c <= 'f')
                    883:                return c - 'a' + 10;
                    884: 
                    885:        return -1;
                    886: 
                    887: }
                    888: 
                    889: 
                    890: #ifdef NEWSIG          /* new signal mechanism */
                    891: 
                    892: /************************************************************************
                    893:  *                                                                     *
                    894:  *     timoread/timowrite - read/write with timeout                    *
                    895:  *                                                                     *
                    896:  ************************************************************************/
                    897: 
                    898: timoread(fd, ptr, size)
                    899:        char *ptr;
                    900: {
                    901:        if(setjmp(jb) == 0)
                    902:                return read(fd, ptr, size);
                    903:        return -1;
                    904: }
                    905: timowrite(fd, ptr, size)
                    906:        char *ptr;
                    907: {
                    908:        if(setjmp(jb) == 0)
                    909:                return write(fd, ptr, size);
                    910:        return -1;
                    911: }
                    912: #endif
                    913: 
                    914: 
                    915: /************************************************************************
                    916:  *                                                                     *
                    917:  *     fatal - display error message and abort                         *
                    918:  *                                                                     *
                    919:  ************************************************************************/
                    920: 
                    921: int
                    922: fatal (s)
                    923: 
                    924: char *         s;
                    925: 
                    926: {
                    927: 
                    928:        write(toterm,&can,sizeof(can)); /* write cancel to terminal */
                    929:        write(toterm,nulls,nullcnt);
                    930:        fputs(s, stderr);
                    931:        fputs("\r\n", stderr);
                    932:        ttyrestore();           /* put terminal back to orig state      */
                    933:        exit(1);
                    934: 
                    935: }
                    936: 
                    937: /************************************************************************
                    938:  *                                                                     *
                    939:  *     wantptload - inquire if the user wants a download               *
                    940:  *                                                                     *
                    941:  ************************************************************************/
                    942: 
                    943: #define        BUFSIZE         80      /* size of answer buffers               */
                    944: #define        WANT_WAIT       15      /* time to wait for answer              */
                    945: 
                    946: wantptload ()
                    947: {
                    948:        char    answer[BUFSIZE];
                    949: 
                    950:        ttytalk();              /* talk slow - do not lose chars    */
                    951:        while (1)
                    952:        {
                    953:                sleep(1);               /* allow time to prevent truncation */
                    954:                putmsg(intro, 0);       /* output msg, 0 pad null per line */
                    955:                alarm(WANT_WAIT);
                    956:                timout=0;
                    957:                *answer = '\0';
                    958:                timoread(0, answer, sizeof answer);
                    959:                if(timout)
                    960:                        return(TRUE);
                    961:                else
                    962:                {
                    963:                        alarm(0); /* reset the alarm */
                    964:                        switch (*answer)
                    965:                        {
                    966:                        case 'y':
                    967:                        case 'Y':
                    968:                        case '\n':
                    969:                                return(TRUE);
                    970: 
                    971:                        case 'n':
                    972:                        case 'N':
                    973:                                return(FALSE);
                    974: 
                    975:                        default:
                    976:                                putmsg(wrong, 0);
                    977:                        }
                    978:                }
                    979:        }
                    980: }
                    981: 
                    982: /************************************************************************
                    983:  *                                                                     *
                    984:  *     putmsg - put a msg to terminal with null padding at end of line *
                    985:  *                                                                     *
                    986:  ************************************************************************/
                    987: 
                    988: putmsg(text,pad)
                    989: char **text;   /* pointer to list of string pointers */
                    990: int    pad;    /* number of nulls to output after each line */
                    991: {
                    992:        while( *text != NULL )
                    993:        {
                    994:                register int i;
                    995:                char *ptr = *text;
                    996: 
                    997:                while( *ptr )
                    998:                {
                    999:                        putchar(*ptr++);
                   1000:                }
                   1001:                putchar('\n');
                   1002:                for( i = 0; i < pad; i++)
                   1003:                        putchar('\0');
                   1004:                text++;
                   1005:        }
                   1006: }
                   1007: 
                   1008: /************************************************************************
                   1009:  *                                                                     *
                   1010:  *     whoisit - Determine if the PT terminal is already downloaded    *
                   1011:  *                                                                     *
                   1012:  *             returns PT1ROM if ROM responds to DA command            *
                   1013:  *             returns PT1RAM if RAM responds to DA command            *
                   1014:  *             returns INVRESP if no or invalid response received      *
                   1015:  *                                                                     *
                   1016:  ************************************************************************/
                   1017: 
                   1018: #define DA "\033[c"            /* ANSI DA ESC seq to send to terminal  */
                   1019: 
                   1020: /* Note that in the following expected DA response sequences, only the
                   1021:        first 7 chars are used to match.  This allows for future
                   1022:        changes in the software version number without having to change
                   1023:        this program. (The PT ROM & RAM respond with version number(s)
                   1024:        in addition to the following characters.)                       
                   1025: */
                   1026: 
                   1027: #define RAM1RSP "\033[=0;1;" /* ANSI DA ESC response from PT (CT) RAM  */
                   1028: #define ROM1RSP "\033[=0;0;" /* ANSI DA ESC response from PT (CT) ROM  */
                   1029: #define RAM2RSP "\033[=1;1;" /* ANSI DA ESC response from PT2 RAM      */
                   1030: #define ROM2RSP "\033[=1;0;" /* ANSI DA ESC response from PT2 ROM      */
                   1031: #define DATERM 'c'          /* ANSI DA ESC sequence terminator         */
                   1032: 
                   1033: #define ASK_WAIT       3       /* time to wait for ESC response        */
                   1034: #define ASK_TIMES      3       /* number of times to send DA req block */
                   1035: #define MAX_WRONG_CHARS        30      /* max number of chars to wait for ESC  */
                   1036: 
                   1037: whoisit ()
                   1038: 
                   1039: {
                   1040:        char response[MAX_WRONG_CHARS+1];
                   1041:        int i,j;
                   1042: 
                   1043:        ttyinit();              /* make port raw for ESC sequence       */
                   1044: 
                   1045:        for( j=0 ; j < ASK_TIMES ; j++ )        /* allow retries */
                   1046:        {
                   1047:                ttyflush();     /* flush port before attempting com     */
                   1048: 
                   1049:                /* send DA cmd, is terminal loaded ?                    */
                   1050:                write (toterm,DA,sizeof(DA)-1);
                   1051: 
                   1052:                alarm(ASK_WAIT);
                   1053:                timout = 0;
                   1054:                response[0] = '\0';
                   1055: 
                   1056:                /* Synchronize on first character of expected response  */
                   1057: 
                   1058:                while (response[0] != *ROM1RSP)
                   1059:                {
                   1060:                        if(timoread(0,&response[0],sizeof(char)) != sizeof(char)) 
                   1061:                        {
                   1062:                                if(timout)
                   1063:                                        break;
                   1064:                                alarm(0);
                   1065:                                puts("\n\rDA ESC char read error\n\r");
                   1066:                                return(FALSE);
                   1067:                        }
                   1068:                }
                   1069: 
                   1070:                if(timout)      /* time-out here means no good response */
                   1071:                        continue;       /* try again                    */
                   1072: 
                   1073:                alarm(0);               /* make sure alarm is cleared   */
                   1074: 
                   1075:                /* At this point we have the first char of expected
                   1076:                   response.  Now get the rest of it.                   */
                   1077: 
                   1078:                for( i=1 ; ((response[i-1] != DATERM) &&
                   1079:                            (i < MAX_WRONG_CHARS-1))   ; i++ )
                   1080:                        {
                   1081:                        alarm(ASK_WAIT);
                   1082:                        timout=0;
                   1083:                        if(timoread(0,&response[i],sizeof(char)) != sizeof(char)) 
                   1084:                                {
                   1085:                                        if(timout)
                   1086:                                                break;
                   1087:                                        alarm(0);
                   1088:                                        puts("\n\rDA string read error\n\r");
                   1089:                                        return(FALSE);
                   1090:                                }
                   1091:                        alarm(0);       /* make sure alarm is cleared   */
                   1092:                        }
                   1093:                if(timout)      /* if time-out, did not get enough chars*/
                   1094:                        continue;       /* retry DA command             */
                   1095: 
                   1096:                /* At this point we have at least a matching first char
                   1097:                   in response.  Now compare the complete string read in
                   1098:                   with the expected response.                          */
                   1099: 
                   1100:                if(strncmp(ROM1RSP,response,sizeof(ROM1RSP)-1) == 0)
                   1101:                        return(PT1ROM);
                   1102:                if(strncmp(RAM1RSP,response,sizeof(RAM1RSP)-1) == 0)
                   1103:                        return(PT1RAM);
                   1104:                if(strncmp(ROM2RSP,response,sizeof(ROM2RSP)-1) == 0)
                   1105:                        return(PT2ROM);
                   1106:                if(strncmp(RAM2RSP,response,sizeof(RAM2RSP)-1) == 0)
                   1107:                        return(PT2RAM);
                   1108:        }
                   1109:        return(INVRESP);
                   1110: }
                   1111: 
                   1112: /************************************************************************
                   1113:  *                                                                     *
                   1114:  * atobaud - convert an ascii number to a baud rate ala B50, B1200, ...        *
                   1115:  *     returns -1 if invalid baud rate is specified.                   *
                   1116:  *                                                                     *
                   1117:  ************************************************************************/
                   1118: 
                   1119: struct baud {
                   1120:        char    *abaud;         /* name of baud rate */
                   1121:        char    ibaud;          /* baud rate for ioclt(2) */
                   1122: };
                   1123: 
                   1124: struct baud baudtbl[] = {
                   1125:        { "110",        B110    },
                   1126:        { "300",        B300    },
                   1127:        { "600",        B600    },
                   1128:        { "1200",       B1200   },
                   1129:        { "2400",       B2400   },
                   1130:        { "4800",       B4800   },
                   1131:        { "9600",       B9600   },
                   1132: #ifdef B19200
                   1133:        { "19200",      B19200  },
                   1134: #endif
                   1135:        { NULL,         0       }
                   1136: };
                   1137: 
                   1138: char
                   1139: atobaud(string)
                   1140: char   *string;
                   1141: {
                   1142:        struct baud *bptr = baudtbl;    /* index in baud rate table */
                   1143: 
                   1144:        while( bptr->abaud != NULL )
                   1145:        {
                   1146:                if( strcmp( bptr->abaud, string) == 0)
                   1147:                        {
                   1148:                        switch (atoi(string))
                   1149:                                {
                   1150:                                case 19200:     nullcnt=14;break;
                   1151:                                case  9600:     nullcnt= 9;break;
                   1152:                                case  4800:     nullcnt= 8;break;
                   1153:                                case  2400:     nullcnt= 6;break;
                   1154:                                case  1200:     nullcnt= 5;break;
                   1155:                                case   300:
                   1156:                                case   110:     nullcnt= 3;break;
                   1157:                                default:        nullcnt=14;break;
                   1158:                                }
                   1159:                        return( bptr->ibaud );
                   1160:                        }
                   1161:                ++bptr;
                   1162:        }
                   1163:        return( (char) -1 );
                   1164: }
                   1165: 
                   1166: /************************************************************************
                   1167:  *                                                                     *
                   1168:  *     bailout - alarm interrupt handler                               *
                   1169:  *                                                                     *
                   1170:  ************************************************************************/
                   1171: 
                   1172: 
                   1173: bailout ()
                   1174: {
                   1175: #ifdef NEWSIG  /* new signal mechanism */
                   1176:        timout = 1;
                   1177:        longjmp(jb, 1);
                   1178: #else
                   1179:        signal(SIGALRM,bailout);
                   1180:        timout = 1;
                   1181:        return;
                   1182: #endif
                   1183: }
                   1184: 
                   1185: /************************************************************************
                   1186:  *                                                                     *
                   1187:  *     tty utilities for performing get & put ioctl's                  *
                   1188:  *                                                                     *
                   1189:  ************************************************************************/
                   1190: 
                   1191: #define        IOC_DELAY 1     /* Delay is needed after ioctl to allow baud-
                   1192:                           rate change to take effect.  This requirement
                   1193:                           discovered on 2/21/84 when xmit of the DA
                   1194:                           seq would result in the first DA attempt to
                   1195:                           be sent at 9600 baud (irregardless of
                   1196:                           intended setting) and the second DA to go
                   1197:                           out at the intended (set by ioctl) rate.     */
                   1198: 
                   1199: #ifdef V7      /********* if Version 7 tty routines            *********/
                   1200: 
                   1201: struct sgttyb tp_new;
                   1202: struct sgttyb tp_orig;
                   1203: struct tchars tc_new = { '\177', '\034', '\021', '\023', '\004', '\377' };
                   1204: struct tchars tc_orig;
                   1205: 
                   1206: ttysave ()
                   1207: {
                   1208:        ioctl(0, TIOCGETP, &tp_orig);
                   1209:        ioctl(0, TIOCGETC, &tc_orig);
                   1210:        baudrate = tp_orig.sg_ospeed;
                   1211: }
                   1212: 
                   1213: ttyrestore ()
                   1214: {
                   1215:        ioctl(0, TIOCSETP, &tp_orig);
                   1216:        ioctl(0, TIOCSETC, &tc_orig);
                   1217:        sleep(IOC_DELAY);               /* allow baud to settle         */
                   1218: }
                   1219: 
                   1220: ttyinit ()
                   1221: {
                   1222:        /*
                   1223:         *      Use CBREAK mode for 'normal' download so that the Dow Jones
                   1224:         *      mux which generates XON/XOFF will be happy.  XON/XOFF appears
                   1225:         *      to screw up reliability mode, however, so stick with RAW
                   1226:         *      mode for that.
                   1227:         */
                   1228:        ttysetup((short) ANYP + ((rflag) ? RAW : CBREAK));
                   1229: }
                   1230: 
                   1231: ttytalk ()
                   1232: {
                   1233:        ttysetup((short)ANYP+ECHO+CRMOD);
                   1234: }
                   1235: 
                   1236: ttysetup (flags)
                   1237: short flags;
                   1238: {
                   1239: 
                   1240:        tp_new.sg_flags = flags;
                   1241:        tp_new.sg_ispeed = baudrate;
                   1242:        tp_new.sg_ospeed = baudrate;
                   1243:        tp_new.sg_stopbits = tp_orig.sg_stopbits;
                   1244:        ioctl(0, TIOCSETP, &tp_new);
                   1245:        ioctl(0, TIOCSETC, &tc_new);
                   1246:        sleep(IOC_DELAY);               /* allow baud to settle         */
                   1247: 
                   1248: }
                   1249: 
                   1250: ttyflush()
                   1251: {
                   1252:        ioctl(0,TIOCFLUSH,0);
                   1253: }
                   1254: 
                   1255: #else          /********* else assume System 3 tty routines    *********/
                   1256: 
                   1257: struct termio  term_orig;      /* save area for orig port state        */
                   1258: struct termio  term_new;       /* new port state                       */
                   1259: 
                   1260: int    count;          /* used for 19200 baud delay                    */
                   1261: 
                   1262: ttysave()
                   1263: {
                   1264:        ioctl(0, TCGETA, &term_orig);   /* save the initial port state  */
                   1265:        baudrate = term_orig.c_cflag & CBAUD;   /* get orig baud        */
                   1266: }
                   1267: 
                   1268: ttyrestore()
                   1269: {
                   1270:        ioctl(0, TCSETAF, &term_orig);  /* restore saved port state     */
                   1271:        sleep(IOC_DELAY);               /* allow baud to settle         */
                   1272: }
                   1273: 
                   1274: ttyinit()
                   1275: {
                   1276:        term_new.c_iflag = ICRNL|ISTRIP|IXON;
                   1277:        term_new.c_oflag = ONLRET|OPOST;
                   1278:        term_new.c_cflag = baudrate|CREAD|CS8;
                   1279:        term_new.c_lflag = 0;
                   1280:        term_new.c_line  = 0;
                   1281:        term_new.c_cc[VINTR]  = CINTR;
                   1282:        term_new.c_cc[VQUIT]  = CQUIT;
                   1283:        term_new.c_cc[VERASE] = 0x08;
                   1284:        term_new.c_cc[VKILL]  = CKILL;
                   1285:        term_new.c_cc[VMIN]   = 1;
                   1286:        term_new.c_cc[VTIME]  = 1;
                   1287: 
                   1288:        ioctl( 0, TCSETAF, &term_new );
                   1289:        sleep(IOC_DELAY);               /* allow baud to settle         */
                   1290: 
                   1291: }
                   1292: 
                   1293: ttytalk()
                   1294: {
                   1295:        term_new.c_iflag = ICRNL|IXON;
                   1296:        term_new.c_oflag = ONLCR|OPOST;
                   1297:        term_new.c_cflag = baudrate|CREAD|CS8;
                   1298:        term_new.c_lflag = ECHO|ECHOE|ECHOK|ICANON|ISIG;
                   1299: 
                   1300:        ioctl( 0, TCSETAF, &term_new );
                   1301:        sleep(IOC_DELAY);               /* allow baud to settle         */
                   1302: 
                   1303: }
                   1304: 
                   1305: ttyflush()
                   1306: {
                   1307:        ioctl( 0, TCFLSH, 2 );          /* flush input & output queues  */
                   1308: }
                   1309: 
                   1310: #endif         /********* end of System 3 tty routines         *********/
                   1311: 

unix.superglobalmegacorp.com

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