132185Sminshall void 232185Sminshall tn3270_init() 332185Sminshall { 432185Sminshall #if defined(TN3270) 532185Sminshall Sent3270TerminalType = 0; 632185Sminshall Ifrontp = Ibackp = Ibuf; 732185Sminshall init_ctlr(); /* Initialize some things */ 832185Sminshall init_keyboard(); 932185Sminshall init_screen(); 1032185Sminshall init_system(); 1132185Sminshall #endif /* defined(TN3270) */ 1232185Sminshall } 1332185Sminshall 1432185Sminshall #if defined(TN3270) 1532185Sminshall 1632185Sminshall /* 1732185Sminshall * DataToNetwork - queue up some data to go to network. If "done" is set, 1832185Sminshall * then when last byte is queued, we add on an IAC EOR sequence (so, 1932185Sminshall * don't call us with "done" until you want that done...) 2032185Sminshall * 2132185Sminshall * We actually do send all the data to the network buffer, since our 2232185Sminshall * only client needs for us to do that. 2332185Sminshall */ 2432185Sminshall 2532185Sminshall int 2632185Sminshall DataToNetwork(buffer, count, done) 2732185Sminshall register char *buffer; /* where the data is */ 2832185Sminshall register int count; /* how much to send */ 2932185Sminshall int done; /* is this the last of a logical block */ 3032185Sminshall { 3132185Sminshall register int c; 3232185Sminshall int origCount; 3332185Sminshall fd_set o; 3432185Sminshall 3532185Sminshall origCount = count; 3632185Sminshall FD_ZERO(&o); 3732185Sminshall 3832185Sminshall while (count) { 3932185Sminshall if ((netobuf+sizeof netobuf - nfrontp) < 6) { 4032185Sminshall netflush(); 4132185Sminshall while ((netobuf+sizeof netobuf - nfrontp) < 6) { 4232185Sminshall FD_SET(net, &o); 4332185Sminshall (void) select(net+1, (fd_set *) 0, &o, (fd_set *) 0, 4432185Sminshall (struct timeval *) 0); 4532185Sminshall netflush(); 4632185Sminshall } 4732185Sminshall } 4832185Sminshall c = *buffer++; 4932185Sminshall count--; 5032185Sminshall if (c == IAC) { 5132185Sminshall *nfrontp++ = IAC; 5232185Sminshall *nfrontp++ = IAC; 5332185Sminshall } else { 5432185Sminshall *nfrontp++ = c; 5532185Sminshall } 5632185Sminshall } 5732185Sminshall 5832185Sminshall if (done && !count) { 5932185Sminshall *nfrontp++ = IAC; 6032185Sminshall *nfrontp++ = EOR; 6132185Sminshall netflush(); /* try to move along as quickly as ... */ 6232185Sminshall } 6332185Sminshall return(origCount - count); 6432185Sminshall } 6532185Sminshall 6632185Sminshall 6732185Sminshall #if defined(unix) 6832185Sminshall static void 6932185Sminshall inputAvailable() 7032185Sminshall { 7132185Sminshall HaveInput = 1; 7232185Sminshall } 7332185Sminshall #endif /* defined(unix) */ 7432185Sminshall 7532185Sminshall void 7632185Sminshall outputPurge() 7732185Sminshall { 78*32257Sminshall ttyflush(1); 7932185Sminshall } 8032185Sminshall 8132185Sminshall 8232185Sminshall /* 8332185Sminshall * The following routines are places where the various tn3270 8432185Sminshall * routines make calls into telnet.c. 8532185Sminshall */ 8632185Sminshall 8732185Sminshall /* TtyChars() - returns the number of characters in the TTY buffer */ 8832185Sminshall TtyChars() 8932185Sminshall { 9032185Sminshall return(tfrontp-tbackp); 9132185Sminshall } 9232185Sminshall 9332185Sminshall /* DataToTerminal - queue up some data to go to terminal. */ 9432185Sminshall 9532185Sminshall int 9632185Sminshall DataToTerminal(buffer, count) 9732185Sminshall register char *buffer; /* where the data is */ 9832185Sminshall register int count; /* how much to send */ 9932185Sminshall { 10032185Sminshall int origCount; 10132185Sminshall #if defined(unix) 10232185Sminshall fd_set o; 10332185Sminshall 10432185Sminshall FD_ZERO(&o); 10532185Sminshall #endif /* defined(unix) */ 10632185Sminshall origCount = count; 10732185Sminshall 10832185Sminshall while (count) { 10932185Sminshall if (tfrontp >= ttyobuf+sizeof ttyobuf) { 110*32257Sminshall ttyflush(0); 11132185Sminshall while (tfrontp >= ttyobuf+sizeof ttyobuf) { 11232185Sminshall #if defined(unix) 11332185Sminshall FD_SET(tout, &o); 11432185Sminshall (void) select(tout+1, (fd_set *) 0, &o, (fd_set *) 0, 11532185Sminshall (struct timeval *) 0); 11632185Sminshall #endif /* defined(unix) */ 117*32257Sminshall ttyflush(0); 11832185Sminshall } 11932185Sminshall } 12032185Sminshall *tfrontp++ = *buffer++; 12132185Sminshall count--; 12232185Sminshall } 12332185Sminshall return(origCount - count); 12432185Sminshall } 12532185Sminshall 12632185Sminshall /* EmptyTerminal - called to make sure that the terminal buffer is empty. 12732185Sminshall * Note that we consider the buffer to run all the 12832185Sminshall * way to the kernel (thus the select). 12932185Sminshall */ 13032185Sminshall 13132185Sminshall void 13232185Sminshall EmptyTerminal() 13332185Sminshall { 13432185Sminshall #if defined(unix) 13532185Sminshall fd_set o; 13632185Sminshall 13732185Sminshall FD_ZERO(&o); 13832185Sminshall #endif /* defined(unix) */ 13932185Sminshall 14032185Sminshall if (tfrontp == tbackp) { 14132185Sminshall #if defined(unix) 14232185Sminshall FD_SET(tout, &o); 14332185Sminshall (void) select(tout+1, (int *) 0, &o, (int *) 0, 14432185Sminshall (struct timeval *) 0); /* wait for TTLOWAT */ 14532185Sminshall #endif /* defined(unix) */ 14632185Sminshall } else { 14732185Sminshall while (tfrontp != tbackp) { 148*32257Sminshall ttyflush(0); 14932185Sminshall #if defined(unix) 15032185Sminshall FD_SET(tout, &o); 15132185Sminshall (void) select(tout+1, (int *) 0, &o, (int *) 0, 15232185Sminshall (struct timeval *) 0); /* wait for TTLOWAT */ 15332185Sminshall #endif /* defined(unix) */ 15432185Sminshall } 15532185Sminshall } 15632185Sminshall } 15732185Sminshall 15832185Sminshall 15932185Sminshall /* 16032185Sminshall * Push3270 - Try to send data along the 3270 output (to screen) direction. 16132185Sminshall */ 16232185Sminshall 16332185Sminshall static int 16432185Sminshall Push3270() 16532185Sminshall { 16632185Sminshall int save = scc; 16732185Sminshall 16832185Sminshall if (scc) { 16932185Sminshall if (Ifrontp+scc > Ibuf+sizeof Ibuf) { 17032185Sminshall if (Ibackp != Ibuf) { 17132185Sminshall memcpy(Ibuf, Ibackp, Ifrontp-Ibackp); 17232185Sminshall Ifrontp -= (Ibackp-Ibuf); 17332185Sminshall Ibackp = Ibuf; 17432185Sminshall } 17532185Sminshall } 17632185Sminshall if (Ifrontp+scc < Ibuf+sizeof Ibuf) { 17732185Sminshall telrcv(); 17832185Sminshall } 17932185Sminshall } 18032185Sminshall return save != scc; 18132185Sminshall } 18232185Sminshall 18332185Sminshall 18432185Sminshall /* 18532185Sminshall * Finish3270 - get the last dregs of 3270 data out to the terminal 18632185Sminshall * before quitting. 18732185Sminshall */ 18832185Sminshall 18932185Sminshall static void 19032185Sminshall Finish3270() 19132185Sminshall { 19232185Sminshall while (Push3270() || !DoTerminalOutput()) { 19332185Sminshall #if defined(unix) 19432185Sminshall HaveInput = 0; 19532185Sminshall #endif /* defined(unix) */ 19632185Sminshall ; 19732185Sminshall } 19832185Sminshall } 19932185Sminshall 20032185Sminshall 20132185Sminshall /* StringToTerminal - output a null terminated string to the terminal */ 20232185Sminshall 20332185Sminshall void 20432185Sminshall StringToTerminal(s) 20532185Sminshall char *s; 20632185Sminshall { 20732185Sminshall int count; 20832185Sminshall 20932185Sminshall count = strlen(s); 21032185Sminshall if (count) { 21132185Sminshall (void) DataToTerminal(s, count); /* we know it always goes... */ 21232185Sminshall } 21332185Sminshall } 21432185Sminshall 21532185Sminshall 21632185Sminshall #if ((!defined(NOT43)) || defined(PUTCHAR)) 21732185Sminshall /* _putchar - output a single character to the terminal. This name is so that 21832185Sminshall * curses(3x) can call us to send out data. 21932185Sminshall */ 22032185Sminshall 22132185Sminshall void 22232185Sminshall _putchar(c) 22332185Sminshall char c; 22432185Sminshall { 22532185Sminshall if (tfrontp >= ttyobuf+sizeof ttyobuf) { 22632185Sminshall (void) DataToTerminal(&c, 1); 22732185Sminshall } else { 22832185Sminshall *tfrontp++ = c; /* optimize if possible. */ 22932185Sminshall } 23032185Sminshall } 23132185Sminshall #endif /* ((!defined(NOT43)) || defined(PUTCHAR)) */ 23232185Sminshall 23332185Sminshall #endif /* defined(TN3270) */ 234