Annotation of XNU/bsd/kern/tty_compat.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
        !             3:  *
        !             4:  * @APPLE_LICENSE_HEADER_START@
        !             5:  * 
        !             6:  * The contents of this file constitute Original Code as defined in and
        !             7:  * are subject to the Apple Public Source License Version 1.1 (the
        !             8:  * "License").  You may not use this file except in compliance with the
        !             9:  * License.  Please obtain a copy of the License at
        !            10:  * http://www.apple.com/publicsource and read it before using this file.
        !            11:  * 
        !            12:  * This Original Code and all software distributed under the License are
        !            13:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
        !            14:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
        !            15:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
        !            16:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
        !            17:  * License for the specific language governing rights and limitations
        !            18:  * under the License.
        !            19:  * 
        !            20:  * @APPLE_LICENSE_HEADER_END@
        !            21:  */
        !            22: /* Copyright (c) 1997 Apple Computer, Inc. All Rights Reserved */
        !            23: /*-
        !            24:  * Copyright (c) 1982, 1986, 1991, 1993
        !            25:  *      The Regents of the University of California.  All rights reserved.
        !            26:  *
        !            27:  * Redistribution and use in source and binary forms, with or without
        !            28:  * modification, are permitted provided that the following conditions
        !            29:  * are met:
        !            30:  * 1. Redistributions of source code must retain the above copyright
        !            31:  *    notice, this list of conditions and the following disclaimer.
        !            32:  * 2. Redistributions in binary form must reproduce the above copyright
        !            33:  *    notice, this list of conditions and the following disclaimer in the
        !            34:  *    documentation and/or other materials provided with the distribution.
        !            35:  * 3. All advertising materials mentioning features or use of this software
        !            36:  *    must display the following acknowledgement:
        !            37:  *      This product includes software developed by the University of
        !            38:  *      California, Berkeley and its contributors.
        !            39:  * 4. Neither the name of the University nor the names of its contributors
        !            40:  *    may be used to endorse or promote products derived from this software
        !            41:  *    without specific prior written permission.
        !            42:  *
        !            43:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
        !            44:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
        !            45:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
        !            46:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
        !            47:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
        !            48:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
        !            49:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
        !            50:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
        !            51:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
        !            52:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
        !            53:  * SUCH DAMAGE.
        !            54:  *
        !            55:  *      @(#)tty_compat.c        8.1 (Berkeley) 6/10/93
        !            56:  */
        !            57: 
        !            58: /*
        !            59:  * mapping routines for old line discipline (yuck)
        !            60:  */
        !            61: 
        !            62: #include <sys/param.h>
        !            63: #include <sys/systm.h>
        !            64: #include <sys/ioctl.h>
        !            65: #include <sys/proc.h>
        !            66: #include <sys/tty.h>
        !            67: #include <sys/termios.h>
        !            68: #include <sys/file.h>
        !            69: #include <sys/conf.h>
        !            70: #include <sys/kernel.h>
        !            71: #include <sys/sysctl.h>
        !            72: #include <sys/syslog.h>
        !            73: 
        !            74: /* NeXT Move define down here cause COMPAT_43 not valid earlier */
        !            75: #if COMPAT_43 || defined(COMPAT_SUNOS)
        !            76: 
        !            77: static int ttcompatgetflags    __P((struct tty *tp));
        !            78: static void ttcompatsetflags   __P((struct tty *tp, struct termios *t));
        !            79: static void ttcompatsetlflags  __P((struct tty *tp, struct termios *t));
        !            80: static int ttcompatspeedtab    __P((int speed, struct speedtab *table));
        !            81: 
        !            82: 
        !            83: static int ttydebug = 0;
        !            84: 
        !            85: #ifndef NeXT
        !            86: SYSCTL_INT(_debug, OID_AUTO, ttydebug, CTLFLAG_RW, &ttydebug, 0, "");
        !            87: #endif
        !            88: 
        !            89: static struct speedtab compatspeeds[] = {
        !            90: #define MAX_SPEED      17
        !            91:        { 115200, 17 },
        !            92:        { 57600, 16 },
        !            93:        { 38400, 15 },
        !            94:        { 19200, 14 },
        !            95:        { 9600, 13 },
        !            96:        { 4800, 12 },
        !            97:        { 2400, 11 },
        !            98:        { 1800, 10 },
        !            99:        { 1200, 9 },
        !           100:        { 600,  8 },
        !           101:        { 300,  7 },
        !           102:        { 200,  6 },
        !           103:        { 150,  5 },
        !           104:        { 134,  4 },
        !           105:        { 110,  3 },
        !           106:        { 75,   2 },
        !           107:        { 50,   1 },
        !           108:        { 0,    0 },
        !           109:        { -1,   -1 },
        !           110: };
        !           111: static int compatspcodes[] = {
        !           112:        0, 50, 75, 110, 134, 150, 200, 300, 600, 1200,
        !           113:        1800, 2400, 4800, 9600, 19200, 38400, 57600, 115200,
        !           114: };
        !           115: 
        !           116: static int
        !           117: ttcompatspeedtab(speed, table)
        !           118:        int speed;
        !           119:        register struct speedtab *table;
        !           120: {
        !           121:        if (speed == 0)
        !           122:                return (0); /* hangup */
        !           123:        for ( ; table->sp_speed > 0; table++)
        !           124:                if (table->sp_speed <= speed) /* nearest one, rounded down */
        !           125:                        return (table->sp_code);
        !           126:        return (1); /* 50, min and not hangup */
        !           127: }
        !           128: 
        !           129: #ifndef NeXT
        !           130: int
        !           131: ttsetcompat(tp, com, data, term)
        !           132:        register struct tty *tp;
        !           133:        int *com;
        !           134:        caddr_t data;
        !           135:        struct termios *term;
        !           136: #else
        !           137: __private_extern__ int
        !           138: ttsetcompat(tp, com, data, term)
        !           139:        register struct tty *tp;
        !           140:        u_long *com;
        !           141:        caddr_t data;
        !           142:        struct termios *term;
        !           143: #endif /* !NeXT */
        !           144: {
        !           145:        switch (*com) {
        !           146:        case TIOCSETP:
        !           147:        case TIOCSETN: {
        !           148:                register struct sgttyb *sg = (struct sgttyb *)data;
        !           149:                int speed;
        !           150: 
        !           151:                if ((speed = sg->sg_ispeed) > MAX_SPEED || speed < 0)
        !           152:                        return(EINVAL);
        !           153:                else if (speed != ttcompatspeedtab(tp->t_ispeed, compatspeeds))
        !           154:                        term->c_ispeed = compatspcodes[speed];
        !           155:                else
        !           156:                        term->c_ispeed = tp->t_ispeed;
        !           157:                if ((speed = sg->sg_ospeed) > MAX_SPEED || speed < 0)
        !           158:                        return(EINVAL);
        !           159:                else if (speed != ttcompatspeedtab(tp->t_ospeed, compatspeeds))
        !           160:                        term->c_ospeed = compatspcodes[speed];
        !           161:                else
        !           162:                        term->c_ospeed = tp->t_ospeed;
        !           163:                term->c_cc[VERASE] = sg->sg_erase;
        !           164:                term->c_cc[VKILL] = sg->sg_kill;
        !           165:                tp->t_flags = (tp->t_flags&0xffff0000) | (sg->sg_flags&0xffff);
        !           166:                ttcompatsetflags(tp, term);
        !           167:                *com = (*com == TIOCSETP) ? TIOCSETAF : TIOCSETA;
        !           168:                break;
        !           169:        }
        !           170:        case TIOCSETC: {
        !           171:                struct tchars *tc = (struct tchars *)data;
        !           172:                register cc_t *cc;
        !           173: 
        !           174:                cc = term->c_cc;
        !           175:                cc[VINTR] = tc->t_intrc;
        !           176:                cc[VQUIT] = tc->t_quitc;
        !           177:                cc[VSTART] = tc->t_startc;
        !           178:                cc[VSTOP] = tc->t_stopc;
        !           179:                cc[VEOF] = tc->t_eofc;
        !           180:                cc[VEOL] = tc->t_brkc;
        !           181:                if (tc->t_brkc == -1)
        !           182:                        cc[VEOL2] = _POSIX_VDISABLE;
        !           183:                *com = TIOCSETA;
        !           184:                break;
        !           185:        }
        !           186:        case TIOCSLTC: {
        !           187:                struct ltchars *ltc = (struct ltchars *)data;
        !           188:                register cc_t *cc;
        !           189: 
        !           190:                cc = term->c_cc;
        !           191:                cc[VSUSP] = ltc->t_suspc;
        !           192:                cc[VDSUSP] = ltc->t_dsuspc;
        !           193:                cc[VREPRINT] = ltc->t_rprntc;
        !           194:                cc[VDISCARD] = ltc->t_flushc;
        !           195:                cc[VWERASE] = ltc->t_werasc;
        !           196:                cc[VLNEXT] = ltc->t_lnextc;
        !           197:                *com = TIOCSETA;
        !           198:                break;
        !           199:        }
        !           200:        case TIOCLBIS:
        !           201:        case TIOCLBIC:
        !           202:        case TIOCLSET:
        !           203:                if (*com == TIOCLSET)
        !           204:                        tp->t_flags = (tp->t_flags&0xffff) | *(int *)data<<16;
        !           205:                else {
        !           206:                        tp->t_flags =
        !           207:                         (ttcompatgetflags(tp)&0xffff0000)|(tp->t_flags&0xffff);
        !           208:                        if (*com == TIOCLBIS)
        !           209:                                tp->t_flags |= *(int *)data<<16;
        !           210:                        else
        !           211:                                tp->t_flags &= ~(*(int *)data<<16);
        !           212:                }
        !           213:                ttcompatsetlflags(tp, term);
        !           214:                *com = TIOCSETA;
        !           215:                break;
        !           216:        }
        !           217:        return 0;
        !           218: }
        !           219: 
        !           220: /*ARGSUSED*/
        !           221: #ifndef NeXT
        !           222: int
        !           223: ttcompat(tp, com, data, flag)
        !           224:        register struct tty *tp;
        !           225:        int com;
        !           226:        caddr_t data;
        !           227:        int flag;
        !           228: #else
        !           229: __private_extern__ int
        !           230: ttcompat(tp, com, data, flag, p)
        !           231:        register struct tty *tp;
        !           232:        u_long com;
        !           233:        caddr_t data;
        !           234:        int flag;
        !           235:        struct proc *p;
        !           236: #endif /* !NeXT */
        !           237: {
        !           238:        switch (com) {
        !           239:        case TIOCSETP:
        !           240:        case TIOCSETN:
        !           241:        case TIOCSETC:
        !           242:        case TIOCSLTC:
        !           243:        case TIOCLBIS:
        !           244:        case TIOCLBIC:
        !           245:        case TIOCLSET: {
        !           246:                struct termios term;
        !           247:                int error;
        !           248: 
        !           249:                term = tp->t_termios;
        !           250:                if ((error = ttsetcompat(tp, &com, data, &term)) != 0)
        !           251:                        return error;
        !           252: #ifdef NeXT
        !           253:                return ttioctl(tp, com, (caddr_t) &term, flag, p);
        !           254: #else
        !           255:                return ttioctl(tp, com, &term, flag);
        !           256: #endif
        !           257:        }
        !           258:        case TIOCGETP: {
        !           259:                register struct sgttyb *sg = (struct sgttyb *)data;
        !           260:                register cc_t *cc = tp->t_cc;
        !           261: 
        !           262:                sg->sg_ospeed = ttcompatspeedtab(tp->t_ospeed, compatspeeds);
        !           263:                if (tp->t_ispeed == 0)
        !           264:                        sg->sg_ispeed = sg->sg_ospeed;
        !           265:                else
        !           266:                        sg->sg_ispeed = ttcompatspeedtab(tp->t_ispeed, compatspeeds);
        !           267:                sg->sg_erase = cc[VERASE];
        !           268:                sg->sg_kill = cc[VKILL];
        !           269:                sg->sg_flags = tp->t_flags = ttcompatgetflags(tp);
        !           270:                break;
        !           271:        }
        !           272:        case TIOCGETC: {
        !           273:                struct tchars *tc = (struct tchars *)data;
        !           274:                register cc_t *cc = tp->t_cc;
        !           275: 
        !           276:                tc->t_intrc = cc[VINTR];
        !           277:                tc->t_quitc = cc[VQUIT];
        !           278:                tc->t_startc = cc[VSTART];
        !           279:                tc->t_stopc = cc[VSTOP];
        !           280:                tc->t_eofc = cc[VEOF];
        !           281:                tc->t_brkc = cc[VEOL];
        !           282:                break;
        !           283:        }
        !           284:        case TIOCGLTC: {
        !           285:                struct ltchars *ltc = (struct ltchars *)data;
        !           286:                register cc_t *cc = tp->t_cc;
        !           287: 
        !           288:                ltc->t_suspc = cc[VSUSP];
        !           289:                ltc->t_dsuspc = cc[VDSUSP];
        !           290:                ltc->t_rprntc = cc[VREPRINT];
        !           291:                ltc->t_flushc = cc[VDISCARD];
        !           292:                ltc->t_werasc = cc[VWERASE];
        !           293:                ltc->t_lnextc = cc[VLNEXT];
        !           294:                break;
        !           295:        }
        !           296:        case TIOCLGET:
        !           297:                tp->t_flags =
        !           298:                 (ttcompatgetflags(tp) & 0xffff0000UL)
        !           299:                   | (tp->t_flags & 0xffff);
        !           300:                *(int *)data = tp->t_flags>>16;
        !           301: #ifndef NeXT
        !           302:                if (ttydebug)
        !           303:                        printf("CLGET: returning %x\n", *(int *)data);
        !           304: #endif
        !           305:                break;
        !           306: 
        !           307:        case OTIOCGETD:
        !           308:                *(int *)data = tp->t_line ? tp->t_line : 2;
        !           309:                break;
        !           310: 
        !           311: #ifndef NeXT
        !           312:        case OTIOCSETD: {
        !           313:                int ldisczero = 0;
        !           314: 
        !           315:                return (ttioctl(tp, TIOCSETD,
        !           316:                        *(int *)data == 2 ? (caddr_t)&ldisczero : data, flag));
        !           317:            }
        !           318: 
        !           319:        case OTIOCCONS:
        !           320:                *(int *)data = 1;
        !           321:                return (ttioctl(tp, TIOCCONS, data, flag));
        !           322: #else
        !           323:        case OTIOCSETD: {
        !           324:                int ldisczero = 0;
        !           325: 
        !           326:                return (ttioctl(tp, TIOCSETD, 
        !           327:                    *(int *)data == 2 ? (caddr_t)&ldisczero : data, flag, p));
        !           328:            }
        !           329: 
        !           330:        case OTIOCCONS:
        !           331:                *(int *)data = 1;
        !           332:                return (ttioctl(tp, TIOCCONS, data, flag, p));
        !           333: 
        !           334:        case TIOCGSID:
        !           335:                if (tp->t_session == NULL)
        !           336:                        return ENOTTY;
        !           337: 
        !           338:                if (tp->t_session->s_leader == NULL)
        !           339:                        return ENOTTY;
        !           340: 
        !           341:                *(int *) data =  tp->t_session->s_leader->p_pid;
        !           342:                break;
        !           343: #endif /* NeXT */
        !           344: 
        !           345:        default:
        !           346:                return (-1);
        !           347:        }
        !           348:        return (0);
        !           349: }
        !           350: 
        !           351: static int
        !           352: ttcompatgetflags(tp)
        !           353:        register struct tty *tp;
        !           354: {
        !           355:        register tcflag_t iflag = tp->t_iflag;
        !           356:        register tcflag_t lflag = tp->t_lflag;
        !           357:        register tcflag_t oflag = tp->t_oflag;
        !           358:        register tcflag_t cflag = tp->t_cflag;
        !           359:        register flags = 0;
        !           360: 
        !           361:        if (iflag&IXOFF)
        !           362:                flags |= TANDEM;
        !           363:        if (iflag&ICRNL || oflag&ONLCR)
        !           364:                flags |= CRMOD;
        !           365:        if ((cflag&CSIZE) == CS8) {
        !           366:                flags |= PASS8;
        !           367:                if (iflag&ISTRIP)
        !           368:                        flags |= ANYP;
        !           369:        }
        !           370:        else if (cflag&PARENB) {
        !           371:                if (iflag&INPCK) {
        !           372:                        if (cflag&PARODD)
        !           373:                                flags |= ODDP;
        !           374:                        else
        !           375:                                flags |= EVENP;
        !           376:                } else
        !           377:                        flags |= EVENP | ODDP;
        !           378:        }
        !           379: 
        !           380:        if ((lflag&ICANON) == 0) {
        !           381:                /* fudge */
        !           382:                if (iflag&(INPCK|ISTRIP|IXON) || lflag&(IEXTEN|ISIG)
        !           383:                    || cflag&(CSIZE|PARENB) != CS8)
        !           384:                        flags |= CBREAK;
        !           385:                else
        !           386:                        flags |= RAW;
        !           387:        }
        !           388:        if (!(flags&RAW) && !(oflag&OPOST) && cflag&(CSIZE|PARENB) == CS8)
        !           389:                flags |= LITOUT;
        !           390:        if (cflag&MDMBUF)
        !           391:                flags |= MDMBUF;
        !           392:        if ((cflag&HUPCL) == 0)
        !           393:                flags |= NOHANG;
        !           394:        if (oflag&OXTABS)
        !           395:                flags |= XTABS;
        !           396:        if (lflag&ECHOE)
        !           397:                flags |= CRTERA|CRTBS;
        !           398:        if (lflag&ECHOKE)
        !           399:                flags |= CRTKIL|CRTBS;
        !           400:        if (lflag&ECHOPRT)
        !           401:                flags |= PRTERA;
        !           402:        if (lflag&ECHOCTL)
        !           403:                flags |= CTLECH;
        !           404:        if ((iflag&IXANY) == 0)
        !           405:                flags |= DECCTQ;
        !           406:        flags |= lflag&(ECHO|TOSTOP|FLUSHO|PENDIN|NOFLSH);
        !           407: #ifndef NeXT
        !           408:        if (ttydebug)
        !           409:                printf("getflags: %x\n", flags);
        !           410: #endif
        !           411:        return (flags);
        !           412: }
        !           413: 
        !           414: static void
        !           415: ttcompatsetflags(tp, t)
        !           416:        register struct tty *tp;
        !           417:        register struct termios *t;
        !           418: {
        !           419:        register flags = tp->t_flags;
        !           420:        register tcflag_t iflag = t->c_iflag;
        !           421:        register tcflag_t oflag = t->c_oflag;
        !           422:        register tcflag_t lflag = t->c_lflag;
        !           423:        register tcflag_t cflag = t->c_cflag;
        !           424: 
        !           425:        if (flags & RAW) {
        !           426:                iflag = IGNBRK;
        !           427:                lflag &= ~(ECHOCTL|ISIG|ICANON|IEXTEN);
        !           428:        } else {
        !           429:                iflag &= ~(PARMRK|IGNPAR|IGNCR|INLCR);
        !           430:                iflag |= BRKINT|IXON|IMAXBEL;
        !           431:                lflag |= ISIG|IEXTEN|ECHOCTL;   /* XXX was echoctl on ? */
        !           432:                if (flags & XTABS)
        !           433:                        oflag |= OXTABS;
        !           434:                else
        !           435:                        oflag &= ~OXTABS;
        !           436:                if (flags & CBREAK)
        !           437:                        lflag &= ~ICANON;
        !           438:                else
        !           439:                        lflag |= ICANON;
        !           440:                if (flags&CRMOD) {
        !           441:                        iflag |= ICRNL;
        !           442:                        oflag |= ONLCR;
        !           443:                } else {
        !           444:                        iflag &= ~ICRNL;
        !           445:                        oflag &= ~ONLCR;
        !           446:                }
        !           447:        }
        !           448:        if (flags&ECHO)
        !           449:                lflag |= ECHO;
        !           450:        else
        !           451:                lflag &= ~ECHO;
        !           452: 
        !           453:        cflag &= ~(CSIZE|PARENB);
        !           454:        if (flags&(RAW|LITOUT|PASS8)) {
        !           455:                cflag |= CS8;
        !           456:                if (!(flags&(RAW|PASS8))
        !           457:                    || (flags&(RAW|PASS8|ANYP)) == (PASS8|ANYP))
        !           458:                        iflag |= ISTRIP;
        !           459:                else
        !           460:                        iflag &= ~ISTRIP;
        !           461:                if (flags&(RAW|LITOUT))
        !           462:                        oflag &= ~OPOST;
        !           463:                else
        !           464:                        oflag |= OPOST;
        !           465:        } else {
        !           466:                cflag |= CS7|PARENB;
        !           467:                iflag |= ISTRIP;
        !           468:                oflag |= OPOST;
        !           469:        }
        !           470:        /* XXX don't set INPCK if RAW or PASS8? */
        !           471:        if ((flags&(EVENP|ODDP)) == EVENP) {
        !           472:                iflag |= INPCK;
        !           473:                cflag &= ~PARODD;
        !           474:        } else if ((flags&(EVENP|ODDP)) == ODDP) {
        !           475:                iflag |= INPCK;
        !           476:                cflag |= PARODD;
        !           477:        } else
        !           478:                iflag &= ~INPCK;
        !           479:        if (flags&TANDEM)
        !           480:                iflag |= IXOFF;
        !           481:        else
        !           482:                iflag &= ~IXOFF;
        !           483:        if ((flags&DECCTQ) == 0)
        !           484:                iflag |= IXANY;
        !           485:        else
        !           486:                iflag &= ~IXANY;
        !           487:        t->c_iflag = iflag;
        !           488:        t->c_oflag = oflag;
        !           489:        t->c_lflag = lflag;
        !           490:        t->c_cflag = cflag;
        !           491: }
        !           492: 
        !           493: static void
        !           494: ttcompatsetlflags(tp, t)
        !           495:        register struct tty *tp;
        !           496:        register struct termios *t;
        !           497: {
        !           498:        register flags = tp->t_flags;
        !           499:        register tcflag_t iflag = t->c_iflag;
        !           500:        register tcflag_t oflag = t->c_oflag;
        !           501:        register tcflag_t lflag = t->c_lflag;
        !           502:        register tcflag_t cflag = t->c_cflag;
        !           503: 
        !           504:        iflag &= ~(PARMRK|IGNPAR|IGNCR|INLCR);
        !           505:        if (flags&CRTERA)
        !           506:                lflag |= ECHOE;
        !           507:        else
        !           508:                lflag &= ~ECHOE;
        !           509:        if (flags&CRTKIL)
        !           510:                lflag |= ECHOKE;
        !           511:        else
        !           512:                lflag &= ~ECHOKE;
        !           513:        if (flags&PRTERA)
        !           514:                lflag |= ECHOPRT;
        !           515:        else
        !           516:                lflag &= ~ECHOPRT;
        !           517:        if (flags&CTLECH)
        !           518:                lflag |= ECHOCTL;
        !           519:        else
        !           520:                lflag &= ~ECHOCTL;
        !           521:        if (flags&TANDEM)
        !           522:                iflag |= IXOFF;
        !           523:        else
        !           524:                iflag &= ~IXOFF;
        !           525:        if ((flags&DECCTQ) == 0)
        !           526:                iflag |= IXANY;
        !           527:        else
        !           528:                iflag &= ~IXANY;
        !           529:        if (flags & MDMBUF)
        !           530:                cflag |= MDMBUF;
        !           531:        else
        !           532:                cflag &= ~MDMBUF;
        !           533:        if (flags&NOHANG)
        !           534:                cflag &= ~HUPCL;
        !           535:        else
        !           536:                cflag |= HUPCL;
        !           537:        lflag &= ~(TOSTOP|FLUSHO|PENDIN|NOFLSH);
        !           538:        lflag |= flags&(TOSTOP|FLUSHO|PENDIN|NOFLSH);
        !           539: 
        !           540:        /*
        !           541:         * The next if-else statement is copied from above so don't bother
        !           542:         * checking it separately.  We could avoid fiddlling with the
        !           543:         * character size if the mode is already RAW or if neither the
        !           544:         * LITOUT bit or the PASS8 bit is being changed, but the delta of
        !           545:         * the change is not available here and skipping the RAW case would
        !           546:         * make the code different from above.
        !           547:         */
        !           548:        cflag &= ~(CSIZE|PARENB);
        !           549:        if (flags&(RAW|LITOUT|PASS8)) {
        !           550:                cflag |= CS8;
        !           551:                if (!(flags&(RAW|PASS8))
        !           552:                    || (flags&(RAW|PASS8|ANYP)) == (PASS8|ANYP))
        !           553:                        iflag |= ISTRIP;
        !           554:                else
        !           555:                        iflag &= ~ISTRIP;
        !           556:                if (flags&(RAW|LITOUT))
        !           557:                        oflag &= ~OPOST;
        !           558:                else
        !           559:                        oflag |= OPOST;
        !           560:        } else {
        !           561:                cflag |= CS7|PARENB;
        !           562:                iflag |= ISTRIP;
        !           563:                oflag |= OPOST;
        !           564:        }
        !           565:        t->c_iflag = iflag;
        !           566:        t->c_oflag = oflag;
        !           567:        t->c_lflag = lflag;
        !           568:        t->c_cflag = cflag;
        !           569: }
        !           570: #endif /* COMPAT_43 || COMPAT_SUNOS */

unix.superglobalmegacorp.com

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