[BACK]Return to tty_43.c CVS log [TXT][DIR] Up to [local] / sys / compat / common

Annotation of sys/compat/common/tty_43.c, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: tty_43.c,v 1.9 2004/09/19 21:34:42 mickey Exp $       */
                      2: /*     $NetBSD: tty_43.c,v 1.5 1996/05/20 14:29:17 mark Exp $  */
                      3:
                      4: /*-
                      5:  * Copyright (c) 1982, 1986, 1991, 1993
                      6:  *     The Regents of the University of California.  All rights reserved.
                      7:  *
                      8:  * Redistribution and use in source and binary forms, with or without
                      9:  * modification, are permitted provided that the following conditions
                     10:  * are met:
                     11:  * 1. Redistributions of source code must retain the above copyright
                     12:  *    notice, this list of conditions and the following disclaimer.
                     13:  * 2. Redistributions in binary form must reproduce the above copyright
                     14:  *    notice, this list of conditions and the following disclaimer in the
                     15:  *    documentation and/or other materials provided with the distribution.
                     16:  * 3. Neither the name of the University nor the names of its contributors
                     17:  *    may be used to endorse or promote products derived from this software
                     18:  *    without specific prior written permission.
                     19:  *
                     20:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
                     21:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     22:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     23:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
                     24:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     25:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     26:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     27:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     28:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     29:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     30:  * SUCH DAMAGE.
                     31:  *
                     32:  *     @(#)tty_compat.c        8.1 (Berkeley) 6/10/93
                     33:  */
                     34:
                     35: /*
                     36:  * mapping routines for old line discipline (yuck)
                     37:  */
                     38: #include <sys/param.h>
                     39: #include <sys/systm.h>
                     40: #include <sys/ioctl.h>
                     41: #include <sys/proc.h>
                     42: #include <sys/tty.h>
                     43: #include <sys/termios.h>
                     44: #include <sys/file.h>
                     45: #include <sys/conf.h>
                     46: #include <sys/kernel.h>
                     47: #include <sys/syslog.h>
                     48: #include <sys/ioctl_compat.h>
                     49:
                     50: /*
                     51:  * XXX libcompat files should be included with config attributes
                     52:  */
                     53: #ifdef COMPAT_OLDTTY
                     54:
                     55: int ttydebug = 0;
                     56:
                     57: static const struct speedtab compatspeeds[] = {
                     58: #define MAX_SPEED      17
                     59:        { 115200, 17 },
                     60:        { 57600, 16 },
                     61:        { 38400, 15 },
                     62:        { 19200, 14 },
                     63:        { 9600, 13 },
                     64:        { 4800, 12 },
                     65:        { 2400, 11 },
                     66:        { 1800, 10 },
                     67:        { 1200, 9 },
                     68:        { 600,  8 },
                     69:        { 300,  7 },
                     70:        { 200,  6 },
                     71:        { 150,  5 },
                     72:        { 134,  4 },
                     73:        { 110,  3 },
                     74:        { 75,   2 },
                     75:        { 50,   1 },
                     76:        { 0,    0 },
                     77:        { -1,   -1 },
                     78: };
                     79: static const int compatspcodes[] = {
                     80:        0, 50, 75, 110, 134, 150, 200, 300, 600, 1200,
                     81:        1800, 2400, 4800, 9600, 19200, 38400, 57600, 115200
                     82: };
                     83:
                     84: int ttcompatgetflags(struct tty *);
                     85: void ttcompatsetflags(struct tty *, struct termios *);
                     86: void ttcompatsetlflags(struct tty *, struct termios *);
                     87:
                     88: /*ARGSUSED*/
                     89: int
                     90: ttcompat(tp, com, data, flag, p)
                     91:        register struct tty *tp;
                     92:        u_long com;
                     93:        caddr_t data;
                     94:        int flag;
                     95:        struct proc *p;
                     96: {
                     97:
                     98:        switch (com) {
                     99:        case TIOCGETP: {
                    100:                register struct sgttyb *sg = (struct sgttyb *)data;
                    101:                register u_char *cc = tp->t_cc;
                    102:                register int speed;
                    103:
                    104:                speed = ttspeedtab(tp->t_ospeed, compatspeeds);
                    105:                sg->sg_ospeed = (speed == -1) ? MAX_SPEED : speed;
                    106:                if (tp->t_ispeed == 0)
                    107:                        sg->sg_ispeed = sg->sg_ospeed;
                    108:                else {
                    109:                        speed = ttspeedtab(tp->t_ispeed, compatspeeds);
                    110:                        sg->sg_ispeed = (speed == -1) ? MAX_SPEED : speed;
                    111:                }
                    112:                sg->sg_erase = cc[VERASE];
                    113:                sg->sg_kill = cc[VKILL];
                    114:                sg->sg_flags = ttcompatgetflags(tp);
                    115:                break;
                    116:        }
                    117:
                    118:        case TIOCSETP:
                    119:        case TIOCSETN: {
                    120:                register struct sgttyb *sg = (struct sgttyb *)data;
                    121:                struct termios term;
                    122:                int speed;
                    123:
                    124:                term = tp->t_termios;
                    125:                if ((speed = sg->sg_ispeed) > MAX_SPEED || speed < 0)
                    126:                        term.c_ispeed = speed;
                    127:                else
                    128:                        term.c_ispeed = compatspcodes[speed];
                    129:                if ((speed = sg->sg_ospeed) > MAX_SPEED || speed < 0)
                    130:                        term.c_ospeed = speed;
                    131:                else
                    132:                        term.c_ospeed = compatspcodes[speed];
                    133:                term.c_cc[VERASE] = sg->sg_erase;
                    134:                term.c_cc[VKILL] = sg->sg_kill;
                    135:                tp->t_flags = (ttcompatgetflags(tp)&0xffff0000) | (sg->sg_flags&0xffff);
                    136:                ttcompatsetflags(tp, &term);
                    137:                return (ttioctl(tp, com == TIOCSETP ? TIOCSETAF : TIOCSETA,
                    138:                        (caddr_t)&term, flag, p));
                    139:        }
                    140:
                    141:        case TIOCGETC: {
                    142:                struct tchars *tc = (struct tchars *)data;
                    143:                register u_char *cc = tp->t_cc;
                    144:
                    145:                tc->t_intrc = cc[VINTR];
                    146:                tc->t_quitc = cc[VQUIT];
                    147:                tc->t_startc = cc[VSTART];
                    148:                tc->t_stopc = cc[VSTOP];
                    149:                tc->t_eofc = cc[VEOF];
                    150:                tc->t_brkc = cc[VEOL];
                    151:                break;
                    152:        }
                    153:        case TIOCSETC: {
                    154:                struct tchars *tc = (struct tchars *)data;
                    155:                register u_char *cc = tp->t_cc;
                    156:
                    157:                cc[VINTR] = tc->t_intrc;
                    158:                cc[VQUIT] = tc->t_quitc;
                    159:                cc[VSTART] = tc->t_startc;
                    160:                cc[VSTOP] = tc->t_stopc;
                    161:                cc[VEOF] = tc->t_eofc;
                    162:                cc[VEOL] = tc->t_brkc;
                    163:                if (tc->t_brkc == (char)-1)
                    164:                        cc[VEOL2] = _POSIX_VDISABLE;
                    165:                break;
                    166:        }
                    167:        case TIOCSLTC: {
                    168:                struct ltchars *ltc = (struct ltchars *)data;
                    169:                register u_char *cc = tp->t_cc;
                    170:
                    171:                cc[VSUSP] = ltc->t_suspc;
                    172:                cc[VDSUSP] = ltc->t_dsuspc;
                    173:                cc[VREPRINT] = ltc->t_rprntc;
                    174:                cc[VDISCARD] = ltc->t_flushc;
                    175:                cc[VWERASE] = ltc->t_werasc;
                    176:                cc[VLNEXT] = ltc->t_lnextc;
                    177:                break;
                    178:        }
                    179:        case TIOCGLTC: {
                    180:                struct ltchars *ltc = (struct ltchars *)data;
                    181:                register u_char *cc = tp->t_cc;
                    182:
                    183:                ltc->t_suspc = cc[VSUSP];
                    184:                ltc->t_dsuspc = cc[VDSUSP];
                    185:                ltc->t_rprntc = cc[VREPRINT];
                    186:                ltc->t_flushc = cc[VDISCARD];
                    187:                ltc->t_werasc = cc[VWERASE];
                    188:                ltc->t_lnextc = cc[VLNEXT];
                    189:                break;
                    190:        }
                    191:        case TIOCLBIS:
                    192:        case TIOCLBIC:
                    193:        case TIOCLSET: {
                    194:                struct termios term;
                    195:                int flags;
                    196:
                    197:                term = tp->t_termios;
                    198:                flags = ttcompatgetflags(tp);
                    199:                switch (com) {
                    200:                case TIOCLSET:
                    201:                        tp->t_flags = (flags&0xffff) | (*(int *)data<<16);
                    202:                        break;
                    203:                case TIOCLBIS:
                    204:                        tp->t_flags = flags | (*(int *)data<<16);
                    205:                        break;
                    206:                case TIOCLBIC:
                    207:                        tp->t_flags = flags & ~(*(int *)data<<16);
                    208:                        break;
                    209:                }
                    210:                ttcompatsetlflags(tp, &term);
                    211:                return (ttioctl(tp, TIOCSETA, (caddr_t)&term, flag, p));
                    212:        }
                    213:        case TIOCLGET:
                    214:                *(int *)data = ttcompatgetflags(tp)>>16;
                    215:                if (ttydebug)
                    216:                        printf("CLGET: returning %x\n", *(int *)data);
                    217:                break;
                    218:
                    219:        case OTIOCGETD:
                    220:                *(int *)data = tp->t_line ? tp->t_line : 2;
                    221:                break;
                    222:
                    223:        case OTIOCSETD: {
                    224:                int ldisczero = 0;
                    225:
                    226:                return (ttioctl(tp, TIOCSETD,
                    227:                        *(int *)data == 2 ? (caddr_t)&ldisczero : data, flag,
                    228:                        p));
                    229:            }
                    230:
                    231:        case OTIOCCONS:
                    232:                *(int *)data = 1;
                    233:                return (ttioctl(tp, TIOCCONS, data, flag, p));
                    234:
                    235:        case TIOCHPCL:
                    236:                SET(tp->t_cflag, HUPCL);
                    237:                break;
                    238:
                    239:        case TIOCGSID:
                    240:                if (tp->t_session == NULL)
                    241:                        return ENOTTY;
                    242:
                    243:                if (tp->t_session->s_leader == NULL)
                    244:                        return ENOTTY;
                    245:
                    246:                *(int *) data =  tp->t_session->s_leader->p_pid;
                    247:                break;
                    248:
                    249:        default:
                    250:                return (-1);
                    251:        }
                    252:        return (0);
                    253: }
                    254:
                    255: int
                    256: ttcompatgetflags(tp)
                    257:        register struct tty *tp;
                    258: {
                    259:        register tcflag_t iflag = tp->t_iflag;
                    260:        register tcflag_t lflag = tp->t_lflag;
                    261:        register tcflag_t oflag = tp->t_oflag;
                    262:        register tcflag_t cflag = tp->t_cflag;
                    263:        register int flags = 0;
                    264:
                    265:        if (ISSET(iflag, IXOFF))
                    266:                SET(flags, TANDEM);
                    267:        if (ISSET(iflag, ICRNL) || ISSET(oflag, ONLCR))
                    268:                SET(flags, CRMOD);
                    269:        if (ISSET(cflag, PARENB)) {
                    270:                if (ISSET(iflag, INPCK)) {
                    271:                        if (ISSET(cflag, PARODD))
                    272:                                SET(flags, ODDP);
                    273:                        else
                    274:                                SET(flags, EVENP);
                    275:                } else
                    276:                        SET(flags, ANYP);
                    277:        }
                    278:
                    279:        if (!ISSET(lflag, ICANON)) {
                    280:                /* fudge */
                    281:                if (ISSET(iflag, IXON) || ISSET(lflag, ISIG|IEXTEN) ||
                    282:                    ISSET(cflag, PARENB))
                    283:                        SET(flags, CBREAK);
                    284:                else
                    285:                        SET(flags, RAW);
                    286:        }
                    287:
                    288:        if (ISSET(flags, RAW))
                    289:                SET(flags, ISSET(tp->t_flags, LITOUT|PASS8));
                    290:        else if (ISSET(cflag, CSIZE) == CS8) {
                    291:                if (!ISSET(oflag, OPOST))
                    292:                        SET(flags, LITOUT);
                    293:                if (!ISSET(iflag, ISTRIP))
                    294:                        SET(flags, PASS8);
                    295:        }
                    296:
                    297:        if (ISSET(cflag, MDMBUF))
                    298:                SET(flags, MDMBUF);
                    299:        if (!ISSET(cflag, HUPCL))
                    300:                SET(flags, NOHANG);
                    301:        if (ISSET(cflag, XCASE) && ISSET(iflag, IUCLC) && ISSET(oflag, OLCUC))
                    302:                SET(flags, LCASE);
                    303:        if (ISSET(oflag, OXTABS))
                    304:                SET(flags, XTABS);
                    305:        if (ISSET(lflag, ECHOE))
                    306:                SET(flags, CRTERA|CRTBS);
                    307:        if (ISSET(lflag, ECHOKE))
                    308:                SET(flags, CRTKIL|CRTBS);
                    309:        if (ISSET(lflag, ECHOPRT))
                    310:                SET(flags, PRTERA);
                    311:        if (ISSET(lflag, ECHOCTL))
                    312:                SET(flags, CTLECH);
                    313:        if (!ISSET(iflag, IXANY))
                    314:                SET(flags, DECCTQ);
                    315:        SET(flags, ISSET(lflag, ECHO|TOSTOP|FLUSHO|PENDIN|NOFLSH));
                    316:        if (ttydebug)
                    317:                printf("getflags: %x\n", flags);
                    318:        return (flags);
                    319: }
                    320:
                    321: void
                    322: ttcompatsetflags(tp, t)
                    323:        register struct tty *tp;
                    324:        register struct termios *t;
                    325: {
                    326:        register int flags = tp->t_flags;
                    327:        register tcflag_t iflag = t->c_iflag;
                    328:        register tcflag_t oflag = t->c_oflag;
                    329:        register tcflag_t lflag = t->c_lflag;
                    330:        register tcflag_t cflag = t->c_cflag;
                    331:
                    332:        if (ISSET(flags, TANDEM))
                    333:                SET(iflag, IXOFF);
                    334:        else
                    335:                CLR(iflag, IXOFF);
                    336:        if (ISSET(flags, ECHO))
                    337:                SET(lflag, ECHO);
                    338:        else
                    339:                CLR(lflag, ECHO);
                    340:        if (ISSET(flags, CRMOD)) {
                    341:                SET(iflag, ICRNL);
                    342:                SET(oflag, ONLCR);
                    343:        } else {
                    344:                CLR(iflag, ICRNL);
                    345:                CLR(oflag, ONLCR);
                    346:        }
                    347:        if (ISSET(flags, XTABS))
                    348:                SET(oflag, OXTABS);
                    349:        else
                    350:                CLR(oflag, OXTABS);
                    351:        if (ISSET(flags, LCASE)) {
                    352:                SET(iflag, IUCLC);
                    353:                SET(oflag, OLCUC);
                    354:                SET(cflag, XCASE);
                    355:        }
                    356:        else {
                    357:                CLR(iflag, IUCLC);
                    358:                CLR(oflag, OLCUC);
                    359:                CLR(cflag, XCASE);
                    360:        }
                    361:
                    362:
                    363:        if (ISSET(flags, RAW)) {
                    364:                iflag &= IXOFF|IXANY;
                    365:                CLR(lflag, ISIG|ICANON|IEXTEN);
                    366:                CLR(cflag, PARENB);
                    367:        } else {
                    368:                SET(iflag, BRKINT|IXON|IMAXBEL);
                    369:                SET(lflag, ISIG|IEXTEN);
                    370:                if (ISSET(flags, CBREAK))
                    371:                        CLR(lflag, ICANON);
                    372:                else
                    373:                        SET(lflag, ICANON);
                    374:                switch (ISSET(flags, ANYP)) {
                    375:                case 0:
                    376:                        CLR(cflag, PARENB);
                    377:                        break;
                    378:                case ANYP:
                    379:                        SET(cflag, PARENB);
                    380:                        CLR(iflag, INPCK);
                    381:                        break;
                    382:                case EVENP:
                    383:                        SET(cflag, PARENB);
                    384:                        SET(iflag, INPCK);
                    385:                        CLR(cflag, PARODD);
                    386:                        break;
                    387:                case ODDP:
                    388:                        SET(cflag, PARENB);
                    389:                        SET(iflag, INPCK);
                    390:                        SET(cflag, PARODD);
                    391:                        break;
                    392:                }
                    393:        }
                    394:
                    395:        if (ISSET(flags, RAW|LITOUT|PASS8)) {
                    396:                CLR(cflag, CSIZE|XCASE);
                    397:                SET(cflag, CS8);
                    398:                if (!ISSET(flags, RAW|PASS8))
                    399:                        SET(iflag, ISTRIP);
                    400:                else
                    401:                        CLR(iflag, ISTRIP);
                    402:                if (!ISSET(flags, RAW|LITOUT))
                    403:                        SET(oflag, OPOST);
                    404:                else
                    405:                        CLR(oflag, OPOST);
                    406:        } else {
                    407:                CLR(cflag, CSIZE);
                    408:                SET(cflag, CS7);
                    409:                if (ISSET(iflag, IUCLC) && ISSET(oflag, OLCUC))
                    410:                        SET(cflag, XCASE);
                    411:                SET(iflag, ISTRIP);
                    412:                SET(oflag, OPOST);
                    413:        }
                    414:
                    415:        t->c_iflag = iflag;
                    416:        t->c_oflag = oflag;
                    417:        t->c_lflag = lflag;
                    418:        t->c_cflag = cflag;
                    419: }
                    420:
                    421: void
                    422: ttcompatsetlflags(tp, t)
                    423:        register struct tty *tp;
                    424:        register struct termios *t;
                    425: {
                    426:        register int flags = tp->t_flags;
                    427:        register tcflag_t iflag = t->c_iflag;
                    428:        register tcflag_t oflag = t->c_oflag;
                    429:        register tcflag_t lflag = t->c_lflag;
                    430:        register tcflag_t cflag = t->c_cflag;
                    431:
                    432:        /* Nothing we can do with CRTBS. */
                    433:        if (ISSET(flags, PRTERA))
                    434:                SET(lflag, ECHOPRT);
                    435:        else
                    436:                CLR(lflag, ECHOPRT);
                    437:        if (ISSET(flags, CRTERA))
                    438:                SET(lflag, ECHOE);
                    439:        else
                    440:                CLR(lflag, ECHOE);
                    441:        /* Nothing we can do with TILDE. */
                    442:        if (ISSET(flags, MDMBUF))
                    443:                SET(cflag, MDMBUF);
                    444:        else
                    445:                CLR(cflag, MDMBUF);
                    446:        if (ISSET(flags, NOHANG))
                    447:                CLR(cflag, HUPCL);
                    448:        else
                    449:                SET(cflag, HUPCL);
                    450:        if (ISSET(flags, CRTKIL))
                    451:                SET(lflag, ECHOKE);
                    452:        else
                    453:                CLR(lflag, ECHOKE);
                    454:        if (ISSET(flags, CTLECH))
                    455:                SET(lflag, ECHOCTL);
                    456:        else
                    457:                CLR(lflag, ECHOCTL);
                    458:        if (!ISSET(flags, DECCTQ))
                    459:                SET(iflag, IXANY);
                    460:        else
                    461:                CLR(iflag, IXANY);
                    462:        if (ISSET(flags, LCASE)) {
                    463:                SET(oflag, OLCUC);
                    464:                SET(iflag, IUCLC);
                    465:                SET(cflag, XCASE);
                    466:        }
                    467:        CLR(lflag, TOSTOP|FLUSHO|PENDIN|NOFLSH);
                    468:        SET(lflag, ISSET(flags, TOSTOP|FLUSHO|PENDIN|NOFLSH));
                    469:
                    470:        if (ISSET(flags, RAW|LITOUT|PASS8)) {
                    471:                CLR(cflag, CSIZE);
                    472:                SET(cflag, CS8);
                    473:                if (!ISSET(flags, RAW|PASS8))
                    474:                        SET(iflag, ISTRIP);
                    475:                else
                    476:                        CLR(iflag, ISTRIP);
                    477:                if (!ISSET(flags, RAW|LITOUT))
                    478:                        SET(oflag, OPOST);
                    479:                else {
                    480:                        CLR(oflag, OPOST);
                    481:                        CLR(cflag, XCASE);
                    482:                }
                    483:        } else {
                    484:                CLR(cflag, CSIZE);
                    485:                SET(cflag, CS7);
                    486:                SET(iflag, ISTRIP);
                    487:                SET(oflag, OPOST);
                    488:                if (ISSET(oflag, OLCUC) && ISSET(iflag, IUCLC))
                    489:                        SET(cflag, XCASE);
                    490:        }
                    491:
                    492:        t->c_iflag = iflag;
                    493:        t->c_oflag = oflag;
                    494:        t->c_lflag = lflag;
                    495:        t->c_cflag = cflag;
                    496: }
                    497:
                    498: #endif /* COMPAT_OLDTTY */

CVSweb