Annotation of Net2/kern/tty_compat.c, revision 1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.