|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1988 University of Utah. ! 3: * Copyright (c) 1990 The Regents of the University of California. ! 4: * All rights reserved. ! 5: * ! 6: * This code is derived from software contributed to Berkeley by ! 7: * the Systems Programming Group of the University of Utah Computer ! 8: * Science Department. ! 9: * ! 10: * Redistribution and use in source and binary forms, with or without ! 11: * modification, are permitted provided that the following conditions ! 12: * are met: ! 13: * 1. Redistributions of source code must retain the above copyright ! 14: * notice, this list of conditions and the following disclaimer. ! 15: * 2. Redistributions in binary form must reproduce the above copyright ! 16: * notice, this list of conditions and the following disclaimer in the ! 17: * documentation and/or other materials provided with the distribution. ! 18: * 3. All advertising materials mentioning features or use of this software ! 19: * must display the following acknowledgement: ! 20: * This product includes software developed by the University of ! 21: * California, Berkeley and its contributors. ! 22: * 4. Neither the name of the University nor the names of its contributors ! 23: * may be used to endorse or promote products derived from this software ! 24: * without specific prior written permission. ! 25: * ! 26: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ! 27: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ! 28: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ! 29: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE ! 30: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ! 31: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS ! 32: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ! 33: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT ! 34: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY ! 35: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ! 36: * SUCH DAMAGE. ! 37: * ! 38: * from: Utah $Hdr: hpux_tty.c 1.1 90/07/09$ ! 39: * ! 40: * @(#)hpux_tty.c 7.9 (Berkeley) 5/30/91 ! 41: */ ! 42: ! 43: /* ! 44: * stty/gtty/termio emulation stuff ! 45: */ ! 46: #ifdef HPUXCOMPAT ! 47: ! 48: #include "param.h" ! 49: #include "systm.h" ! 50: #include "filedesc.h" ! 51: #include "ioctl.h" ! 52: #include "tty.h" ! 53: #include "proc.h" ! 54: #include "file.h" ! 55: #include "conf.h" ! 56: #include "buf.h" ! 57: #include "kernel.h" ! 58: ! 59: #include "hpux.h" ! 60: #include "hpux_termio.h" ! 61: ! 62: /* ! 63: * Map BSD/POSIX style termios info to and from SYS5 style termio stuff. ! 64: */ ! 65: hpuxtermio(fp, com, data, p) ! 66: struct file *fp; ! 67: caddr_t data; ! 68: struct proc *p; ! 69: { ! 70: struct termios tios; ! 71: int line, error, (*ioctlrout)(); ! 72: register struct hpuxtermio *tiop; ! 73: ! 74: ioctlrout = fp->f_ops->fo_ioctl; ! 75: tiop = (struct hpuxtermio *)data; ! 76: switch (com) { ! 77: case HPUXTCGETA: ! 78: /* ! 79: * Get BSD terminal state ! 80: */ ! 81: bzero(data, sizeof(struct hpuxtermio)); ! 82: if (error = (*ioctlrout)(fp, TIOCGETA, (caddr_t)&tios, p)) ! 83: break; ! 84: /* ! 85: * Set iflag. ! 86: * Same through ICRNL, no BSD equivs for IUCLC, IENQAK ! 87: */ ! 88: tiop->c_iflag = tios.c_iflag & 0x1ff; ! 89: if (tios.c_iflag & IXON) ! 90: tiop->c_iflag |= TIO_IXON; ! 91: if (tios.c_iflag & IXOFF) ! 92: tiop->c_iflag |= TIO_IXOFF; ! 93: if (tios.c_iflag & IXANY) ! 94: tiop->c_iflag |= TIO_IXANY; ! 95: /* ! 96: * Set oflag. ! 97: * No BSD equivs for OLCUC/OCRNL/ONOCR/ONLRET/OFILL/OFDEL ! 98: * or any of the delays. ! 99: */ ! 100: if (tios.c_oflag & OPOST) ! 101: tiop->c_oflag |= TIO_OPOST; ! 102: if (tios.c_oflag & ONLCR) ! 103: tiop->c_oflag |= TIO_ONLCR; ! 104: if (tios.c_oflag & OXTABS) ! 105: tiop->c_oflag |= TIO_TAB3; ! 106: /* ! 107: * Set cflag. ! 108: * Baud from ospeed, rest from cflag. ! 109: */ ! 110: tiop->c_cflag = bsdtohpuxbaud(tios.c_ospeed); ! 111: switch (tios.c_cflag & CSIZE) { ! 112: case CS5: ! 113: tiop->c_cflag |= TIO_CS5; break; ! 114: case CS6: ! 115: tiop->c_cflag |= TIO_CS6; break; ! 116: case CS7: ! 117: tiop->c_cflag |= TIO_CS7; break; ! 118: case CS8: ! 119: tiop->c_cflag |= TIO_CS8; break; ! 120: } ! 121: if (tios.c_cflag & CSTOPB) ! 122: tiop->c_cflag |= TIO_CSTOPB; ! 123: if (tios.c_cflag & CREAD) ! 124: tiop->c_cflag |= TIO_CREAD; ! 125: if (tios.c_cflag & PARENB) ! 126: tiop->c_cflag |= TIO_PARENB; ! 127: if (tios.c_cflag & PARODD) ! 128: tiop->c_cflag |= TIO_PARODD; ! 129: if (tios.c_cflag & HUPCL) ! 130: tiop->c_cflag |= TIO_HUPCL; ! 131: if (tios.c_cflag & CLOCAL) ! 132: tiop->c_cflag |= TIO_CLOCAL; ! 133: /* ! 134: * Set lflag. ! 135: * No BSD equiv for XCASE. ! 136: */ ! 137: if (tios.c_lflag & ECHOE) ! 138: tiop->c_lflag |= TIO_ECHOE; ! 139: if (tios.c_lflag & ECHOK) ! 140: tiop->c_lflag |= TIO_ECHOK; ! 141: if (tios.c_lflag & ECHO) ! 142: tiop->c_lflag |= TIO_ECHO; ! 143: if (tios.c_lflag & ECHONL) ! 144: tiop->c_lflag |= TIO_ECHONL; ! 145: if (tios.c_lflag & ISIG) ! 146: tiop->c_lflag |= TIO_ISIG; ! 147: if (tios.c_lflag & ICANON) ! 148: tiop->c_lflag |= TIO_ICANON; ! 149: if (tios.c_lflag & NOFLSH) ! 150: tiop->c_lflag |= TIO_NOFLSH; ! 151: /* ! 152: * Line discipline ! 153: */ ! 154: line = 0; ! 155: (void) (*ioctlrout)(fp, TIOCGETD, (caddr_t)&line, p); ! 156: tiop->c_line = line; ! 157: /* ! 158: * Set editing chars ! 159: */ ! 160: tiop->c_cc[HPUXVINTR] = tios.c_cc[VINTR]; ! 161: tiop->c_cc[HPUXVQUIT] = tios.c_cc[VQUIT]; ! 162: tiop->c_cc[HPUXVERASE] = tios.c_cc[VERASE]; ! 163: tiop->c_cc[HPUXVKILL] = tios.c_cc[VKILL]; ! 164: if (tiop->c_lflag & TIO_ICANON) { ! 165: tiop->c_cc[HPUXVEOF] = tios.c_cc[VEOF]; ! 166: tiop->c_cc[HPUXVEOL] = tios.c_cc[VEOL]; ! 167: } else { ! 168: tiop->c_cc[HPUXVMIN] = tios.c_cc[VMIN]; ! 169: tiop->c_cc[HPUXVTIME] = tios.c_cc[VTIME]; ! 170: } ! 171: break; ! 172: ! 173: case HPUXTCSETA: ! 174: case HPUXTCSETAW: ! 175: case HPUXTCSETAF: ! 176: /* ! 177: * Get old characteristics and determine if we are a tty. ! 178: */ ! 179: if (error = (*ioctlrout)(fp, TIOCGETA, (caddr_t)&tios, p)) ! 180: break; ! 181: /* ! 182: * Set iflag. ! 183: * Same through ICRNL, no HP-UX equiv for IMAXBEL ! 184: */ ! 185: tios.c_iflag &= ~(IXON|IXOFF|IXANY|0x1ff); ! 186: tios.c_iflag |= tiop->c_iflag & 0x1ff; ! 187: if (tiop->c_iflag & TIO_IXON) ! 188: tios.c_iflag |= IXON; ! 189: if (tiop->c_iflag & TIO_IXOFF) ! 190: tios.c_iflag |= IXOFF; ! 191: if (tiop->c_iflag & TIO_IXANY) ! 192: tios.c_iflag |= IXANY; ! 193: /* ! 194: * Set oflag. ! 195: * No HP-UX equiv for ONOEOT ! 196: */ ! 197: tios.c_oflag &= ~(OPOST|ONLCR|OXTABS); ! 198: if (tiop->c_oflag & TIO_OPOST) ! 199: tios.c_oflag |= OPOST; ! 200: if (tiop->c_oflag & TIO_ONLCR) ! 201: tios.c_oflag |= ONLCR; ! 202: if (tiop->c_oflag & TIO_TAB3) ! 203: tios.c_oflag |= OXTABS; ! 204: /* ! 205: * Set cflag. ! 206: * No HP-UX equiv for CCTS_OFLOW/CCTS_IFLOW/MDMBUF ! 207: */ ! 208: tios.c_cflag &= ! 209: ~(CSIZE|CSTOPB|CREAD|PARENB|PARODD|HUPCL|CLOCAL); ! 210: switch (tiop->c_cflag & TIO_CSIZE) { ! 211: case TIO_CS5: ! 212: tios.c_cflag |= CS5; break; ! 213: case TIO_CS6: ! 214: tios.c_cflag |= CS6; break; ! 215: case TIO_CS7: ! 216: tios.c_cflag |= CS7; break; ! 217: case TIO_CS8: ! 218: tios.c_cflag |= CS8; break; ! 219: } ! 220: if (tiop->c_cflag & TIO_CSTOPB) ! 221: tios.c_cflag |= CSTOPB; ! 222: if (tiop->c_cflag & TIO_CREAD) ! 223: tios.c_cflag |= CREAD; ! 224: if (tiop->c_cflag & TIO_PARENB) ! 225: tios.c_cflag |= PARENB; ! 226: if (tiop->c_cflag & TIO_PARODD) ! 227: tios.c_cflag |= PARODD; ! 228: if (tiop->c_cflag & TIO_HUPCL) ! 229: tios.c_cflag |= HUPCL; ! 230: if (tiop->c_cflag & TIO_CLOCAL) ! 231: tios.c_cflag |= CLOCAL; ! 232: /* ! 233: * Set lflag. ! 234: * No HP-UX equiv for ECHOKE/ECHOPRT/ECHOCTL ! 235: * IEXTEN treated as part of ICANON ! 236: */ ! 237: tios.c_lflag &= ~(ECHOE|ECHOK|ECHO|ISIG|ICANON|IEXTEN|NOFLSH); ! 238: if (tiop->c_lflag & TIO_ECHOE) ! 239: tios.c_lflag |= ECHOE; ! 240: if (tiop->c_lflag & TIO_ECHOK) ! 241: tios.c_lflag |= ECHOK; ! 242: if (tiop->c_lflag & TIO_ECHO) ! 243: tios.c_lflag |= ECHO; ! 244: if (tiop->c_lflag & TIO_ECHONL) ! 245: tios.c_lflag |= ECHONL; ! 246: if (tiop->c_lflag & TIO_ISIG) ! 247: tios.c_lflag |= ISIG; ! 248: if (tiop->c_lflag & TIO_ICANON) ! 249: tios.c_lflag |= (ICANON|IEXTEN); ! 250: if (tiop->c_lflag & TIO_NOFLSH) ! 251: tios.c_lflag |= NOFLSH; ! 252: /* ! 253: * Set editing chars. ! 254: * No HP-UX equivs of VEOL2/VWERASE/VREPRINT/VSUSP/VDSUSP ! 255: * VSTOP/VLNEXT/VDISCARD/VMIN/VTIME/VSTATUS/VERASE2 ! 256: */ ! 257: tios.c_cc[VINTR] = tiop->c_cc[HPUXVINTR]; ! 258: tios.c_cc[VQUIT] = tiop->c_cc[HPUXVQUIT]; ! 259: tios.c_cc[VERASE] = tiop->c_cc[HPUXVERASE]; ! 260: tios.c_cc[VKILL] = tiop->c_cc[HPUXVKILL]; ! 261: if (tios.c_lflag & ICANON) { ! 262: tios.c_cc[VEOF] = tiop->c_cc[HPUXVEOF]; ! 263: tios.c_cc[VEOL] = tiop->c_cc[HPUXVEOL]; ! 264: } else { ! 265: tios.c_cc[VMIN] = tiop->c_cc[HPUXVMIN]; ! 266: tios.c_cc[VTIME] = tiop->c_cc[HPUXVTIME]; ! 267: } ! 268: /* ! 269: * Set the new stuff ! 270: */ ! 271: if (com == HPUXTCSETA) ! 272: com = TIOCSETA; ! 273: else if (com == HPUXTCSETAW) ! 274: com = TIOCSETAW; ! 275: else ! 276: com = TIOCSETAF; ! 277: error = (*ioctlrout)(fp, com, (caddr_t)&tios, p); ! 278: if (error == 0) { ! 279: /* ! 280: * Set line discipline ! 281: */ ! 282: line = tiop->c_line; ! 283: (void) (*ioctlrout)(fp, TIOCSETD, (caddr_t)&line, p); ! 284: /* ! 285: * Set non-blocking IO if VMIN == VTIME == 0. ! 286: * Should handle the other cases as well. It also ! 287: * isn't correct to just turn it off as it could be ! 288: * on as the result of a fcntl operation. ! 289: * XXX - wouldn't need to do this at all if VMIN/VTIME ! 290: * were implemented. ! 291: */ ! 292: line = (tiop->c_cc[HPUXVMIN] == 0 && ! 293: tiop->c_cc[HPUXVTIME] == 0); ! 294: if (line) ! 295: fp->f_flag |= FNONBLOCK; ! 296: else ! 297: fp->f_flag &= ~FNONBLOCK; ! 298: (void) (*ioctlrout)(fp, FIONBIO, (caddr_t)&line, p); ! 299: } ! 300: break; ! 301: ! 302: default: ! 303: error = EINVAL; ! 304: break; ! 305: } ! 306: return(error); ! 307: } ! 308: ! 309: bsdtohpuxbaud(bsdspeed) ! 310: long bsdspeed; ! 311: { ! 312: switch (bsdspeed) { ! 313: case B0: return(TIO_B0); ! 314: case B50: return(TIO_B50); ! 315: case B75: return(TIO_B75); ! 316: case B110: return(TIO_B110); ! 317: case B134: return(TIO_B134); ! 318: case B150: return(TIO_B150); ! 319: case B200: return(TIO_B200); ! 320: case B300: return(TIO_B300); ! 321: case B600: return(TIO_B600); ! 322: case B1200: return(TIO_B1200); ! 323: case B1800: return(TIO_B1800); ! 324: case B2400: return(TIO_B2400); ! 325: case B4800: return(TIO_B4800); ! 326: case B9600: return(TIO_B9600); ! 327: case B19200: return(TIO_B19200); ! 328: case B38400: return(TIO_B38400); ! 329: default: return(TIO_B0); ! 330: } ! 331: } ! 332: ! 333: hpuxtobsdbaud(hpuxspeed) ! 334: int hpuxspeed; ! 335: { ! 336: static char hpuxtobsdbaudtab[32] = { ! 337: B0, B50, B75, B110, B134, B150, B200, B300, ! 338: B600, B0, B1200, B1800, B2400, B0, B4800, B0, ! 339: B9600, B19200, B38400, B0, B0, B0, B0, B0, ! 340: B0, B0, B0, B0, B0, B0, EXTA, EXTB ! 341: }; ! 342: ! 343: return(hpuxtobsdbaudtab[hpuxspeed & TIO_CBAUD]); ! 344: } ! 345: ! 346: /* #ifdef COMPAT */ ! 347: ohpuxgtty(p, uap, retval) ! 348: struct proc *p; ! 349: struct args { ! 350: int fdes; ! 351: caddr_t cmarg; ! 352: } *uap; ! 353: int *retval; ! 354: { ! 355: ! 356: return (getsettty(p, uap->fdes, HPUXTIOCGETP, uap->cmarg)); ! 357: } ! 358: ! 359: ohpuxstty(p, uap, retval) ! 360: struct proc *p; ! 361: struct args { ! 362: int fdes; ! 363: caddr_t cmarg; ! 364: } *uap; ! 365: int *retval; ! 366: { ! 367: ! 368: return (getsettty(p, uap->fdes, HPUXTIOCSETP, uap->cmarg)); ! 369: } ! 370: ! 371: /* ! 372: * Simplified version of ioctl() for use by ! 373: * gtty/stty and TIOCGETP/TIOCSETP. ! 374: */ ! 375: getsettty(p, fdes, com, cmarg) ! 376: struct proc *p; ! 377: int fdes, com; ! 378: caddr_t cmarg; ! 379: { ! 380: register struct filedesc *fdp = p->p_fd; ! 381: register struct file *fp; ! 382: struct hpuxsgttyb hsb; ! 383: struct sgttyb sb; ! 384: int error; ! 385: ! 386: if (((unsigned)fdes) >= fdp->fd_nfiles || ! 387: (fp = fdp->fd_ofiles[fdes]) == NULL) ! 388: return (EBADF); ! 389: if ((fp->f_flag & (FREAD|FWRITE)) == 0) ! 390: return (EBADF); ! 391: if (com == HPUXTIOCSETP) { ! 392: if (error = copyin(cmarg, (caddr_t)&hsb, sizeof hsb)) ! 393: return (error); ! 394: sb.sg_ispeed = hsb.sg_ispeed; ! 395: sb.sg_ospeed = hsb.sg_ospeed; ! 396: sb.sg_erase = hsb.sg_erase; ! 397: sb.sg_kill = hsb.sg_kill; ! 398: sb.sg_flags = hsb.sg_flags & ~(V7_HUPCL|V7_XTABS|V7_NOAL); ! 399: if (hsb.sg_flags & V7_XTABS) ! 400: sb.sg_flags |= XTABS; ! 401: if (hsb.sg_flags & V7_HUPCL) ! 402: (void)(*fp->f_ops->fo_ioctl) ! 403: (fp, TIOCHPCL, (caddr_t)0, p); ! 404: com = TIOCSETP; ! 405: } else { ! 406: bzero((caddr_t)&hsb, sizeof hsb); ! 407: com = TIOCGETP; ! 408: } ! 409: error = (*fp->f_ops->fo_ioctl)(fp, com, (caddr_t)&sb, p); ! 410: if (error == 0 && com == TIOCGETP) { ! 411: hsb.sg_ispeed = sb.sg_ispeed; ! 412: hsb.sg_ospeed = sb.sg_ospeed; ! 413: hsb.sg_erase = sb.sg_erase; ! 414: hsb.sg_kill = sb.sg_kill; ! 415: hsb.sg_flags = sb.sg_flags & ~(V7_HUPCL|V7_XTABS|V7_NOAL); ! 416: if (sb.sg_flags & XTABS) ! 417: hsb.sg_flags |= V7_XTABS; ! 418: error = copyout((caddr_t)&hsb, cmarg, sizeof hsb); ! 419: } ! 420: return (error); ! 421: } ! 422: /* #endif */ ! 423: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.