1*35763Smarc /* 2*35763Smarc * Copyright (c) 1982, 1986 Regents of the University of California. 3*35763Smarc * All rights reserved. The Berkeley software License Agreement 4*35763Smarc * specifies the terms and conditions for redistribution. 5*35763Smarc * 6*35763Smarc * @(#)ttcompat.c 7.11 (Berkeley) 4/8/88 7*35763Smarc */ 8*35763Smarc 9*35763Smarc /* 10*35763Smarc * mapping routines for old line disciplines (yuck) 11*35763Smarc */ 12*35763Smarc #ifdef COMPAT_43 13*35763Smarc 14*35763Smarc #include "../machine/reg.h" 15*35763Smarc 16*35763Smarc #include "param.h" 17*35763Smarc #include "systm.h" 18*35763Smarc #include "dir.h" 19*35763Smarc #include "user.h" 20*35763Smarc #include "ioctl.h" 21*35763Smarc #include "tty.h" 22*35763Smarc #include "termios.h" 23*35763Smarc #include "proc.h" 24*35763Smarc #include "file.h" 25*35763Smarc #include "conf.h" 26*35763Smarc #include "dkstat.h" 27*35763Smarc #include "uio.h" 28*35763Smarc #include "kernel.h" 29*35763Smarc #include "syslog.h" 30*35763Smarc 31*35763Smarc /* begin XXX */ 32*35763Smarc #undef t_erase 33*35763Smarc #undef t_kill 34*35763Smarc #undef t_intrc 35*35763Smarc #undef t_quitc 36*35763Smarc #undef t_startc 37*35763Smarc #undef t_stopc 38*35763Smarc #undef t_eofc 39*35763Smarc #undef t_brkc 40*35763Smarc #undef t_suspc 41*35763Smarc #undef t_dsuspc 42*35763Smarc #undef t_rprntc 43*35763Smarc #undef t_flushc 44*35763Smarc #undef t_werasc 45*35763Smarc #undef t_lnextc 46*35763Smarc /* end XXX */ 47*35763Smarc 48*35763Smarc /* should fold these two tables into one */ 49*35763Smarc static struct speedtab compatspeeds[] = { 50*35763Smarc 38400, 15, 51*35763Smarc 19200, 14, 52*35763Smarc 9600, 13, 53*35763Smarc 4800, 12, 54*35763Smarc 2400, 11, 55*35763Smarc 1800, 10, 56*35763Smarc 1200, 9, 57*35763Smarc 600, 8, 58*35763Smarc 300, 7, 59*35763Smarc 200, 6, 60*35763Smarc 150, 5, 61*35763Smarc 134, 4, 62*35763Smarc 110, 3, 63*35763Smarc 75, 2, 64*35763Smarc 50, 1, 65*35763Smarc 0, 0, 66*35763Smarc -1, -1, 67*35763Smarc }; 68*35763Smarc static int compatspcodes[16] = { 69*35763Smarc 0, 50, 75, 110, 134, 150, 200, 300, 600, 1200, 70*35763Smarc 1800, 2400, 4800, 9600, 19200, 38400, 71*35763Smarc }; 72*35763Smarc 73*35763Smarc /*ARGSUSED*/ 74*35763Smarc ttcompat(tp, com, data, flag) 75*35763Smarc register struct tty *tp; 76*35763Smarc caddr_t data; 77*35763Smarc { 78*35763Smarc switch(com) { 79*35763Smarc case TIOCGETP: { 80*35763Smarc register struct sgttyb *sg = (struct sgttyb *)data; 81*35763Smarc register u_char *cc = tp->t_cc; 82*35763Smarc register speed; 83*35763Smarc 84*35763Smarc speed = ttspeedtab(tp->t_ospeed, compatspeeds); 85*35763Smarc sg->sg_ospeed = (speed == -1) ? 15 : speed; 86*35763Smarc if (tp->t_ispeed == 0) 87*35763Smarc sg->sg_ispeed = sg->sg_ospeed; 88*35763Smarc else { 89*35763Smarc speed = ttspeedtab(tp->t_ispeed, compatspeeds); 90*35763Smarc sg->sg_ispeed = (speed == -1) ? 15 : speed; 91*35763Smarc } 92*35763Smarc 93*35763Smarc sg->sg_erase = cc[VERASE]; 94*35763Smarc sg->sg_kill = cc[VKILL]; 95*35763Smarc sg->sg_flags = ttcompatgetflags(tp) & 0xffff; 96*35763Smarc break; 97*35763Smarc } 98*35763Smarc 99*35763Smarc case TIOCSETP: 100*35763Smarc case TIOCSETN: { 101*35763Smarc register struct sgttyb *sg = (struct sgttyb *)data; 102*35763Smarc struct termios term; 103*35763Smarc int speed; 104*35763Smarc 105*35763Smarc term = tp->t_termios; 106*35763Smarc 107*35763Smarc if ((speed = sg->sg_ispeed) > 15 || speed < 0) 108*35763Smarc term.c_ispeed = speed; 109*35763Smarc else 110*35763Smarc term.c_ispeed = compatspcodes[speed]; 111*35763Smarc if ((speed = sg->sg_ospeed) > 15 || speed < 0) 112*35763Smarc term.c_ospeed = speed; 113*35763Smarc else 114*35763Smarc term.c_ospeed = compatspcodes[speed]; 115*35763Smarc 116*35763Smarc term.c_cc[VERASE] = sg->sg_erase; 117*35763Smarc term.c_cc[VKILL] = sg->sg_kill; 118*35763Smarc if (sg->sg_erase == -1) 119*35763Smarc term.c_cc[VERASE2] = POSIX_V_DISABLE; 120*35763Smarc 121*35763Smarc tp->t_flags = (tp->t_flags&0xffff0000) | sg->sg_flags; 122*35763Smarc 123*35763Smarc ttcompatsetflags(tp, &term); 124*35763Smarc return (ttioctl(tp, com == TIOCSETP ? TIOCSETAF : TIOCSETA, 125*35763Smarc &term, flag)); 126*35763Smarc } 127*35763Smarc 128*35763Smarc case TIOCGETC: { 129*35763Smarc struct tchars *tc = (struct tchars *)data; 130*35763Smarc register u_char *cc = tp->t_cc; 131*35763Smarc 132*35763Smarc tc->t_intrc = cc[VINTR]; 133*35763Smarc tc->t_quitc = cc[VQUIT]; 134*35763Smarc tc->t_startc = cc[VSTART]; 135*35763Smarc tc->t_stopc = cc[VSTOP]; 136*35763Smarc tc->t_eofc = cc[VEOF]; 137*35763Smarc tc->t_brkc = cc[VEOL]; 138*35763Smarc break; 139*35763Smarc } 140*35763Smarc case TIOCSETC: { 141*35763Smarc struct tchars *tc = (struct tchars *)data; 142*35763Smarc register u_char *cc = tp->t_cc; 143*35763Smarc 144*35763Smarc cc[VINTR] = tc->t_intrc; 145*35763Smarc cc[VQUIT] = tc->t_quitc; 146*35763Smarc cc[VSTART] = tc->t_startc; 147*35763Smarc cc[VSTOP] = tc->t_stopc; 148*35763Smarc cc[VEOF] = tc->t_eofc; 149*35763Smarc cc[VEOL] = tc->t_brkc; 150*35763Smarc if (tc->t_brkc == -1) 151*35763Smarc cc[VEOL2] = POSIX_V_DISABLE; 152*35763Smarc break; 153*35763Smarc } 154*35763Smarc case TIOCSLTC: { 155*35763Smarc struct ltchars *ltc = (struct ltchars *)data; 156*35763Smarc register u_char *cc = tp->t_cc; 157*35763Smarc 158*35763Smarc cc[VSUSP] = ltc->t_suspc; 159*35763Smarc cc[VDSUSP] = ltc->t_dsuspc; 160*35763Smarc cc[VREPRINT] = ltc->t_rprntc; 161*35763Smarc cc[VFLUSHO] = ltc->t_flushc; 162*35763Smarc cc[VWERASE] = ltc->t_werasc; 163*35763Smarc cc[VLNEXT] = ltc->t_lnextc; 164*35763Smarc break; 165*35763Smarc } 166*35763Smarc case TIOCGLTC: { 167*35763Smarc struct ltchars *ltc = (struct ltchars *)data; 168*35763Smarc register u_char *cc = tp->t_cc; 169*35763Smarc 170*35763Smarc ltc->t_suspc = cc[VSUSP]; 171*35763Smarc ltc->t_dsuspc = cc[VDSUSP]; 172*35763Smarc ltc->t_rprntc = cc[VREPRINT]; 173*35763Smarc ltc->t_flushc = cc[VFLUSHO]; 174*35763Smarc ltc->t_werasc = cc[VWERASE]; 175*35763Smarc ltc->t_lnextc = cc[VLNEXT]; 176*35763Smarc break; 177*35763Smarc } 178*35763Smarc case TIOCLBIS: 179*35763Smarc case TIOCLBIC: 180*35763Smarc case TIOCLSET: { 181*35763Smarc struct termios term; 182*35763Smarc 183*35763Smarc term = tp->t_termios; 184*35763Smarc if (com == TIOCLSET) 185*35763Smarc tp->t_flags = (tp->t_flags&0xffff) | *(short *)data<<16; 186*35763Smarc else { 187*35763Smarc tp->t_flags = 188*35763Smarc (ttcompatgetflags(tp)&0xffff0000)|(tp->t_flags&0xffff); 189*35763Smarc if (com == TIOCLBIS) 190*35763Smarc tp->t_flags |= *(short *)data<<16; 191*35763Smarc else 192*35763Smarc tp->t_flags &= ~(*(short *)data<<16); 193*35763Smarc } 194*35763Smarc ttcompatsetlflags(tp, &term); 195*35763Smarc return (ttioctl(tp, TIOCSETA, &term, flag)); 196*35763Smarc } 197*35763Smarc case TIOCLGET: 198*35763Smarc *(short *)data = ttcompatgetflags(tp)>>16; 199*35763Smarc break; 200*35763Smarc default: 201*35763Smarc return (-1); 202*35763Smarc } 203*35763Smarc return(0); 204*35763Smarc } 205*35763Smarc 206*35763Smarc 207*35763Smarc 208*35763Smarc ttcompatgetflags(tp) 209*35763Smarc register struct tty *tp; 210*35763Smarc { 211*35763Smarc register long iflag = tp->t_iflag; 212*35763Smarc register long lflag = tp->t_lflag; 213*35763Smarc register long oflag = tp->t_oflag; 214*35763Smarc register long cflag = tp->t_cflag; 215*35763Smarc register flags = 0; 216*35763Smarc 217*35763Smarc if (iflag&IXOFF) 218*35763Smarc flags |= TANDEM; 219*35763Smarc if (iflag&ICRNL || oflag&ONLCR) 220*35763Smarc flags |= CRMOD; 221*35763Smarc if (cflag&PARENB) { 222*35763Smarc if (iflag&INPCK) { 223*35763Smarc if (cflag&PARODD) 224*35763Smarc flags |= ODDP; 225*35763Smarc else 226*35763Smarc flags |= EVENP; 227*35763Smarc } else 228*35763Smarc flags |= EVENP | ODDP; 229*35763Smarc } else { 230*35763Smarc if ((tp->t_flags&LITOUT) && !(oflag&OPOST)) 231*35763Smarc flags |= LITOUT; 232*35763Smarc if (tp->t_flags&PASS8) 233*35763Smarc flags |= PASS8; 234*35763Smarc } 235*35763Smarc 236*35763Smarc if ((lflag&ICANON) == 0) { 237*35763Smarc /* fudge */ 238*35763Smarc if (iflag&IXON || lflag&ISIG || lflag&IEXTEN || cflag&PARENB) 239*35763Smarc flags |= CBREAK; 240*35763Smarc else 241*35763Smarc flags |= RAW; 242*35763Smarc } 243*35763Smarc if (oflag&OXTABS) 244*35763Smarc flags |= XTABS; 245*35763Smarc 246*35763Smarc if (lflag&ECHOE) 247*35763Smarc flags |= CRTERA; 248*35763Smarc if (lflag&ECHOKE) 249*35763Smarc flags |= CRTKIL; 250*35763Smarc if (lflag&ECHOPRT) 251*35763Smarc flags |= PRTERA; 252*35763Smarc if (lflag&ECHOCTL) 253*35763Smarc flags |= CTLECH; 254*35763Smarc if ((iflag&IXANY) == 0) 255*35763Smarc flags |= DECCTQ; 256*35763Smarc flags |= lflag&(ECHO|MDMBUF|TOSTOP|FLUSHO|NOHANG|PENDIN|NOFLSH); 257*35763Smarc 258*35763Smarc return (flags); 259*35763Smarc } 260*35763Smarc 261*35763Smarc ttcompatsetflags(tp, t) 262*35763Smarc register struct tty *tp; 263*35763Smarc register struct termios *t; 264*35763Smarc { 265*35763Smarc register flags = tp->t_flags; 266*35763Smarc register long iflag = t->c_iflag; 267*35763Smarc register long oflag = t->c_oflag; 268*35763Smarc register long lflag = t->c_lflag; 269*35763Smarc register long cflag = t->c_cflag; 270*35763Smarc 271*35763Smarc if (flags & RAW) { 272*35763Smarc iflag &= IXOFF; 273*35763Smarc oflag &= ~OPOST; 274*35763Smarc lflag &= ~(ECHOCTL|ISIG|ICANON); 275*35763Smarc } else { 276*35763Smarc iflag |= BRKINT|IXON|IEXTEN|IMAXBEL; 277*35763Smarc oflag |= OPOST; 278*35763Smarc lflag |= ISIG; 279*35763Smarc if (flags & XTABS) 280*35763Smarc oflag |= OXTABS; 281*35763Smarc else 282*35763Smarc oflag &= ~OXTABS; 283*35763Smarc if (flags & CBREAK) 284*35763Smarc lflag &= ~ICANON; 285*35763Smarc else 286*35763Smarc lflag |= ICANON; 287*35763Smarc if (flags&CRMOD) { 288*35763Smarc iflag |= ICRNL; 289*35763Smarc oflag |= ONLCR; 290*35763Smarc } else { 291*35763Smarc iflag &= ~ICRNL; 292*35763Smarc oflag &= ~ONLCR; 293*35763Smarc } 294*35763Smarc } 295*35763Smarc if (flags&ECHO) 296*35763Smarc lflag |= ECHO; 297*35763Smarc else 298*35763Smarc lflag &= ~ECHO; 299*35763Smarc 300*35763Smarc if (flags&(RAW|LITOUT|PASS8)) { 301*35763Smarc cflag &= ~(CSIZE|PARENB); 302*35763Smarc cflag |= CS8; 303*35763Smarc if ((flags&(RAW|PASS8)) == 0) 304*35763Smarc iflag |= ISTRIP; 305*35763Smarc } else { 306*35763Smarc cflag &= ~CSIZE; 307*35763Smarc cflag |= CS7|PARENB; 308*35763Smarc } 309*35763Smarc if ((flags&(EVENP|ODDP)) == EVENP) { 310*35763Smarc iflag |= INPCK; 311*35763Smarc cflag &= ~PARODD; 312*35763Smarc } else if ((flags&(EVENP|ODDP)) == ODDP) { 313*35763Smarc iflag |= INPCK; 314*35763Smarc cflag |= PARODD; 315*35763Smarc } else 316*35763Smarc iflag &= ~INPCK; 317*35763Smarc if (flags&LITOUT) 318*35763Smarc oflag &= ~OPOST; /* move earlier ? */ 319*35763Smarc if (flags&TANDEM) 320*35763Smarc iflag |= IXOFF; 321*35763Smarc else 322*35763Smarc iflag &= ~IXOFF; 323*35763Smarc t->c_iflag = iflag; 324*35763Smarc t->c_oflag = oflag; 325*35763Smarc t->c_lflag = lflag; 326*35763Smarc t->c_cflag = cflag; 327*35763Smarc } 328*35763Smarc 329*35763Smarc /* XXX - rethink this whole routine */ 330*35763Smarc ttcompatsetlflags(tp, t) 331*35763Smarc register struct tty *tp; 332*35763Smarc register struct termios *t; 333*35763Smarc { 334*35763Smarc register flags = tp->t_flags; 335*35763Smarc register long iflag = t->c_iflag; 336*35763Smarc register long oflag = t->c_oflag; 337*35763Smarc register long lflag = t->c_lflag; 338*35763Smarc register long cflag = t->c_cflag; 339*35763Smarc if (flags&CRTERA) 340*35763Smarc lflag |= ECHOE; 341*35763Smarc else 342*35763Smarc lflag &= ECHOE; 343*35763Smarc if (flags&CRTKIL) 344*35763Smarc lflag |= ECHOKE; 345*35763Smarc else 346*35763Smarc lflag &= ~ECHOKE; 347*35763Smarc if (flags&PRTERA) 348*35763Smarc lflag |= ECHOPRT; 349*35763Smarc else 350*35763Smarc lflag &= ~ECHOPRT; 351*35763Smarc if (flags&CTLECH) 352*35763Smarc lflag |= ECHOCTL; 353*35763Smarc else 354*35763Smarc lflag &= ~ECHOCTL; 355*35763Smarc if ((flags&DECCTQ) == 0) 356*35763Smarc lflag |= IXANY; 357*35763Smarc else 358*35763Smarc lflag &= ~IXANY; 359*35763Smarc 360*35763Smarc lflag &= ~(MDMBUF|TOSTOP|FLUSHO|NOHANG|PENDIN|NOFLSH); 361*35763Smarc lflag |= flags&(MDMBUF|TOSTOP|FLUSHO|NOHANG|PENDIN|NOFLSH); 362*35763Smarc 363*35763Smarc if (flags&(LITOUT|PASS8)) { 364*35763Smarc iflag &= ~ISTRIP; 365*35763Smarc cflag &= ~(CSIZE|PARENB); 366*35763Smarc cflag |= CS8; 367*35763Smarc if (flags&LITOUT) 368*35763Smarc oflag &= ~OPOST; 369*35763Smarc if ((flags&(PASS8|RAW)) == 0) 370*35763Smarc iflag |= ISTRIP; 371*35763Smarc } else if ((flags&RAW) == 0) { 372*35763Smarc cflag &= ~CSIZE; 373*35763Smarc cflag |= CS7|PARENB; 374*35763Smarc oflag |= OPOST; 375*35763Smarc } 376*35763Smarc t->c_iflag = iflag; 377*35763Smarc t->c_oflag = oflag; 378*35763Smarc t->c_lflag = lflag; 379*35763Smarc t->c_cflag = cflag; 380*35763Smarc } 381*35763Smarc #endif /* COMPAT_43 */ 382