1*32147Sminshall /* 2*32147Sminshall * The following routines try to encapsulate what is system dependent 3*32147Sminshall * (at least between 4.x and dos) which is used in telnet.c. 4*32147Sminshall */ 5*32147Sminshall 6*32147Sminshall #if defined(unix) 7*32147Sminshall 8*32147Sminshall #include <sys/ioctl.h> 9*32147Sminshall #include <sys/time.h> 10*32147Sminshall #include <signal.h> 11*32147Sminshall 12*32147Sminshall #include "defines.h" 13*32147Sminshall #include "externs.h" 14*32147Sminshall #include "types.h" 15*32147Sminshall 16*32147Sminshall int 17*32147Sminshall HaveInput; /* There is input available to scan */ 18*32147Sminshall 19*32147Sminshall #if defined(TN3270) 20*32147Sminshall static char tline[200]; 21*32147Sminshall char *transcom = 0; /* transparent mode command (default: none) */ 22*32147Sminshall #endif /* defined(TN3270) */ 23*32147Sminshall 24*32147Sminshall static struct tchars otc = { 0 }, ntc = { 0 }; 25*32147Sminshall static struct ltchars oltc = { 0 }, nltc = { 0 }; 26*32147Sminshall static struct sgttyb ottyb = { 0 }, nttyb = { 0 }; 27*32147Sminshall 28*32147Sminshall 29*32147Sminshall TerminalWrite(fd, buf, n) 30*32147Sminshall int fd; 31*32147Sminshall char *buf; 32*32147Sminshall int n; 33*32147Sminshall { 34*32147Sminshall return write(fd, buf, n); 35*32147Sminshall } 36*32147Sminshall 37*32147Sminshall TerminalRead(fd, buf, n) 38*32147Sminshall int fd; 39*32147Sminshall char *buf; 40*32147Sminshall int n; 41*32147Sminshall { 42*32147Sminshall return read(fd, buf, n); 43*32147Sminshall } 44*32147Sminshall 45*32147Sminshall /* 46*32147Sminshall * 47*32147Sminshall */ 48*32147Sminshall 49*32147Sminshall int 50*32147Sminshall TerminalAutoFlush() /* unix */ 51*32147Sminshall { 52*32147Sminshall #if defined(LNOFLSH) 53*32147Sminshall int flush; 54*32147Sminshall 55*32147Sminshall ioctl(0, TIOCLGET, (char *)&flush); 56*32147Sminshall return !(flush&LNOFLSH); /* if LNOFLSH, no autoflush */ 57*32147Sminshall #else /* LNOFLSH */ 58*32147Sminshall return 1; 59*32147Sminshall #endif /* LNOFLSH */ 60*32147Sminshall } 61*32147Sminshall 62*32147Sminshall /* 63*32147Sminshall * TerminalSpecialChars() 64*32147Sminshall * 65*32147Sminshall * Look at an input character to see if it is a special character 66*32147Sminshall * and decide what to do. 67*32147Sminshall * 68*32147Sminshall * Output: 69*32147Sminshall * 70*32147Sminshall * 0 Don't add this character. 71*32147Sminshall * 1 Do add this character 72*32147Sminshall */ 73*32147Sminshall 74*32147Sminshall int 75*32147Sminshall TerminalSpecialChars(c) /* unix */ 76*32147Sminshall int c; 77*32147Sminshall { 78*32147Sminshall void doflush(), intp(), sendbrk(); 79*32147Sminshall 80*32147Sminshall if (c == ntc.t_intrc) { 81*32147Sminshall intp(); 82*32147Sminshall return 0; 83*32147Sminshall } else if (c == ntc.t_quitc) { 84*32147Sminshall sendbrk(); 85*32147Sminshall return 0; 86*32147Sminshall } else if (c == nltc.t_flushc) { 87*32147Sminshall xmitAO(); /* Transmit Abort Output */ 88*32147Sminshall return 0; 89*32147Sminshall } else if (!MODE_LOCAL_CHARS(globalmode)) { 90*32147Sminshall if (c == nttyb.sg_kill) { 91*32147Sminshall xmitEL(); 92*32147Sminshall return 0; 93*32147Sminshall } else if (c == nttyb.sg_erase) { 94*32147Sminshall xmitEC(); /* Transmit Erase Character */ 95*32147Sminshall return 0; 96*32147Sminshall } 97*32147Sminshall } 98*32147Sminshall return 1; 99*32147Sminshall } 100*32147Sminshall 101*32147Sminshall 102*32147Sminshall /* 103*32147Sminshall * Flush output to the terminal 104*32147Sminshall */ 105*32147Sminshall 106*32147Sminshall void 107*32147Sminshall TerminalFlushOutput() /* unix */ 108*32147Sminshall { 109*32147Sminshall (void) ioctl(fileno(stdout), TIOCFLUSH, (char *) 0); 110*32147Sminshall } 111*32147Sminshall 112*32147Sminshall void 113*32147Sminshall TerminalSaveState() /* unix */ 114*32147Sminshall { 115*32147Sminshall ioctl(0, TIOCGETP, (char *)&ottyb); 116*32147Sminshall ioctl(0, TIOCGETC, (char *)&otc); 117*32147Sminshall ioctl(0, TIOCGLTC, (char *)&oltc); 118*32147Sminshall 119*32147Sminshall ntc = otc; 120*32147Sminshall nltc = oltc; 121*32147Sminshall nttyb = ottyb; 122*32147Sminshall } 123*32147Sminshall 124*32147Sminshall void 125*32147Sminshall TerminalRestoreState() /* unix */ 126*32147Sminshall { 127*32147Sminshall } 128*32147Sminshall 129*32147Sminshall /* 130*32147Sminshall * TerminalNewMode - set up terminal to a specific mode. 131*32147Sminshall */ 132*32147Sminshall 133*32147Sminshall 134*32147Sminshall void 135*32147Sminshall TerminalNewMode(fd_in, fd_out, f) /* unix */ 136*32147Sminshall int fd_in, fd_out; /* File descriptor */ 137*32147Sminshall register int f; 138*32147Sminshall { 139*32147Sminshall static int prevmode = 0; 140*32147Sminshall struct tchars *tc; 141*32147Sminshall struct tchars tc3; 142*32147Sminshall struct ltchars *ltc; 143*32147Sminshall struct sgttyb sb; 144*32147Sminshall int onoff; 145*32147Sminshall int old; 146*32147Sminshall struct tchars notc2; 147*32147Sminshall struct ltchars noltc2; 148*32147Sminshall static struct tchars notc = { -1, -1, -1, -1, -1, -1 }; 149*32147Sminshall static struct ltchars noltc = { -1, -1, -1, -1, -1, -1 }; 150*32147Sminshall 151*32147Sminshall globalmode = f; 152*32147Sminshall if (prevmode == f) 153*32147Sminshall return; 154*32147Sminshall old = prevmode; 155*32147Sminshall prevmode = f; 156*32147Sminshall sb = nttyb; 157*32147Sminshall 158*32147Sminshall switch (f) { 159*32147Sminshall 160*32147Sminshall case 0: 161*32147Sminshall onoff = 0; 162*32147Sminshall tc = &otc; 163*32147Sminshall ltc = &oltc; 164*32147Sminshall break; 165*32147Sminshall 166*32147Sminshall case 1: /* remote character processing, remote echo */ 167*32147Sminshall case 2: /* remote character processing, local echo */ 168*32147Sminshall case 6: /* 3270 mode - like 1, but with xon/xoff local */ 169*32147Sminshall /* (might be nice to have "6" in telnet also...) */ 170*32147Sminshall sb.sg_flags |= CBREAK; 171*32147Sminshall if ((f == 1) || (f == 6)) { 172*32147Sminshall sb.sg_flags &= ~(ECHO|CRMOD); 173*32147Sminshall } else { 174*32147Sminshall sb.sg_flags |= ECHO|CRMOD; 175*32147Sminshall } 176*32147Sminshall sb.sg_erase = sb.sg_kill = -1; 177*32147Sminshall if (f == 6) { 178*32147Sminshall tc = &tc3; 179*32147Sminshall tc3 = notc; 180*32147Sminshall /* get XON, XOFF characters */ 181*32147Sminshall tc3.t_startc = otc.t_startc; 182*32147Sminshall tc3.t_stopc = otc.t_stopc; 183*32147Sminshall } else { 184*32147Sminshall /* 185*32147Sminshall * If user hasn't specified one way or the other, 186*32147Sminshall * then default to not trapping signals. 187*32147Sminshall */ 188*32147Sminshall if (!donelclchars) { 189*32147Sminshall localchars = 0; 190*32147Sminshall } 191*32147Sminshall if (localchars) { 192*32147Sminshall notc2 = notc; 193*32147Sminshall notc2.t_intrc = ntc.t_intrc; 194*32147Sminshall notc2.t_quitc = ntc.t_quitc; 195*32147Sminshall tc = ¬c2; 196*32147Sminshall } else { 197*32147Sminshall tc = ¬c; 198*32147Sminshall } 199*32147Sminshall } 200*32147Sminshall ltc = &noltc; 201*32147Sminshall onoff = 1; 202*32147Sminshall break; 203*32147Sminshall case 3: /* local character processing, remote echo */ 204*32147Sminshall case 4: /* local character processing, local echo */ 205*32147Sminshall case 5: /* local character processing, no echo */ 206*32147Sminshall sb.sg_flags &= ~CBREAK; 207*32147Sminshall sb.sg_flags |= CRMOD; 208*32147Sminshall if (f == 4) 209*32147Sminshall sb.sg_flags |= ECHO; 210*32147Sminshall else 211*32147Sminshall sb.sg_flags &= ~ECHO; 212*32147Sminshall notc2 = ntc; 213*32147Sminshall tc = ¬c2; 214*32147Sminshall noltc2 = oltc; 215*32147Sminshall ltc = &noltc2; 216*32147Sminshall /* 217*32147Sminshall * If user hasn't specified one way or the other, 218*32147Sminshall * then default to trapping signals. 219*32147Sminshall */ 220*32147Sminshall if (!donelclchars) { 221*32147Sminshall localchars = 1; 222*32147Sminshall } 223*32147Sminshall if (localchars) { 224*32147Sminshall notc2.t_brkc = nltc.t_flushc; 225*32147Sminshall noltc2.t_flushc = -1; 226*32147Sminshall } else { 227*32147Sminshall notc2.t_intrc = notc2.t_quitc = -1; 228*32147Sminshall } 229*32147Sminshall noltc2.t_suspc = escape; 230*32147Sminshall noltc2.t_dsuspc = -1; 231*32147Sminshall onoff = 1; 232*32147Sminshall break; 233*32147Sminshall 234*32147Sminshall default: 235*32147Sminshall return; 236*32147Sminshall } 237*32147Sminshall ioctl(fd_in, TIOCSLTC, (char *)ltc); 238*32147Sminshall ioctl(fd_in, TIOCSETC, (char *)tc); 239*32147Sminshall ioctl(fd_in, TIOCSETP, (char *)&sb); 240*32147Sminshall #if (!defined(TN3270)) || ((!defined(NOT43)) || defined(PUTCHAR)) 241*32147Sminshall ioctl(fd_in, FIONBIO, (char *)&onoff); 242*32147Sminshall ioctl(fd_out, FIONBIO, (char *)&onoff); 243*32147Sminshall #endif /* (!defined(TN3270)) || ((!defined(NOT43)) || defined(PUTCHAR)) */ 244*32147Sminshall #if defined(TN3270) 245*32147Sminshall if (noasynch == 0) { 246*32147Sminshall ioctl(fd_in, FIOASYNC, (char *)&onoff); 247*32147Sminshall } 248*32147Sminshall #endif /* defined(TN3270) */ 249*32147Sminshall 250*32147Sminshall if (MODE_LINE(f)) { 251*32147Sminshall void doescape(); 252*32147Sminshall 253*32147Sminshall signal(SIGTSTP, doescape); 254*32147Sminshall } else if (MODE_LINE(old)) { 255*32147Sminshall signal(SIGTSTP, SIG_DFL); 256*32147Sminshall sigsetmask(sigblock(0) & ~(1<<(SIGTSTP-1))); 257*32147Sminshall } 258*32147Sminshall } 259*32147Sminshall 260*32147Sminshall 261*32147Sminshall int 262*32147Sminshall NetClose(net) 263*32147Sminshall int net; 264*32147Sminshall { 265*32147Sminshall return close(net); 266*32147Sminshall } 267*32147Sminshall 268*32147Sminshall 269*32147Sminshall void 270*32147Sminshall NetNonblockingIO(fd, onoff) /* unix */ 271*32147Sminshall int 272*32147Sminshall fd, 273*32147Sminshall onoff; 274*32147Sminshall { 275*32147Sminshall ioctl(fd, FIONBIO, (char *)&onoff); 276*32147Sminshall } 277*32147Sminshall 278*32147Sminshall void 279*32147Sminshall NetSigIO(fd, onoff) /* unix */ 280*32147Sminshall int 281*32147Sminshall fd, 282*32147Sminshall onoff; 283*32147Sminshall { 284*32147Sminshall ioctl(fd, FIOASYNC, (char *)&onoff); /* hear about input */ 285*32147Sminshall } 286*32147Sminshall 287*32147Sminshall void 288*32147Sminshall NetSetPgrp(fd) /* unix */ 289*32147Sminshall int fd; 290*32147Sminshall { 291*32147Sminshall int myPid; 292*32147Sminshall 293*32147Sminshall myPid = getpid(); 294*32147Sminshall #if defined(NOT43) 295*32147Sminshall myPid = -myPid; 296*32147Sminshall #endif /* defined(NOT43) */ 297*32147Sminshall ioctl(fd, SIOCSPGRP, (char *)&myPid); /* set my pid */ 298*32147Sminshall } 299*32147Sminshall 300*32147Sminshall 301*32147Sminshall #endif /* defined(unix) */ 302