root/compat/common/tty_43.c

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

DEFINITIONS

This source file includes following definitions.
  1. ttcompat
  2. ttcompatgetflags
  3. ttcompatsetflags
  4. ttcompatsetlflags

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

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