root/compat/svr4/svr4_termios.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. print_svr4_termios
  2. print_bsd_termios
  3. bsd_to_svr4_speed
  4. svr4_to_bsd_speed
  5. svr4_to_bsd_termios
  6. bsd_to_svr4_termios
  7. svr4_termio_to_termios
  8. svr4_termios_to_termio
  9. svr4_term_ioctl

    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 }

/* [<][>][^][v][top][bottom][index][help] */