1*32185Sminshall void 2*32185Sminshall tn3270_init() 3*32185Sminshall { 4*32185Sminshall #if defined(TN3270) 5*32185Sminshall Sent3270TerminalType = 0; 6*32185Sminshall Ifrontp = Ibackp = Ibuf; 7*32185Sminshall init_ctlr(); /* Initialize some things */ 8*32185Sminshall init_keyboard(); 9*32185Sminshall init_screen(); 10*32185Sminshall init_system(); 11*32185Sminshall #endif /* defined(TN3270) */ 12*32185Sminshall } 13*32185Sminshall 14*32185Sminshall #if defined(TN3270) 15*32185Sminshall 16*32185Sminshall /* 17*32185Sminshall * DataToNetwork - queue up some data to go to network. If "done" is set, 18*32185Sminshall * then when last byte is queued, we add on an IAC EOR sequence (so, 19*32185Sminshall * don't call us with "done" until you want that done...) 20*32185Sminshall * 21*32185Sminshall * We actually do send all the data to the network buffer, since our 22*32185Sminshall * only client needs for us to do that. 23*32185Sminshall */ 24*32185Sminshall 25*32185Sminshall int 26*32185Sminshall DataToNetwork(buffer, count, done) 27*32185Sminshall register char *buffer; /* where the data is */ 28*32185Sminshall register int count; /* how much to send */ 29*32185Sminshall int done; /* is this the last of a logical block */ 30*32185Sminshall { 31*32185Sminshall register int c; 32*32185Sminshall int origCount; 33*32185Sminshall fd_set o; 34*32185Sminshall 35*32185Sminshall origCount = count; 36*32185Sminshall FD_ZERO(&o); 37*32185Sminshall 38*32185Sminshall while (count) { 39*32185Sminshall if ((netobuf+sizeof netobuf - nfrontp) < 6) { 40*32185Sminshall netflush(); 41*32185Sminshall while ((netobuf+sizeof netobuf - nfrontp) < 6) { 42*32185Sminshall FD_SET(net, &o); 43*32185Sminshall (void) select(net+1, (fd_set *) 0, &o, (fd_set *) 0, 44*32185Sminshall (struct timeval *) 0); 45*32185Sminshall netflush(); 46*32185Sminshall } 47*32185Sminshall } 48*32185Sminshall c = *buffer++; 49*32185Sminshall count--; 50*32185Sminshall if (c == IAC) { 51*32185Sminshall *nfrontp++ = IAC; 52*32185Sminshall *nfrontp++ = IAC; 53*32185Sminshall } else { 54*32185Sminshall *nfrontp++ = c; 55*32185Sminshall } 56*32185Sminshall } 57*32185Sminshall 58*32185Sminshall if (done && !count) { 59*32185Sminshall *nfrontp++ = IAC; 60*32185Sminshall *nfrontp++ = EOR; 61*32185Sminshall netflush(); /* try to move along as quickly as ... */ 62*32185Sminshall } 63*32185Sminshall return(origCount - count); 64*32185Sminshall } 65*32185Sminshall 66*32185Sminshall 67*32185Sminshall #if defined(unix) 68*32185Sminshall static void 69*32185Sminshall inputAvailable() 70*32185Sminshall { 71*32185Sminshall HaveInput = 1; 72*32185Sminshall } 73*32185Sminshall #endif /* defined(unix) */ 74*32185Sminshall 75*32185Sminshall void 76*32185Sminshall outputPurge() 77*32185Sminshall { 78*32185Sminshall int tmp = flushout; 79*32185Sminshall 80*32185Sminshall flushout = 1; 81*32185Sminshall 82*32185Sminshall ttyflush(); 83*32185Sminshall 84*32185Sminshall flushout = tmp; 85*32185Sminshall } 86*32185Sminshall 87*32185Sminshall 88*32185Sminshall /* 89*32185Sminshall * The following routines are places where the various tn3270 90*32185Sminshall * routines make calls into telnet.c. 91*32185Sminshall */ 92*32185Sminshall 93*32185Sminshall /* TtyChars() - returns the number of characters in the TTY buffer */ 94*32185Sminshall TtyChars() 95*32185Sminshall { 96*32185Sminshall return(tfrontp-tbackp); 97*32185Sminshall } 98*32185Sminshall 99*32185Sminshall /* DataToTerminal - queue up some data to go to terminal. */ 100*32185Sminshall 101*32185Sminshall int 102*32185Sminshall DataToTerminal(buffer, count) 103*32185Sminshall register char *buffer; /* where the data is */ 104*32185Sminshall register int count; /* how much to send */ 105*32185Sminshall { 106*32185Sminshall int origCount; 107*32185Sminshall #if defined(unix) 108*32185Sminshall fd_set o; 109*32185Sminshall 110*32185Sminshall FD_ZERO(&o); 111*32185Sminshall #endif /* defined(unix) */ 112*32185Sminshall origCount = count; 113*32185Sminshall 114*32185Sminshall while (count) { 115*32185Sminshall if (tfrontp >= ttyobuf+sizeof ttyobuf) { 116*32185Sminshall ttyflush(); 117*32185Sminshall while (tfrontp >= ttyobuf+sizeof ttyobuf) { 118*32185Sminshall #if defined(unix) 119*32185Sminshall FD_SET(tout, &o); 120*32185Sminshall (void) select(tout+1, (fd_set *) 0, &o, (fd_set *) 0, 121*32185Sminshall (struct timeval *) 0); 122*32185Sminshall #endif /* defined(unix) */ 123*32185Sminshall ttyflush(); 124*32185Sminshall } 125*32185Sminshall } 126*32185Sminshall *tfrontp++ = *buffer++; 127*32185Sminshall count--; 128*32185Sminshall } 129*32185Sminshall return(origCount - count); 130*32185Sminshall } 131*32185Sminshall 132*32185Sminshall /* EmptyTerminal - called to make sure that the terminal buffer is empty. 133*32185Sminshall * Note that we consider the buffer to run all the 134*32185Sminshall * way to the kernel (thus the select). 135*32185Sminshall */ 136*32185Sminshall 137*32185Sminshall void 138*32185Sminshall EmptyTerminal() 139*32185Sminshall { 140*32185Sminshall #if defined(unix) 141*32185Sminshall fd_set o; 142*32185Sminshall 143*32185Sminshall FD_ZERO(&o); 144*32185Sminshall #endif /* defined(unix) */ 145*32185Sminshall 146*32185Sminshall if (tfrontp == tbackp) { 147*32185Sminshall #if defined(unix) 148*32185Sminshall FD_SET(tout, &o); 149*32185Sminshall (void) select(tout+1, (int *) 0, &o, (int *) 0, 150*32185Sminshall (struct timeval *) 0); /* wait for TTLOWAT */ 151*32185Sminshall #endif /* defined(unix) */ 152*32185Sminshall } else { 153*32185Sminshall while (tfrontp != tbackp) { 154*32185Sminshall ttyflush(); 155*32185Sminshall #if defined(unix) 156*32185Sminshall FD_SET(tout, &o); 157*32185Sminshall (void) select(tout+1, (int *) 0, &o, (int *) 0, 158*32185Sminshall (struct timeval *) 0); /* wait for TTLOWAT */ 159*32185Sminshall #endif /* defined(unix) */ 160*32185Sminshall } 161*32185Sminshall } 162*32185Sminshall } 163*32185Sminshall 164*32185Sminshall 165*32185Sminshall /* 166*32185Sminshall * Push3270 - Try to send data along the 3270 output (to screen) direction. 167*32185Sminshall */ 168*32185Sminshall 169*32185Sminshall static int 170*32185Sminshall Push3270() 171*32185Sminshall { 172*32185Sminshall int save = scc; 173*32185Sminshall 174*32185Sminshall if (scc) { 175*32185Sminshall if (Ifrontp+scc > Ibuf+sizeof Ibuf) { 176*32185Sminshall if (Ibackp != Ibuf) { 177*32185Sminshall memcpy(Ibuf, Ibackp, Ifrontp-Ibackp); 178*32185Sminshall Ifrontp -= (Ibackp-Ibuf); 179*32185Sminshall Ibackp = Ibuf; 180*32185Sminshall } 181*32185Sminshall } 182*32185Sminshall if (Ifrontp+scc < Ibuf+sizeof Ibuf) { 183*32185Sminshall telrcv(); 184*32185Sminshall } 185*32185Sminshall } 186*32185Sminshall return save != scc; 187*32185Sminshall } 188*32185Sminshall 189*32185Sminshall 190*32185Sminshall /* 191*32185Sminshall * Finish3270 - get the last dregs of 3270 data out to the terminal 192*32185Sminshall * before quitting. 193*32185Sminshall */ 194*32185Sminshall 195*32185Sminshall static void 196*32185Sminshall Finish3270() 197*32185Sminshall { 198*32185Sminshall while (Push3270() || !DoTerminalOutput()) { 199*32185Sminshall #if defined(unix) 200*32185Sminshall HaveInput = 0; 201*32185Sminshall #endif /* defined(unix) */ 202*32185Sminshall ; 203*32185Sminshall } 204*32185Sminshall } 205*32185Sminshall 206*32185Sminshall 207*32185Sminshall /* StringToTerminal - output a null terminated string to the terminal */ 208*32185Sminshall 209*32185Sminshall void 210*32185Sminshall StringToTerminal(s) 211*32185Sminshall char *s; 212*32185Sminshall { 213*32185Sminshall int count; 214*32185Sminshall 215*32185Sminshall count = strlen(s); 216*32185Sminshall if (count) { 217*32185Sminshall (void) DataToTerminal(s, count); /* we know it always goes... */ 218*32185Sminshall } 219*32185Sminshall } 220*32185Sminshall 221*32185Sminshall 222*32185Sminshall #if ((!defined(NOT43)) || defined(PUTCHAR)) 223*32185Sminshall /* _putchar - output a single character to the terminal. This name is so that 224*32185Sminshall * curses(3x) can call us to send out data. 225*32185Sminshall */ 226*32185Sminshall 227*32185Sminshall void 228*32185Sminshall _putchar(c) 229*32185Sminshall char c; 230*32185Sminshall { 231*32185Sminshall if (tfrontp >= ttyobuf+sizeof ttyobuf) { 232*32185Sminshall (void) DataToTerminal(&c, 1); 233*32185Sminshall } else { 234*32185Sminshall *tfrontp++ = c; /* optimize if possible. */ 235*32185Sminshall } 236*32185Sminshall } 237*32185Sminshall #endif /* ((!defined(NOT43)) || defined(PUTCHAR)) */ 238*32185Sminshall 239*32185Sminshall #endif /* defined(TN3270) */ 240