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

Annotation of sys/compat/svr4/svr4_termios.c, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: svr4_termios.c,v 1.12 2002/03/14 01:26:51 millert Exp $        */
                      2: /*     $NetBSD: svr4_termios.c,v 1.9 1996/04/11 12:53:48 christos Exp $         */
                      3:
                      4: /*
                      5:  * Copyright (c) 1994 Christos Zoulas
                      6:  * 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. The name of the author may not be used to endorse or promote products
                     17:  *    derived from this software without specific prior written permission
                     18:  *
                     19:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
                     20:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
                     21:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
                     22:  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
                     23:  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
                     24:  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
                     25:  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
                     26:  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
                     27:  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
                     28:  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
                     29:  */
                     30:
                     31: #include <sys/param.h>
                     32: #include <sys/proc.h>
                     33: #include <sys/systm.h>
                     34: #include <sys/file.h>
                     35: #include <sys/filedesc.h>
                     36: #include <sys/ioctl.h>
                     37: #include <sys/termios.h>
                     38: #include <sys/tty.h>
                     39: #include <sys/socket.h>
                     40: #include <sys/mount.h>
                     41: #include <net/if.h>
                     42: #include <sys/malloc.h>
                     43:
                     44: #include <sys/syscallargs.h>
                     45:
                     46: #include <compat/svr4/svr4_types.h>
                     47: #include <compat/svr4/svr4_util.h>
                     48: #include <compat/svr4/svr4_signal.h>
                     49: #include <compat/svr4/svr4_ioctl.h>
                     50: #include <compat/svr4/svr4_syscallargs.h>
                     51: #include <compat/svr4/svr4_stropts.h>
                     52: #include <compat/svr4/svr4_termios.h>
                     53:
                     54: #define SVR4_OXTABS   SVR4_XTABS      /* XXX */
                     55:
                     56: #ifndef __CONCAT3
                     57: # if __STDC__
                     58: #  define __CONCAT3(a,b,c)     a ## b ## c
                     59: # else
                     60: #  define __CONCAT3(a,b,c)     a/**/b/**/c
                     61: # endif
                     62: #endif
                     63:
                     64: u_long bsd_to_svr4_speed(u_long, u_long);
                     65: u_long svr4_to_bsd_speed(u_long, u_long);
                     66: void svr4_to_bsd_termios(const struct svr4_termios *, struct termios *,
                     67:     int);
                     68: void bsd_to_svr4_termios(const struct termios *, struct svr4_termios *);
                     69: void svr4_termio_to_termios(const struct svr4_termio *,
                     70:     struct svr4_termios *);
                     71: void svr4_termios_to_termio(const struct svr4_termios *,
                     72:     struct svr4_termio *);
                     73: #ifdef DEBUG_SVR4
                     74: void print_svr4_termios(const struct svr4_termios *);
                     75: void print_bsd_termios(const struct termios *);
                     76: #endif /* DEBUG_SVR4 */
                     77:
                     78: #define undefined_char(a,b)                            /**/
                     79: #define undefined_flag1(f,a,b)                         /**/
                     80: #define undefined_flag2(f,a,b,c1,t1,c2,t2)             /**/
                     81: #define undefined_flag4(f,a,b,c1,t1,c2,t2,c3,t3,c4,t4) /**/
                     82:
                     83: #define svr4_to_bsd_char(a,b) \
                     84:        if (new || __CONCAT3(SVR4_,a,b) < SVR4_NCC) { \
                     85:                if (st->c_cc[__CONCAT3(SVR4_,a,b)] == SVR4_POSIX_VDISABLE) \
                     86:                        bt->c_cc[__CONCAT(a,b)] = _POSIX_VDISABLE; \
                     87:                else \
                     88:                        bt->c_cc[__CONCAT(a,b)] = \
                     89:                            st->c_cc[__CONCAT3(SVR4_,a,b)]; \
                     90:        }
                     91:
                     92: #define svr4_to_bsd_flag1(f,a,b) \
                     93:        if (new || __CONCAT3(SVR4_,a,b) < 0200000) { \
                     94:                if (st->f & __CONCAT3(SVR4_,a,b)) \
                     95:                        bt->f |= __CONCAT(a,b); \
                     96:                else \
                     97:                        bt->f &= ~__CONCAT(a,b); \
                     98:        }
                     99:
                    100: #define svr4_to_bsd_flag2(f,a,b,c1,t1,c2,t2) \
                    101:        if (new || __CONCAT3(SVR4_,a,b) < 0200000) { \
                    102:                bt->f &= ~__CONCAT(a,b); \
                    103:                switch (st->f & __CONCAT3(SVR4_,a,b)) { \
                    104:                case __CONCAT3(SVR4_,c1,t1): bt->f |= __CONCAT(c1,t1); break; \
                    105:                case __CONCAT3(SVR4_,c2,t2): bt->f |= __CONCAT(c2,t2); break; \
                    106:                } \
                    107:        }
                    108:
                    109: #define svr4_to_bsd_flag4(f,a,b,c1,t1,c2,t2,c3,t3,c4,t4) \
                    110:        if (new || __CONCAT3(SVR4_,a,b) < 0200000) { \
                    111:                bt->f &= ~__CONCAT(a,b); \
                    112:                switch (st->f & __CONCAT3(SVR4_,a,b)) { \
                    113:                case __CONCAT3(SVR4_,c1,t1): bt->f |= __CONCAT(c1,t1); break; \
                    114:                case __CONCAT3(SVR4_,c2,t2): bt->f |= __CONCAT(c2,t2); break; \
                    115:                case __CONCAT3(SVR4_,c3,t3): bt->f |= __CONCAT(c3,t3); break; \
                    116:                case __CONCAT3(SVR4_,c4,t4): bt->f |= __CONCAT(c4,t4); break; \
                    117:                } \
                    118:        }
                    119:
                    120:
                    121: #define bsd_to_svr4_char(a,b) \
                    122:        if (bt->c_cc[__CONCAT(a,b)] == _POSIX_VDISABLE) \
                    123:                st->c_cc[__CONCAT3(SVR4_,a,b)] = SVR4_POSIX_VDISABLE; \
                    124:        else \
                    125:                st->c_cc[__CONCAT3(SVR4_,a,b)] = bt->c_cc[__CONCAT(a,b)]
                    126:
                    127: #define bsd_to_svr4_flag1(f,a,b) \
                    128:        if (bt->f & __CONCAT(a,b)) \
                    129:                st->f |= __CONCAT3(SVR4_,a,b); \
                    130:        else \
                    131:                st->f &= ~__CONCAT3(SVR4_,a,b)
                    132:
                    133: #define bsd_to_svr4_flag2(f,a,b,c1,t1,c2,t2) \
                    134:        st->f &= ~__CONCAT3(SVR4_,a,b); \
                    135:        switch (bt->f & __CONCAT(a,b)) { \
                    136:        case __CONCAT(c1,t1): st->f |= __CONCAT3(SVR4_,c1,t1); break; \
                    137:        case __CONCAT(c2,t2): st->f |= __CONCAT3(SVR4_,c2,t2); break; \
                    138:        }
                    139:
                    140: #define bsd_to_svr4_flag4(f,a,b,c1,t1,c2,t2,c3,t3,c4,t4) \
                    141:        st->f &= ~__CONCAT3(SVR4_,a,b); \
                    142:        switch (bt->f & __CONCAT(a,b)) { \
                    143:        case __CONCAT(c1,t1): st->f |= __CONCAT3(SVR4_,c1,t1); break; \
                    144:        case __CONCAT(c2,t2): st->f |= __CONCAT3(SVR4_,c2,t2); break; \
                    145:        case __CONCAT(c3,t3): st->f |= __CONCAT3(SVR4_,c3,t3); break; \
                    146:        case __CONCAT(c4,t4): st->f |= __CONCAT3(SVR4_,c4,t4); break; \
                    147:        }
                    148:
                    149: #ifdef DEBUG_SVR4
                    150: void
                    151: print_svr4_termios(st)
                    152:        const struct svr4_termios *st;
                    153: {
                    154:        int i;
                    155:        uprintf("SVR4\niflag=%lo oflag=%lo cflag=%lo lflag=%lo\n",
                    156:            st->c_iflag, st->c_oflag, st->c_cflag, st->c_lflag);
                    157:        uprintf("cc: ");
                    158:        for (i = 0; i < SVR4_NCCS; i++)
                    159:                uprintf("%o ", st->c_cc[i]);
                    160:        uprintf("\n");
                    161: }
                    162:
                    163: void
                    164: print_bsd_termios(bt)
                    165:        const struct termios *bt;
                    166: {
                    167:        int i;
                    168:        uprintf(
                    169:            "BSD\niflag=%x oflag=%x cflag=%x lflag=%x ispeed=%d osped=%d\n",
                    170:            bt->c_iflag, bt->c_oflag, bt->c_cflag, bt->c_lflag, bt->c_ispeed,
                    171:            bt->c_ospeed);
                    172:        uprintf("cc: ");
                    173:        for (i = 0; i < NCCS; i++)
                    174:                uprintf("%o ", bt->c_cc[i]);
                    175:        uprintf("\n");
                    176: }
                    177: #endif /* DEBUG_SVR4 */
                    178:
                    179: u_long
                    180: bsd_to_svr4_speed(sp, mask)
                    181:        u_long sp;
                    182:        u_long mask;
                    183: {
                    184:        switch (sp) {
                    185: #undef getval
                    186: #define getval(a,b) case __CONCAT(a,b): sp = __CONCAT3(SVR4_,a,b); break
                    187:        getval(B,0);
                    188:        getval(B,50);
                    189:        getval(B,75);
                    190:        getval(B,110);
                    191:        getval(B,134);
                    192:        getval(B,150);
                    193:        getval(B,200);
                    194:        getval(B,300);
                    195:        getval(B,600);
                    196:        getval(B,1200);
                    197:        getval(B,1800);
                    198:        getval(B,2400);
                    199:        getval(B,4800);
                    200:        getval(B,9600);
                    201:        getval(B,19200);
                    202:        getval(B,38400);
                    203: #if 0
                    204:        /* XXX These don't fit in CBAUD */
                    205:        getval(B,57600);
                    206:        getval(B,115200);
                    207: #endif
                    208:        default: sp = SVR4_B9600;       /* XXX */
                    209:        }
                    210:
                    211:        while ((mask & 1) == 0) {
                    212:                mask >>= 1;
                    213:                sp <<= 1;
                    214:        }
                    215:
                    216:        return (sp);
                    217: }
                    218:
                    219: u_long
                    220: svr4_to_bsd_speed(sp, mask)
                    221:        u_long sp;
                    222:        u_long mask;
                    223: {
                    224:        while ((mask & 1) == 0) {
                    225:                mask >>= 1;
                    226:                sp >>= 1;
                    227:        }
                    228:
                    229:        switch (sp & mask) {
                    230: #undef getval
                    231: #define getval(a,b)    case __CONCAT3(SVR4_,a,b):      return (__CONCAT(a,b))
                    232:        getval(B,0);
                    233:        getval(B,50);
                    234:        getval(B,75);
                    235:        getval(B,110);
                    236:        getval(B,134);
                    237:        getval(B,150);
                    238:        getval(B,200);
                    239:        getval(B,300);
                    240:        getval(B,600);
                    241:        getval(B,1200);
                    242:        getval(B,1800);
                    243:        getval(B,2400);
                    244:        getval(B,4800);
                    245:        getval(B,9600);
                    246:        getval(B,19200);
                    247:        getval(B,38400);
                    248: #if 0
                    249:        /* XXX These don't fit in CBAUD */
                    250:        getval(B,57600);
                    251:        getval(B,115200);
                    252: #endif
                    253:        default: return (B9600);        /* XXX */
                    254:        }
                    255: }
                    256:
                    257: void
                    258: svr4_to_bsd_termios(st, bt, new)
                    259:        const struct svr4_termios       *st;
                    260:        struct termios                  *bt;
                    261:        int                              new;
                    262: {
                    263:        /* control characters */
                    264:        svr4_to_bsd_char(V,INTR);
                    265:        svr4_to_bsd_char(V,QUIT);
                    266:        svr4_to_bsd_char(V,ERASE);
                    267:        svr4_to_bsd_char(V,KILL);
                    268:        if (st->c_lflag & ICANON) {
                    269:                svr4_to_bsd_char(V,EOF);
                    270:                svr4_to_bsd_char(V,EOL);
                    271:        } else {
                    272:                /*
                    273:                 * These are not chars so _POSIX_DISABLE values should not be
                    274:                 * special cased.
                    275:                 */
                    276:                bt->c_cc[VMIN] = st->c_cc[SVR4_VMIN];
                    277:                bt->c_cc[VTIME] = st->c_cc[SVR4_VTIME];
                    278:        }
                    279:        svr4_to_bsd_char(V,EOF);
                    280:        svr4_to_bsd_char(V,EOL);
                    281:        svr4_to_bsd_char(V,EOL2);
                    282:        undefined_char(V,SWTCH);
                    283:        svr4_to_bsd_char(V,START);
                    284:        svr4_to_bsd_char(V,STOP);
                    285:        svr4_to_bsd_char(V,SUSP);
                    286:        svr4_to_bsd_char(V,DSUSP);
                    287:        svr4_to_bsd_char(V,REPRINT);
                    288:        svr4_to_bsd_char(V,DISCARD);
                    289:        svr4_to_bsd_char(V,WERASE);
                    290:        svr4_to_bsd_char(V,LNEXT);
                    291:
                    292:        /* Input modes */
                    293:        svr4_to_bsd_flag1(c_iflag,I,GNBRK);
                    294:        svr4_to_bsd_flag1(c_iflag,B,RKINT);
                    295:        svr4_to_bsd_flag1(c_iflag,I,GNPAR);
                    296:        svr4_to_bsd_flag1(c_iflag,P,ARMRK);
                    297:        svr4_to_bsd_flag1(c_iflag,I,NPCK);
                    298:        svr4_to_bsd_flag1(c_iflag,I,STRIP);
                    299:        svr4_to_bsd_flag1(c_iflag,I,NLCR);
                    300:        svr4_to_bsd_flag1(c_iflag,I,GNCR);
                    301:        svr4_to_bsd_flag1(c_iflag,I,CRNL);
                    302:        undefined_flag1(c_iflag,I,UCLC);
                    303:        svr4_to_bsd_flag1(c_iflag,I,XON);
                    304:        svr4_to_bsd_flag1(c_iflag,I,XANY);
                    305:        svr4_to_bsd_flag1(c_iflag,I,XOFF);
                    306:        svr4_to_bsd_flag1(c_iflag,I,MAXBEL);
                    307:        undefined_flag1(c_iflag,D,OSMODE);
                    308:
                    309:        /* Output modes */
                    310:        svr4_to_bsd_flag1(c_oflag,O,POST);
                    311:        undefined_flag1(c_oflag,O,LCUC);
                    312:        svr4_to_bsd_flag1(c_oflag,O,NLCR);
                    313:        undefined_flag1(c_oflag,O,CRNL);
                    314:        undefined_flag1(c_oflag,O,NOCR);
                    315:        undefined_flag1(c_oflag,O,NLRET);
                    316:        undefined_flag1(c_oflag,O,FILL);
                    317:        undefined_flag1(c_oflag,O,FDEL);
                    318:        undefined_flag2(c_oflag,N,LDLY,N,L0,N,L1);
                    319:        undefined_flag4(c_oflag,C,RDLY,C,R0,C,R1,C,R2,C,R3);
                    320:        undefined_flag4(c_oflag,T,ABDLY,T,AB0,T,AB1,T,AB2,T,AB3);
                    321:        /*
                    322:         * XXX Note, we cannot use svr4_to_bsd_flag1 here because the SVR4
                    323:         * field is a two bit value where identity is important, i.e. any bit
                    324:         * set in that field is *not* enough.  Someday we might to wish to
                    325:         * support the other values of this bitfield, but not now...
                    326:         */
                    327:        if ((st->c_oflag & SVR4_XTABS) == SVR4_XTABS)
                    328:                bt->c_oflag |= OXTABS;
                    329:        else
                    330:                bt->c_oflag &= ~OXTABS;
                    331:        undefined_flag2(c_oflag,B,SDLY,B,S0,B,S1);
                    332:        undefined_flag2(c_oflag,V,TDLY,V,T0,V,T1);
                    333:        undefined_flag2(c_oflag,F,FDLY,F,F0,F,F1);
                    334:        undefined_flag1(c_oflag,P,AGEOUT);
                    335:        undefined_flag1(c_oflag,W,RAP);
                    336:
                    337:        /* Control modes */
                    338:        bt->c_ospeed = svr4_to_bsd_speed(st->c_cflag, SVR4_CBAUD);
                    339:        svr4_to_bsd_flag4(c_cflag,C,SIZE,C,S5,C,S6,C,S7,C,S8)
                    340:        svr4_to_bsd_flag1(c_cflag,C,STOPB);
                    341:        svr4_to_bsd_flag1(c_cflag,C,READ);
                    342:        svr4_to_bsd_flag1(c_cflag,P,ARENB);
                    343:        svr4_to_bsd_flag1(c_cflag,P,ARODD);
                    344:        svr4_to_bsd_flag1(c_cflag,H,UPCL);
                    345:        svr4_to_bsd_flag1(c_cflag,C,LOCAL);
                    346:        undefined_flag1(c_cflag,R,CV1EN);
                    347:        undefined_flag1(c_cflag,X,MT1EN);
                    348:        undefined_flag1(c_cflag,L,OBLK);
                    349:        undefined_flag1(c_cflag,X,CLUDE);
                    350:        bt->c_ispeed = svr4_to_bsd_speed(st->c_cflag, SVR4_CIBAUD);
                    351:        undefined_flag1(c_cflag,P,AREXT);
                    352:
                    353:        /* line discipline modes */
                    354:        svr4_to_bsd_flag1(c_lflag,I,SIG);
                    355:        svr4_to_bsd_flag1(c_lflag,I,CANON);
                    356:        undefined_flag1(c_lflag,X,CASE);
                    357:        svr4_to_bsd_flag1(c_lflag,E,CHO);
                    358:        svr4_to_bsd_flag1(c_lflag,E,CHOE);
                    359:        svr4_to_bsd_flag1(c_lflag,E,CHOK);
                    360:        svr4_to_bsd_flag1(c_lflag,E,CHONL);
                    361:        svr4_to_bsd_flag1(c_lflag,N,OFLSH);
                    362:        svr4_to_bsd_flag1(c_lflag,T,OSTOP);
                    363:        svr4_to_bsd_flag1(c_lflag,E,CHOCTL);
                    364:        svr4_to_bsd_flag1(c_lflag,E,CHOPRT);
                    365:        svr4_to_bsd_flag1(c_lflag,E,CHOKE);
                    366:        undefined_flag1(c_lflag,D,EFECHO);
                    367:        svr4_to_bsd_flag1(c_lflag,F,LUSHO);
                    368:        svr4_to_bsd_flag1(c_lflag,P,ENDIN);
                    369:        svr4_to_bsd_flag1(c_lflag,I,EXTEN);
                    370: }
                    371:
                    372: void
                    373: bsd_to_svr4_termios(bt, st)
                    374:        const struct termios    *bt;
                    375:        struct svr4_termios     *st;
                    376: {
                    377:        /* control characters */
                    378:        bsd_to_svr4_char(V,INTR);
                    379:        bsd_to_svr4_char(V,QUIT);
                    380:        bsd_to_svr4_char(V,ERASE);
                    381:        bsd_to_svr4_char(V,KILL);
                    382:        if (bt->c_lflag & ICANON) {
                    383:                bsd_to_svr4_char(V,EOF);
                    384:                bsd_to_svr4_char(V,EOL);
                    385:        } else {
                    386:                /*
                    387:                 * These are not chars so _POSIX_DISABLE values should not be
                    388:                 * special cased.
                    389:                 */
                    390:                st->c_cc[SVR4_VMIN] = bt->c_cc[VMIN];
                    391:                st->c_cc[SVR4_VTIME] = bt->c_cc[VTIME];
                    392:        }
                    393:        bsd_to_svr4_char(V,EOL2);
                    394:        undefined_char(V,SWTCH);
                    395:        bsd_to_svr4_char(V,START);
                    396:        bsd_to_svr4_char(V,STOP);
                    397:        bsd_to_svr4_char(V,SUSP);
                    398:        bsd_to_svr4_char(V,DSUSP);
                    399:        bsd_to_svr4_char(V,REPRINT);
                    400:        bsd_to_svr4_char(V,DISCARD);
                    401:        bsd_to_svr4_char(V,WERASE);
                    402:        bsd_to_svr4_char(V,LNEXT);
                    403:
                    404:        /* Input modes */
                    405:        bsd_to_svr4_flag1(c_iflag,I,GNBRK);
                    406:        bsd_to_svr4_flag1(c_iflag,B,RKINT);
                    407:        bsd_to_svr4_flag1(c_iflag,I,GNPAR);
                    408:        bsd_to_svr4_flag1(c_iflag,P,ARMRK);
                    409:        bsd_to_svr4_flag1(c_iflag,I,NPCK);
                    410:        bsd_to_svr4_flag1(c_iflag,I,STRIP);
                    411:        bsd_to_svr4_flag1(c_iflag,I,NLCR);
                    412:        bsd_to_svr4_flag1(c_iflag,I,GNCR);
                    413:        bsd_to_svr4_flag1(c_iflag,I,CRNL);
                    414:        undefined_flag1(c_iflag,I,UCLC);
                    415:        bsd_to_svr4_flag1(c_iflag,I,XON);
                    416:        bsd_to_svr4_flag1(c_iflag,I,XANY);
                    417:        bsd_to_svr4_flag1(c_iflag,I,XOFF);
                    418:        bsd_to_svr4_flag1(c_iflag,I,MAXBEL);
                    419:        undefined_flag1(c_iflag,D,OSMODE);
                    420:
                    421:        /* Output modes */
                    422:        bsd_to_svr4_flag1(c_oflag,O,POST);
                    423:        undefined_flag1(c_oflag,O,LCUC);
                    424:        bsd_to_svr4_flag1(c_oflag,O,NLCR);
                    425:        undefined_flag1(c_oflag,O,CRNL);
                    426:        undefined_flag1(c_oflag,O,NOCR);
                    427:        undefined_flag1(c_oflag,O,NLRET);
                    428:        undefined_flag1(c_oflag,O,FILL);
                    429:        undefined_flag1(c_oflag,O,FDEL);
                    430:        undefined_flag2(c_oflag,N,LDLY,N,L0,N,L1);
                    431:        undefined_flag4(c_oflag,C,RDLY,C,R0,C,R1,C,R2,C,R3);
                    432:        undefined_flag4(c_oflag,T,ABDLY,T,AB0,T,AB1,T,AB2,T,AB3);
                    433:        /*
                    434:         * XXX This isn't what it seem to be, a one bit flag...  It's actually
                    435:         * a two bit value in SVR4 with composite semantics, where we only
                    436:         * support one of them.  Be careful if you change this...
                    437:         */
                    438:        bsd_to_svr4_flag1(c_oflag,OX,TABS);
                    439:        undefined_flag2(c_oflag,B,SDLY,B,S0,B,S1);
                    440:        undefined_flag2(c_oflag,V,TDLY,V,T0,V,T1);
                    441:        undefined_flag2(c_oflag,F,FDLY,F,F0,F,F1);
                    442:        undefined_flag1(c_oflag,P,AGEOUT);
                    443:        undefined_flag1(c_oflag,W,RAP);
                    444:
                    445:        /* Control modes */
                    446:        st->c_cflag &= ~SVR4_CBAUD;
                    447:        st->c_cflag |= bsd_to_svr4_speed(bt->c_ospeed, SVR4_CBAUD);
                    448:        bsd_to_svr4_flag4(c_cflag,C,SIZE,C,S5,C,S6,C,S7,C,S8)
                    449:        bsd_to_svr4_flag1(c_cflag,C,STOPB);
                    450:        bsd_to_svr4_flag1(c_cflag,C,READ);
                    451:        bsd_to_svr4_flag1(c_cflag,P,ARENB);
                    452:        bsd_to_svr4_flag1(c_cflag,P,ARODD);
                    453:        bsd_to_svr4_flag1(c_cflag,H,UPCL);
                    454:        bsd_to_svr4_flag1(c_cflag,C,LOCAL);
                    455:        undefined_flag1(c_cflag,R,CV1EN);
                    456:        undefined_flag1(c_cflag,X,MT1EN);
                    457:        undefined_flag1(c_cflag,L,OBLK);
                    458:        undefined_flag1(c_cflag,X,CLUDE);
                    459:        st->c_cflag &= ~SVR4_CIBAUD;
                    460:        st->c_cflag |= bsd_to_svr4_speed(bt->c_ispeed, SVR4_CIBAUD);
                    461:
                    462:        undefined_flag1(c_oflag,P,AREXT);
                    463:
                    464:        /* line discipline modes */
                    465:        bsd_to_svr4_flag1(c_lflag,I,SIG);
                    466:        bsd_to_svr4_flag1(c_lflag,I,CANON);
                    467:        undefined_flag1(c_lflag,X,CASE);
                    468:        bsd_to_svr4_flag1(c_lflag,E,CHO);
                    469:        bsd_to_svr4_flag1(c_lflag,E,CHOE);
                    470:        bsd_to_svr4_flag1(c_lflag,E,CHOK);
                    471:        bsd_to_svr4_flag1(c_lflag,E,CHONL);
                    472:        bsd_to_svr4_flag1(c_lflag,N,OFLSH);
                    473:        bsd_to_svr4_flag1(c_lflag,T,OSTOP);
                    474:        bsd_to_svr4_flag1(c_lflag,E,CHOCTL);
                    475:        bsd_to_svr4_flag1(c_lflag,E,CHOPRT);
                    476:        bsd_to_svr4_flag1(c_lflag,E,CHOKE);
                    477:        undefined_flag1(c_lflag,D,EFECHO);
                    478:        bsd_to_svr4_flag1(c_lflag,F,LUSHO);
                    479:        bsd_to_svr4_flag1(c_lflag,P,ENDIN);
                    480:        bsd_to_svr4_flag1(c_lflag,I,EXTEN);
                    481: }
                    482:
                    483: void
                    484: svr4_termio_to_termios(t, ts)
                    485:        const struct svr4_termio        *t;
                    486:        struct svr4_termios             *ts;
                    487: {
                    488:        int i;
                    489:
                    490:        ts->c_iflag = (svr4_tcflag_t)t->c_iflag;
                    491:        ts->c_oflag = (svr4_tcflag_t)t->c_oflag;
                    492:        ts->c_cflag = (svr4_tcflag_t)t->c_cflag & ~SVR4_CIBAUD;
                    493:        /* XXX because SVR4_CIBAUD == SVR4_CBAUD << 16 we can do: */
                    494:        ts->c_cflag |= (ts->c_cflag & SVR4_CBAUD) << 16;
                    495:        ts->c_lflag = (svr4_tcflag_t)t->c_lflag;
                    496:
                    497:        for (i = 0; i < SVR4_NCC; i++)
                    498:                ts->c_cc[i] = (svr4_cc_t)t->c_cc[i];
                    499: }
                    500:
                    501: void
                    502: svr4_termios_to_termio(ts, t)
                    503:        const struct svr4_termios       *ts;
                    504:        struct svr4_termio              *t;
                    505: {
                    506:        int i;
                    507:
                    508:        t->c_iflag = (u_short)ts->c_iflag;
                    509:        t->c_oflag = (u_short)ts->c_oflag;
                    510:        t->c_cflag = (u_short)ts->c_cflag;
                    511:        t->c_lflag = (u_short)ts->c_lflag;
                    512:        t->c_line = 0;  /* XXX */
                    513:
                    514:        for (i = 0; i < SVR4_NCC; i++)
                    515:                t->c_cc[i] = (u_char)ts->c_cc[i];
                    516: }
                    517:
                    518: int
                    519: svr4_term_ioctl(fp, p, retval, fd, cmd, data)
                    520:        struct file *fp;
                    521:        struct proc *p;
                    522:        register_t *retval;
                    523:        int fd;
                    524:        u_long cmd;
                    525:        caddr_t data;
                    526: {
                    527:        struct termios          bt;
                    528:        struct svr4_termios     st;
                    529:        struct svr4_termio      t;
                    530:        int                     error, new;
                    531:        int (*ctl)(struct file *, u_long,  caddr_t, struct proc *) =
                    532:            fp->f_ops->fo_ioctl;
                    533:
                    534:        *retval = 0;
                    535:
                    536:        switch (cmd) {
                    537:        case SVR4_TCGETA:
                    538:        case SVR4_TCGETS:
                    539:                if ((error = (*ctl)(fp, TIOCGETA, (caddr_t)&bt, p)) != 0)
                    540:                        return (error);
                    541:
                    542:                bzero(&st,sizeof(st));
                    543:                bsd_to_svr4_termios(&bt, &st);
                    544:
                    545:                DPRINTF(("ioctl(TCGET%c);\n", cmd == SVR4_TCGETA ? 'A' : 'S'));
                    546: #ifdef DEBUG_SVR4
                    547:                print_bsd_termios(&bt);
                    548:                print_svr4_termios(&st);
                    549: #endif /* DEBUG_SVR4 */
                    550:
                    551:                if (cmd == SVR4_TCGETA) {
                    552:                    svr4_termios_to_termio(&st, &t);
                    553:                    return (copyout(&t, data, sizeof(t)));
                    554:                }
                    555:                else  {
                    556:                    return (copyout(&st, data, sizeof(st)));
                    557:                }
                    558:
                    559:        case SVR4_TCSETA:
                    560:        case SVR4_TCSETS:
                    561:        case SVR4_TCSETAW:
                    562:        case SVR4_TCSETSW:
                    563:        case SVR4_TCSETAF:
                    564:        case SVR4_TCSETSF:
                    565:                /* get full BSD termios so we don't lose information */
                    566:                if ((error = (*ctl)(fp, TIOCGETA, (caddr_t) &bt, p)) != 0)
                    567:                        return (error);
                    568:
                    569:                switch (cmd) {
                    570:                case SVR4_TCSETS:
                    571:                case SVR4_TCSETSW:
                    572:                case SVR4_TCSETSF:
                    573:                        if ((error = copyin(data, &st, sizeof(st))) != 0)
                    574:                                return (error);
                    575:                        new = 1;
                    576:                        break;
                    577:
                    578:                case SVR4_TCSETA:
                    579:                case SVR4_TCSETAW:
                    580:                case SVR4_TCSETAF:
                    581:                        if ((error = copyin(data, &t, sizeof(t))) != 0)
                    582:                                return (error);
                    583:
                    584:                        bsd_to_svr4_termios(&bt, &st);
                    585:                        svr4_termio_to_termios(&t, &st);
                    586:                        new = 0;
                    587:                        break;
                    588:
                    589:                default:
                    590:                        return (EINVAL);
                    591:                }
                    592:
                    593:                svr4_to_bsd_termios(&st, &bt, new);
                    594:
                    595:                switch (cmd) {
                    596:                case SVR4_TCSETA:
                    597:                case SVR4_TCSETS:
                    598:                        DPRINTF(("ioctl(TCSET[A|S]);\n"));
                    599:                        cmd = TIOCSETA;
                    600:                        break;
                    601:                case SVR4_TCSETAW:
                    602:                case SVR4_TCSETSW:
                    603:                        DPRINTF(("ioctl(TCSET[A|S]W);\n"));
                    604:                        cmd = TIOCSETAW;
                    605:                        break;
                    606:                case SVR4_TCSETAF:
                    607:                case SVR4_TCSETSF:
                    608:                        DPRINTF(("ioctl(TCSET[A|S]F);\n"));
                    609:                        cmd = TIOCSETAF;
                    610:                        break;
                    611:                }
                    612:
                    613: #ifdef DEBUG_SVR4
                    614:                print_bsd_termios(&bt);
                    615:                print_svr4_termios(&st);
                    616: #endif /* DEBUG_SVR4 */
                    617:
                    618:                return ((*ctl)(fp, cmd, (caddr_t) &bt, p));
                    619:
                    620:        case SVR4_TIOCGWINSZ:
                    621:                {
                    622:                        struct svr4_winsize ws;
                    623:
                    624:                        error = (*ctl)(fp, TIOCGWINSZ, (caddr_t)&ws, p);
                    625:                        if (error)
                    626:                                return (error);
                    627:                        return (copyout(&ws, data, sizeof(ws)));
                    628:                }
                    629:
                    630:        case SVR4_TIOCSWINSZ:
                    631:                {
                    632:                        struct svr4_winsize ws;
                    633:
                    634:                        if ((error = copyin(data, &ws, sizeof(ws))) != 0)
                    635:                                return (error);
                    636:                        return ((*ctl)(fp, TIOCSWINSZ, (caddr_t) &ws, p));
                    637:                }
                    638:
                    639:        default:
                    640:                return (svr4_stream_ti_ioctl(fp, p, retval, fd, cmd, data));
                    641:        }
                    642: }

CVSweb