Annotation of 43BSDReno/contrib/isode-beta/vt/vtd.c, revision 1.1.1.1

1.1       root        1: /* vtd.c - VT responder */
                      2: 
                      3: #ifndef        lint
                      4: static char *rcsid = "$Header: /f/osi/vt/RCS/vtd.c,v 7.2 90/07/09 14:52:06 mrose Exp $";
                      5: #endif
                      6: 
                      7: /* 
                      8:  * $Header: /f/osi/vt/RCS/vtd.c,v 7.2 90/07/09 14:52:06 mrose Exp $
                      9:  *
                     10:  *
                     11:  * $Log:       vtd.c,v $
                     12:  * Revision 7.2  90/07/09  14:52:06  mrose
                     13:  * sync
                     14:  * 
                     15:  * Revision 7.1  89/11/30  23:51:42  mrose
                     16:  * pa2str
                     17:  * 
                     18:  * Revision 7.0  89/11/23  22:31:55  mrose
                     19:  * Release 6.0
                     20:  * 
                     21:  */
                     22: 
                     23: /*
                     24:  *                               NOTICE
                     25:  *
                     26:  *    Acquisition, use, and distribution of this module and related
                     27:  *    materials are subject to the restrictions of a license agreement.
                     28:  *    Consult the Preface in the User's Manual for the full terms of
                     29:  *    this agreement.
                     30:  *
                     31:  */
                     32: 
                     33: 
                     34: #undef MAP_BACKSPACE   /*Map backspace character to VT ERASE CHAR*/
                     35: 
                     36: #include <signal.h>
                     37: #include "vtpm.h"
                     38: #include "sector1.h"
                     39: #include "tailor.h"
                     40: #include <sys/ioctl.h>
                     41: #ifdef BSD44
                     42: #include <sys/termios.h>
                     43: #include <sys/ttydefaults.h>
                     44: #endif
                     45: 
                     46: #ifndef _PATH_LOGIN
                     47: #ifndef BSD44
                     48: #define _PATH_LOGIN "/bin/login"
                     49: #else
                     50: #define _PATH_LOGIN "/usr/bin/login"
                     51: #endif
                     52: #endif
                     53: 
                     54: #include <arpa/telnet.h>
                     55: 
                     56: #include <ctype.h>
                     57: #include <setjmp.h>
                     58: #include <pwd.h>
                     59: #include <varargs.h>
                     60: 
                     61: #define        BELL    '\07'
                     62: #ifndef        SUNOS4
                     63: #define BANNER "\r\n\r\n4.2 BSD UNIX (%s)\r\n\r\n\r%s"
                     64: #else
                     65: #define BANNER "\r\n\r\nSunOS UNIX (%s)\r\n\r\n\r%s"
                     66: #endif
                     67: 
                     68: int    connected = FALSE;
                     69: char   command[256];
                     70: 
                     71: 
                     72: /*
                     73:  * I/O data buffers, pointers, and counters.
                     74:  */
                     75: char   ptyobuf[BUFSIZ], *pfrontp = ptyobuf, *pbackp = ptyobuf;
                     76: char   netobuf[BUFSIZ], *nfrontp = netobuf, *nbackp = netobuf;
                     77: int pcc;
                     78: 
                     79: VT_PROFILE vtp_profile;
                     80: int rflag = 0;
                     81: char erase_char;
                     82: char erase_line;
                     83: char intr_char;
                     84: char *crp = "\r";
                     85: char *my_displayobj = "D";     /*Acceptor's Display Object Name*/
                     86: char *my_echo_obj = "NA";      /*Acceptor's Negotiation Control Object Name*/
                     87: char *my_signal_obj = "DI";    /*Acceptor's Signal Control Object*/
                     88: char *his_echo_obj = "NI";     /*Initiator's Negotiation Control Object*/
                     89: char *his_signal_obj = "KB";   /*Initiator/s Signal control Object*/
                     90: int my_right = ACCEPTOR;
                     91: char kb_image;                 /*KB Control Object image*/
                     92: char di_image;                 /*DI Control Object Image*/
                     93: char ni_image;                 /*NI Control Object image*/
                     94: char na_image;                 /*NA Control Object image*/
                     95: char nego_state;               /*Current state of NA affected options*/
                     96: char sync_image;               /*SY Control Object image*/
                     97: char ga_image;
                     98: int transparent = 0;           /*Flag for Transparent repertoire*/
                     99: int telnet_profile =1;
                    100: int do_break = 1;              /*If VT-BREAK agreed to*/
                    101: int showoptions = 0;
                    102: int debug = 0;
                    103: 
                    104: #ifdef BSD44
                    105: struct termios oterm;
                    106: #else
                    107: struct tchars otc;
                    108: struct ltchars oltc;
                    109: struct sgttyb ottyb;
                    110: #endif
                    111: char *myhostname;
                    112: char peerhost[BUFSIZ];
                    113: struct PSAPaddr ts_bound;
                    114: struct passwd *pwd;
                    115: 
                    116: int    pty, net;
                    117: int    inter;
                    118: extern char **environ;
                    119: extern int errno;
                    120: char   line[] = "/dev/ptyp0";
                    121: char   *envinit[] = { "TERM=network", 0 };
                    122: SFD    cleanup();
                    123: static int do_cleaning = 0;
                    124: 
                    125: char   *myname;
                    126: LLog    _vt_log = {
                    127:     "vt.log", NULLCP, NULLCP,
                    128:     LLOG_FATAL | LLOG_EXCEPTIONS | LLOG_NOTICE, LLOG_FATAL, -1,
                    129:     LLOGCLS | LLOGCRT | LLOGZER, NOTOK
                    130:  
                    131: };
                    132: LLog   *vt_log = &_vt_log;
                    133: 
                    134: main(argc, argv)
                    135:        int     argc;
                    136:        char *argv[];
                    137: {
                    138:        int f = 0;
                    139:        char *cp = line;
                    140:        char *logname = NULLCP;
                    141:        int i, p, t;
                    142:        char   j;
                    143: #ifndef BSD44
                    144:        struct sgttyb b;
                    145: #endif
                    146: 
                    147:     if (myname = rindex (*argv, '/'))
                    148:        myname++;
                    149:     if (myname == NULL || *myname == NULL)
                    150:        myname = *argv;
                    151: 
                    152:     isodetailor (myname, 0);
                    153:     if (debug = isatty (fileno (stderr)))
                    154:        ll_dbinit (vt_log, myname);
                    155:     else
                    156:        ll_hdinit (vt_log, myname);
                    157: 
                    158:        for(i=1; i<(argc - 2); i++)
                    159:        {
                    160:                if (!strcmp(argv[i], "-d"))
                    161:                {
                    162:                        if (!isdigit(argv[++i][0])
                    163:                                || sscanf(argv[i], "%d", &debug) != 1)
                    164:                            adios (NULLCP, "usage: %s -d 0-7", myname);
                    165:                                                advise(LLOG_DEBUG,NULLCP, "setting debug level to %d", debug);
                    166:                        if (debug)
                    167:                            ll_dbinit (vt_log, myname);
                    168:                }
                    169:                else if(!strcmp(argv[i], "-F"))
                    170:                {
                    171:                        if ((logname = argv[++i]) == NULL || *logname == '-')
                    172:                            adios (NULLCP, "usage: %s -F logfile", myname);
                    173:                        vt_log -> ll_file = logname;
                    174:                        (void) ll_close (vt_log);
                    175:                        advise(LLOG_DEBUG,NULLCP, "logging to %s",logname);
                    176:                }
                    177:                else
                    178:                    adios(NULLCP, "usage: %s [-F logfile] [-d N]",
                    179:                          myname);
                    180:        }
                    181: 
                    182:     advise (LLOG_NOTICE,NULLCP,  "starting");
                    183: 
                    184:        acc = &accs;
                    185:        acr = &acrs;
                    186:        aci = &acis;
                    187:        acs = &acss;
                    188: 
                    189:        if (ass_ind(argc,argv) == OK) {
                    190:                connected = TRUE;
                    191:                if( !strcmp(vtp_profile.profile_name,"default") )
                    192:                        telnet_profile = 0;
                    193:        }
                    194:        else
                    195:                exit(1);
                    196: #ifdef BSD44
                    197:        na_image = 0;
                    198:        nego_state = 0;                 /*Start off in Local echo*/
                    199:        i = forkpty(&p, line, NULL, NULL);
                    200:        if (i == -1) {
                    201:                perror("vtd -- forkpty");
                    202:                vrelreq();
                    203:                /*NOTREACHED*/
                    204:        }
                    205:        if (i) {
                    206:                 vtd(sd, p);
                    207:                 /*NOTREACHED*/
                    208:        }
                    209: #else
                    210: /*
                    211:  * Get a pty, scan input lines.
                    212:  */
                    213:         for (j = 'p' ; j <= 't'; j++) {
                    214:            cp[strlen ("/dev/pty")] = j;
                    215:            for (i = 0; i < 16; i++) {
                    216:                cp[strlen("/dev/ptyp")] = "0123456789abcdef"[i];
                    217:                p = open(cp, 2);
                    218:                if (p >= 0)
                    219:                    goto gotpty;
                    220:            }
                    221:        }
                    222:        perror("All network ports in use");
                    223:        vrelreq();
                    224:        /*NOTREACHED*/
                    225: gotpty:
                    226: 
                    227:        cp[strlen("/dev/")] = 't';
                    228:        t = open("/dev/tty", 2);
                    229:        if (t >= 0) {
                    230:                if (ioctl(t, TIOCNOTTY, 0) == -1) {
                    231:                        perror("ioctl (TIOCNOTTY)");
                    232:                }
                    233:                (void)close(t);
                    234:        }
                    235:        t = open(cp, 2);
                    236:        if (t < 0)
                    237:                fatalperror(f, cp, errno);
                    238:        if (ioctl(t, TIOCGETP, (char*)&b) == -1) {
                    239:                perror("ioctl (TIOCGETP)");
                    240:                adios(NULLCP, "ioctl failed (TIOCGETP)");
                    241:        }
                    242:        b.sg_flags = CRMOD|XTABS|ANYP;
                    243:        if (ioctl(t, TIOCSETP, (char*)&b) == -1) {
                    244:                perror("ioctl (TIOCSETP)");
                    245:                adios(NULLCP, "ioctl failed (TIOCSETP)");
                    246:        }
                    247:        if (ioctl(p, TIOCGETP, (char*)&b) == -1) {      /* XXX why is this done on the controller */
                    248:                perror("ioctl (TIOCGETP)");
                    249:                adios(NULLCP, "ioctl failed (TIOCGETP)");
                    250:        }
                    251:        if (telnet_profile)
                    252:                b.sg_flags &= ~ECHO;
                    253:        else
                    254:                b.sg_flags |= ECHO;     /*Remote echo for Default*/
                    255:        if (ioctl(p, TIOCSETP, (char*)&b) == -1) {
                    256:                perror("ioctl (TIOCSETP)");
                    257:                adios(NULLCP, "ioctl failed (TIOCSETP)");
                    258:        }
                    259:        na_image = 0;
                    260:        nego_state = 0;                 /*Start off in Local echo*/
                    261: 
                    262:        if ((i = fork()) < 0)
                    263:                fatalperror(f, "fork", errno);
                    264:        if (i)
                    265:                 vtd(sd, p);
                    266:        (void)close(sd);
                    267:        (void)close(p);
                    268:        if (dup2(t, 0) == -1) {
                    269:                perror("dup2");
                    270:                adios(NULLCP, "dup2 failed");
                    271:        }
                    272:        if (dup2(t, 1) == -1) {
                    273:                perror("dup2");
                    274:                adios(NULLCP, "dup2 failed");
                    275:        }
                    276:        if (dup2(t, 2) == -1) {
                    277:                perror("dup2");
                    278:                adios(NULLCP, "dup2 failed");
                    279:        }
                    280:        (void)close(t);
                    281: #endif
                    282:        environ = envinit;
                    283: 
                    284:        execl(_PATH_LOGIN,"login","-h",peerhost,NULLCP);
                    285:        fatalperror(f, _PATH_LOGIN, errno);
                    286:        /*NOTREACHED*/
                    287: }
                    288: 
                    289: fatal(f, msg)
                    290:        int f;
                    291:        char *msg;
                    292: {
                    293:        char buf[BUFSIZ];
                    294: 
                    295:        (void) sprintf(buf, "%s: %s.\n", myname, msg);
                    296:        (void) write(f, buf, strlen(buf));
                    297:        adios (NULLCP, msg);
                    298: }
                    299: 
                    300: fatalperror(f, msg, errnum)
                    301:        int f;
                    302:        char *msg;
                    303:        int errnum;
                    304: {
                    305:        char buf[BUFSIZ];
                    306:        extern char *sys_errlist[];
                    307: 
                    308:        (void) sprintf(buf, "%s: %s", msg, sys_errlist[errnum]);
                    309:        fatal(f, buf);
                    310: }
                    311: 
                    312: /*
                    313:  * Main loop.  Select from pty and network.
                    314:  */
                    315: 
                    316: vtd(f, p)
                    317: {
                    318:        int on = 1;
                    319:        int     nfds, result;
                    320: 
                    321:        do_cleaning = 1;
                    322:        net = f, pty = p;
                    323:        nfds = (f > p ? f : p) + 1;
                    324: 
                    325:        if (ioctl(p, FIONBIO, (char*)&on) == -1) {
                    326:                perror("ioctl");
                    327:                adios(NULLCP, "ioctl failed (FIONBIO)");
                    328:        }
                    329: #ifdef SIGTSTP
                    330:        (void) signal(SIGTSTP, SIG_IGN);
                    331: #endif
                    332: #ifdef SIGCHLD
                    333:        (void) signal(SIGCHLD, cleanup);
                    334: #endif
                    335:        /*
                    336:         * Show banner that getty never gave.
                    337:         */
                    338:        myhostname = PLocalHostName ();
                    339:        (void) sprintf(nfrontp, BANNER, myhostname, "");
                    340:        nfrontp += strlen(nfrontp);
                    341: 
                    342: #ifdef BSD44
                    343:        if (tcgetattr(pty, &oterm) == -1) {
                    344:                perror("tcgetattr");
                    345:                adios(NULLCP, "tcgetattr failed");
                    346:        }
                    347:        if (telnet_profile) {
                    348:                oterm.c_lflag &= ~ECHO;
                    349:                if (tcsetattr(pty, TCSADRAIN, &oterm) == -1) {
                    350:                        perror("tcgetattr");
                    351:                        adios(NULLCP, "tcgetattr failed");
                    352:                }
                    353:        }
                    354:        erase_char = oterm.c_cc[VERASE];
                    355:        erase_line = oterm.c_cc[VKILL];
                    356:        intr_char = oterm.c_cc[VINTR];
                    357: #else
                    358:        if (ioctl(pty,TIOCGETP,(char*)&ottyb) == -1) {
                    359:                perror("ioctl");
                    360:                adios(NULLCP, "ioctl failed (TIOCGETP)");
                    361:        }
                    362:        if (ioctl(pty,TIOCGETC,(char*)&otc) == -1) {
                    363:                perror("ioctl");
                    364:                adios(NULLCP, "ioctl failed (TIOCGETC)");
                    365:        }
                    366:        if (ioctl(pty,TIOCGLTC,(char*)&oltc) == -1) {
                    367:                perror("ioctl");
                    368:                adios(NULLCP, "ioctl failed (TIOCGLTC)");
                    369:        }
                    370:        erase_char = ottyb.sg_erase;
                    371:        erase_line = ottyb.sg_kill;
                    372:        intr_char = otc.t_intrc;
                    373: #endif
                    374: 
                    375: 
                    376:        for (;;) {
                    377:                fd_set    ibits, obits;
                    378:                register int c;
                    379: 
                    380:                FD_ZERO (&ibits);
                    381:                FD_ZERO (&obits);
                    382:                /*
                    383:                 * Never look for input if there's still
                    384:                 * stuff in the corresponding output buffer
                    385:                 */
                    386:                if (nfrontp - nbackp) {
                    387:                    FD_SET (f, &obits);
                    388:                }
                    389:                else {
                    390:                    FD_SET (p, &ibits);
                    391:                }
                    392:                if (pfrontp - pbackp) {
                    393:                    FD_SET (p, &obits);
                    394:                }
                    395:                else {
                    396:                    FD_SET (f, &ibits);
                    397:                }
                    398:                if (FD_ISSET (f, &ibits) && data_pending()) {
                    399:                        FD_CLR (f, &ibits);
                    400: 
                    401:                        result = xselect(nfds, &ibits, &obits,
                    402:                                         (fd_set *)NULL, OK);
                    403: 
                    404:                        if (result < 0)
                    405:                                adios("failed", "xselect");
                    406:                        FD_SET (f, &ibits);
                    407:                }
                    408:                else {
                    409:                        if (xselect(nfds, &ibits, &obits, (fd_set *)NULL,
                    410:                                    NOTOK) == -1)
                    411:                            adios("failed", "xselect");
                    412:                }
                    413:                if (!FD_ISSET (f, &ibits)
                    414:                        && !FD_ISSET (p, &ibits)
                    415:                        && !FD_ISSET (f, &obits)
                    416:                        && !FD_ISSET (p, &obits)) {
                    417:                        sleep(5);
                    418:                        continue;
                    419:                }
                    420: 
                    421:                /*
                    422:                 * Something to read from the network...
                    423:                 */
                    424:                if (FD_ISSET (f, &ibits)) {
                    425:                        while ((c = getch()) > 0) 
                    426:                                *pfrontp++ = c;
                    427:                }
                    428:                if (c == E_EOF) {
                    429:                        break;
                    430:                }
                    431: 
                    432:                /*
                    433:                 * Something to read from the pty...
                    434:                 */
                    435:                if (FD_ISSET (p, &ibits)) {
                    436:                        pcc = read(p, nfrontp, (&netobuf[BUFSIZ] - nfrontp));
                    437: 
                    438:                        if (pcc < 0 && errno == EWOULDBLOCK)
                    439:                                pcc = 0;
                    440:                        else {
                    441:                                if (pcc <= 0) {
                    442:                                        if (debug)
                    443:                                            advise(LLOG_EXCEPTIONS,NULLCP,
                    444:                                                   "problem reading from pty");
                    445:                                        break;
                    446:                                }
                    447:                        }
                    448:                        nfrontp += pcc;
                    449:                }
                    450: 
                    451:                if (FD_ISSET (f, &obits) && (nfrontp - nbackp) > 0)
                    452:                        netflush();
                    453: 
                    454:                if (FD_ISSET (p, &obits) && (pfrontp - pbackp) > 0)
                    455:                        ptyflush();
                    456:        }
                    457:        if (debug)
                    458:                advise(LLOG_DEBUG,NULLCP,  "finished loop in vtp");
                    459:        cleanup();
                    460: }
                    461: 
                    462: /*
                    463:  * Send interrupt to process on other side of pty.
                    464:  * If it is in raw mode, just write NULL;
                    465:  * otherwise, write intr char.
                    466:  */
                    467: interrupt()
                    468: {
                    469: #ifdef BSD44
                    470:        struct termios term;
                    471: 
                    472:        ptyflush();
                    473:        if (tcgetattr(pty, &term) == -1) {
                    474:                perror("tcgetattr");
                    475:                return;
                    476:        }
                    477:        if ((term.c_lflag&ISIG) && term.c_cc[VINTR] != _POSIX_VDISABLE)
                    478:                *pfrontp++ = term.c_cc[VINTR];
                    479:        else
                    480:                *pfrontp++ = '\0';
                    481: #else
                    482:        struct sgttyb b;
                    483:        struct tchars tchars;
                    484: 
                    485:        ptyflush();     /* half-hearted */
                    486:        if (ioctl(pty, TIOCGETP, (char*)&b) == -1) {
                    487:                perror("ioctl");
                    488:                adios(NULLCP, "ioctl failed");
                    489:        }
                    490:        if (b.sg_flags & RAW) {
                    491:                *pfrontp++ = '\0';
                    492:                return;
                    493:        }
                    494:        *pfrontp++ = ioctl(pty, TIOCGETC, (char*)&tchars) < 0 ?
                    495:                '\177' : tchars.t_intrc;
                    496: #endif
                    497: }
                    498: 
                    499: netflush()
                    500: {
                    501:        register char *cp;
                    502:        int n;
                    503:        int i, j;
                    504:        int nl_flag;    /*Records if Newline is included in current PDU to
                    505:                          decide if Deliver Request should follow it.  Should
                    506:                          not be required but some implementations may wait
                    507:                          for it before delivering NDQ to application*/
                    508: 
                    509:        nl_flag = 0;
                    510:        if ((n = nfrontp - nbackp) > 0) {
                    511: 
                    512:                if (debug) {
                    513:                        (void) ll_log (vt_log, LLOG_DEBUG, NULLCP,
                    514:                                ("writing to the net"));
                    515:                        (void) ll_printf (vt_log, "<<");
                    516:                        for(i=0; i<(nfrontp-nbackp); i++)
                    517:                            (void)ll_printf (vt_log, "%02x ",*(nbackp+i));
                    518:                        (void)ll_printf (vt_log,  ">>\n");
                    519:                        (void)ll_sync (vt_log);
                    520:                }
                    521:                if(transparent)
                    522:                {
                    523:                        (void)vt_text(nbackp,n);
                    524:                        vtsend();
                    525:                        cp = nbackp;
                    526:                        for(i=0; i<n; i++)
                    527:                        {
                    528:                                if((*cp == '\r') ||
                    529:                                   (*cp == '\n'))
                    530:                                {
                    531:                                        vdelreq(FALSE);
                    532:                                        break;
                    533:                                }
                    534:                                ++cp;
                    535:                        }
                    536:                        nbackp += n;
                    537:                }
                    538:                else
                    539:                {
                    540:                    cp = nbackp;
                    541:                    for(i=0,j=0; i<n; i++)
                    542:                    {
                    543:                        if(*cp == '\r')
                    544:                        {
                    545:                            if(rflag) (void)vt_text(crp,1);
                    546:                                /*Previous char was CR so put one in NDQ*/
                    547:                            if(j) 
                    548:                                        (void)vt_text(nbackp,j);
                    549:                            nbackp += (j+1); /*Skip over current CR*/
                    550:                            cp = nbackp;
                    551:                            j = 0;
                    552:                            if(i == (n-1) ) (void)vt_text(crp,1);
                    553:                                /*If CR is last char in buffer, send it*/
                    554:                            else rflag = 1;
                    555:                                /*If not last char in buffer, read next one*/
                    556:                            continue;
                    557:                        }
                    558:                        else if(rflag) /*If previous character was CR*/
                    559:                        {
                    560:                            if(*cp == '\n') /*Got CR-LF -- map to Next X-Array*/
                    561:                            {
                    562:                                nbackp += (j+1);
                    563:                                cp = nbackp;
                    564:                                rflag = 0;
                    565:                                vt_newline();
                    566:                                ++nl_flag;
                    567:                                continue;
                    568:                            }
                    569:                            else /*Preceeding char was CR but not followed by
                    570:                                   LF.  Put CR in buffer*/
                    571:                                (void) vt_text(crp,1);
                    572:                            rflag = 0;
                    573:                        } 
                    574:                        if(telnet_profile)
                    575:                        {
                    576:                            rflag = 0;
                    577: #ifdef MAP_BACKSPACE
                    578:                            if(*cp == 0x08) /*If believed to be erase*/
                    579:                            {
                    580:                                    if(j) 
                    581:                                                (void)vt_text(nbackp,j);
                    582:                                    nbackp += (j+1);
                    583:                                    cp = nbackp;
                    584:                                    j = 0;
                    585:                                    vt_char_erase();
                    586:                                    continue;
                    587:                            }
                    588: #endif
                    589:                            if(!vtp_profile.arg_val.tel_arg_list.full_ascii)
                    590:                                        /*If ASCII GO, dump ctrl chars*/
                    591:                            {
                    592:                                if((*cp < 0x20) || (*cp > 0x7e))
                    593:                                {
                    594:                                    if(j) 
                    595:                                                (void)vt_text(nbackp,j);
                    596:                                    nbackp += (j+1);
                    597:                                    cp = nbackp;
                    598:                                    j = 0;
                    599:                                }
                    600:                                else
                    601:                                {
                    602:                                    ++j; ++cp;
                    603:                                }
                    604:                            }
                    605:                            else 
                    606:                            {
                    607:                                ++j;
                    608:                                ++cp;
                    609:                            }
                    610:                        }
                    611:                        else            /*Else Default Profile*/
                    612:                        {
                    613:                            if((*cp < 0x20) || (*cp > 0x7e))
                    614:                            {
                    615:                                if(j) 
                    616:                                        (void)vt_text(nbackp,j);
                    617:                                nbackp += (j+1);
                    618:                                cp = nbackp;
                    619:                                j = 0;
                    620:                            }
                    621:                            else 
                    622:                            {
                    623:                                ++j;
                    624:                                ++cp;
                    625:                            }
                    626:                        }
                    627:                    }           /*End for loop*/
                    628:                    if(j) 
                    629:                                (void)vt_text(nbackp,j); /*Load anything left if CR or LF
                    630:                                                wasn't last char in buffer*/
                    631:                    nbackp += j;
                    632:                    vtsend();   /*Send the whole NDQ*/
                    633:                    if(nl_flag && telnet_profile) vdelreq(FALSE);
                    634:                }
                    635:        }
                    636:        if (n < 0) {
                    637:                if (errno != ENOBUFS && errno != EWOULDBLOCK) {
                    638:                        adios("closed", "association");
                    639:                        /*NOTREACHED*/
                    640:                }
                    641:                n = 0;
                    642:        }
                    643:        if (nbackp == nfrontp)
                    644:                nbackp = nfrontp = netobuf;
                    645: }
                    646: 
                    647: SFD    cleanup()
                    648: {
                    649:        sleep(1);
                    650:        while(getch() > 0);     /*Clean out unread VT-DATA PDU's still held
                    651:                                  in network.  Kludge to overcome deficiency
                    652:                                  in Session Release. */
                    653:        rmut();
                    654: #ifndef BSD44
                    655:        vhangup();
                    656: #endif
                    657:        vrelreq();
                    658:        (void)kill(0, SIGKILL);
                    659:        exit(1);
                    660: }
                    661: 
                    662: #include <utmp.h>
                    663: 
                    664: struct utmp wtmp;
                    665: char   wtmpf[] = "/usr/adm/wtmp";
                    666: char   utmp[] = "/etc/utmp";
                    667: #define SCPYN(a, b)    strncpy(a, b, sizeof (a))
                    668: #define SCMPN(a, b)    strncmp(a, b, sizeof (a))
                    669: 
                    670: long   lseek (), time ();
                    671: 
                    672: rmut()
                    673: {
                    674:        register f;
                    675:        int found = 0;
                    676: 
                    677:        f = open(utmp, 2);
                    678:        if (f >= 0) {
                    679:                while(read(f, (char *)&wtmp, sizeof (wtmp)) == sizeof (wtmp)) {
                    680:                        if (SCMPN(wtmp.ut_line, line+5) || wtmp.ut_name[0]==0)
                    681:                                continue;
                    682:                        (void)lseek(f, -(long)sizeof (wtmp), 1);
                    683:                        (void)SCPYN(wtmp.ut_name, "");
                    684: #if    !defined(SYS5) && !defined(bsd43_ut_host)
                    685:                        (void)SCPYN(wtmp.ut_host, "");
                    686: #endif
                    687:                        (void)time(&wtmp.ut_time);
                    688:                        (void) write(f, (char *)&wtmp, sizeof (wtmp));
                    689:                        found++;
                    690:                }
                    691:                (void)close(f);
                    692:        }
                    693:        if (found) {
                    694:                f = open(wtmpf, 1);
                    695:                if (f >= 0) {
                    696:                        (void)SCPYN(wtmp.ut_line, line+5);
                    697:                        (void)SCPYN(wtmp.ut_name, "");
                    698: #if    !defined(SYS5) && !defined(bsd43_ut_host)
                    699:                        (void)SCPYN(wtmp.ut_host, "");
                    700: #endif
                    701:                        (void)time(&wtmp.ut_time);
                    702:                        (void)lseek(f, (long)0, 2);
                    703:                        (void) write(f, (char *)&wtmp, sizeof (wtmp));
                    704:                        (void)close(f);
                    705:                }
                    706:        }
                    707:        (void)chmod(line, 0666);
                    708:        (void)chown(line, 0, 0);
                    709:        line[strlen("/dev/")] = 'p';
                    710:        (void)chmod(line, 0666);
                    711:        (void)chown(line, 0, 0);
                    712: }
                    713: 
                    714: bye()
                    715: {
                    716:     if(do_cleaning) {
                    717:        rmut();
                    718:        (void)kill(0, SIGKILL);
                    719:     }
                    720:     exit(0);
                    721: }
                    722:        
                    723: flushbufs()
                    724: {
                    725:        pcc = 0;
                    726:        pfrontp = pbackp = ptyobuf;
                    727:        nfrontp = nbackp = netobuf;
                    728:        while (getch() > 0)
                    729:            continue;
                    730: }
                    731: 
                    732: /*    ERRORS */
                    733: 
                    734: void   finalbye ()
                    735: {
                    736:     bye ();
                    737: }
                    738: 
                    739: 
                    740: #ifndef        lint
                    741: void   adios (va_alist)
                    742: va_dcl
                    743: {
                    744:     va_list ap;
                    745: 
                    746:     va_start (ap);
                    747: 
                    748:     (void) _ll_log (vt_log, LLOG_FATAL, ap);
                    749: 
                    750:     va_end (ap);
                    751: 
                    752:     bye ();
                    753: 
                    754:     _exit (1);
                    755: }
                    756: #else
                    757: /* VARARGS2 */
                    758: 
                    759: void   adios (what, fmt)
                    760: char   *what,
                    761:        *fmt;
                    762: {
                    763:     adios (what, fmt);
                    764: }
                    765: #endif
                    766: 
                    767: 
                    768: #ifndef        lint
                    769: void   advise (va_alist)
                    770: va_dcl
                    771: {
                    772:     int            code;
                    773:     va_list ap;
                    774: 
                    775:     va_start (ap);
                    776: 
                    777:     code = va_arg (ap, int);
                    778: 
                    779:     (void) _ll_log (vt_log, code, ap);
                    780: 
                    781:     va_end (ap);
                    782: }
                    783: #else
                    784: /* VARARGS3 */
                    785: 
                    786: void   advise (code, what, fmt)
                    787: int    code;
                    788: char   *what,
                    789:        *fmt;
                    790: {
                    791:     advise (code, what, fmt);
                    792: }
                    793: #endif
                    794: 
                    795: ptyflush()
                    796: {
                    797:        int n;
                    798: 
                    799:        if ((n = pfrontp - pbackp) > 0)
                    800:        {
                    801:                n = write(pty, pbackp, n);
                    802:        }
                    803:        if (n < 0)
                    804:                return;
                    805:        pbackp += n;
                    806:        if (pbackp == pfrontp)
                    807:                pbackp = pfrontp = ptyobuf;
                    808: }
                    809: 
                    810: #ifdef BSD44
                    811: ptyecho(on)
                    812: {
                    813:        struct termios term;
                    814: 
                    815:        ptyflush();
                    816:        if (tcgetattr(pty, &term) == -1) {
                    817:                perror("tcgetattr");
                    818:                return;
                    819:        }
                    820:        if (on)
                    821:                term.c_lflag |= ECHO;
                    822:        else
                    823:                term.c_lflag &= ECHO;
                    824:        if (tcsetattr(pty, TCSAFLUSH, &term) == -1) {
                    825:                perror("tcsetattr");
                    826:                return;
                    827:        }
                    828: }
                    829: #else
                    830: setmode(on, off)
                    831:        int on, off;
                    832: {
                    833:        struct sgttyb b;
                    834: 
                    835:        ptyflush();
                    836:        if(ioctl(pty, TIOCGETP, (char*)&b) < 0) {
                    837:                perror("ioctl");
                    838:                adios(NULLCP, "ioctl failed");
                    839:        }
                    840:        b.sg_flags |= on;
                    841:        b.sg_flags &= ~off;
                    842:        if (ioctl(pty, TIOCSETP, (char*)&b) == -1) {
                    843:                perror("ioctl");
                    844:                adios(NULLCP, "ioctl failed");
                    845:        }
                    846: }
                    847: #endif

unix.superglobalmegacorp.com

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