The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/i386/ibcs2/ibcs2_ioctl.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*      $NetBSD: ibcs2_ioctl.c,v 1.6 1995/03/14 15:12:28 scottb Exp $   */
    2 
    3 /*
    4  * Copyright (c) 1994, 1995 Scott Bartram
    5  * All rights reserved.
    6  *
    7  * based on compat/sunos/sun_ioctl.c
    8  *
    9  * Redistribution and use in source and binary forms, with or without
   10  * modification, are permitted provided that the following conditions
   11  * are met:
   12  * 1. Redistributions of source code must retain the above copyright
   13  *    notice, this list of conditions and the following disclaimer.
   14  * 2. The name of the author may not be used to endorse or promote products
   15  *    derived from this software without specific prior written permission
   16  *
   17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
   18  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   19  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
   20  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
   21  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
   22  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
   23  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
   24  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
   25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
   26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   27  */
   28 
   29 #include <sys/cdefs.h>
   30 __FBSDID("$FreeBSD: releng/5.2/sys/i386/ibcs2/ibcs2_ioctl.c 115684 2003-06-02 06:48:51Z obrien $");
   31 
   32 #include <sys/param.h>
   33 #include <sys/systm.h>
   34 #include <sys/consio.h>
   35 #include <sys/fcntl.h>
   36 #include <sys/file.h>
   37 #include <sys/filedesc.h>
   38 #include <sys/filio.h>
   39 #include <sys/ioctl_compat.h>
   40 #include <sys/kbio.h>
   41 #include <sys/lock.h>
   42 #include <sys/mutex.h>
   43 #include <sys/sysproto.h>
   44 #include <sys/tty.h>
   45 
   46 #include <i386/ibcs2/ibcs2_signal.h>
   47 #include <i386/ibcs2/ibcs2_socksys.h>
   48 #include <i386/ibcs2/ibcs2_stropts.h>
   49 #include <i386/ibcs2/ibcs2_proto.h>
   50 #include <i386/ibcs2/ibcs2_termios.h>
   51 #include <i386/ibcs2/ibcs2_util.h>
   52 #include <i386/ibcs2/ibcs2_ioctl.h>
   53 
   54 static void stios2btios(struct ibcs2_termios *, struct termios *);
   55 static void btios2stios(struct termios *, struct ibcs2_termios *);
   56 static void stios2stio(struct ibcs2_termios *, struct ibcs2_termio *);
   57 static void stio2stios(struct ibcs2_termio *, struct ibcs2_termios *);
   58 
   59 
   60 int
   61 ibcs2_gtty(struct thread *td, struct ibcs2_gtty_args *args)
   62 {
   63         struct ioctl_args ioctl_arg;
   64 
   65         ioctl_arg.fd = args->fd;
   66         ioctl_arg.com = TIOCGETC;
   67         ioctl_arg.data = (caddr_t)args->buf;
   68 
   69         return ioctl(td, &ioctl_arg);
   70 }
   71 
   72 int
   73 ibcs2_stty(struct thread *td, struct ibcs2_stty_args *args)
   74 {
   75         struct ioctl_args ioctl_arg;
   76 
   77         ioctl_arg.fd = args->fd;
   78         ioctl_arg.com = TIOCSETC;
   79         ioctl_arg.data = (caddr_t)args->buf;
   80 
   81         return ioctl(td, &ioctl_arg);
   82 }
   83 
   84 
   85 /*
   86  * iBCS2 ioctl calls.
   87  */
   88 
   89 static struct speedtab sptab[] = {
   90         { 0, 0 },
   91         { 50, 1 },
   92         { 75, 2 },
   93         { 110, 3 },
   94         { 134, 4 },
   95         { 135, 4 },
   96         { 150, 5 },
   97         { 200, 6 },
   98         { 300, 7 },
   99         { 600, 8 },
  100         { 1200, 9 },
  101         { 1800, 10 },
  102         { 2400, 11 },
  103         { 4800, 12 },
  104         { 9600, 13 },
  105         { 19200, 14 },
  106         { 38400, 15 },
  107         { -1, -1 }
  108 };
  109 
  110 static u_long s2btab[] = { 
  111         0,
  112         50,
  113         75,
  114         110,
  115         134,
  116         150,
  117         200,
  118         300,
  119         600,
  120         1200,
  121         1800,
  122         2400,
  123         4800,
  124         9600,
  125         19200,
  126         38400,
  127 };
  128 
  129 static void
  130 stios2btios(st, bt)
  131         struct ibcs2_termios *st;
  132         struct termios *bt;
  133 {
  134         register u_long l, r;
  135 
  136         l = st->c_iflag;        r = 0;
  137         if (l & IBCS2_IGNBRK)   r |= IGNBRK;
  138         if (l & IBCS2_BRKINT)   r |= BRKINT;
  139         if (l & IBCS2_IGNPAR)   r |= IGNPAR;
  140         if (l & IBCS2_PARMRK)   r |= PARMRK;
  141         if (l & IBCS2_INPCK)    r |= INPCK;
  142         if (l & IBCS2_ISTRIP)   r |= ISTRIP;
  143         if (l & IBCS2_INLCR)    r |= INLCR;
  144         if (l & IBCS2_IGNCR)    r |= IGNCR;
  145         if (l & IBCS2_ICRNL)    r |= ICRNL;
  146         if (l & IBCS2_IXON)     r |= IXON;
  147         if (l & IBCS2_IXANY)    r |= IXANY;
  148         if (l & IBCS2_IXOFF)    r |= IXOFF;
  149         if (l & IBCS2_IMAXBEL)  r |= IMAXBEL;
  150         bt->c_iflag = r;
  151 
  152         l = st->c_oflag;        r = 0;
  153         if (l & IBCS2_OPOST)    r |= OPOST;
  154         if (l & IBCS2_ONLCR)    r |= ONLCR;
  155         if (l & IBCS2_TAB3)     r |= OXTABS;
  156         bt->c_oflag = r;
  157 
  158         l = st->c_cflag;        r = 0;
  159         switch (l & IBCS2_CSIZE) {
  160         case IBCS2_CS5:         r |= CS5; break;
  161         case IBCS2_CS6:         r |= CS6; break;
  162         case IBCS2_CS7:         r |= CS7; break;
  163         case IBCS2_CS8:         r |= CS8; break;
  164         }
  165         if (l & IBCS2_CSTOPB)   r |= CSTOPB;
  166         if (l & IBCS2_CREAD)    r |= CREAD;
  167         if (l & IBCS2_PARENB)   r |= PARENB;
  168         if (l & IBCS2_PARODD)   r |= PARODD;
  169         if (l & IBCS2_HUPCL)    r |= HUPCL;
  170         if (l & IBCS2_CLOCAL)   r |= CLOCAL;
  171         bt->c_cflag = r;
  172 
  173         bt->c_ispeed = bt->c_ospeed = s2btab[l & 0x0000000f];
  174 
  175         l = st->c_lflag;        r = 0;
  176         if (l & IBCS2_ISIG)     r |= ISIG;
  177         if (l & IBCS2_ICANON)   r |= ICANON;
  178         if (l & IBCS2_ECHO)     r |= ECHO;
  179         if (l & IBCS2_ECHOE)    r |= ECHOE;
  180         if (l & IBCS2_ECHOK)    r |= ECHOK;
  181         if (l & IBCS2_ECHONL)   r |= ECHONL;
  182         if (l & IBCS2_NOFLSH)   r |= NOFLSH;
  183         if (l & IBCS2_TOSTOP)   r |= TOSTOP;
  184         bt->c_lflag = r;
  185 
  186         bt->c_cc[VINTR] =
  187             st->c_cc[IBCS2_VINTR]  ? st->c_cc[IBCS2_VINTR]  : _POSIX_VDISABLE;
  188         bt->c_cc[VQUIT] =
  189             st->c_cc[IBCS2_VQUIT]  ? st->c_cc[IBCS2_VQUIT]  : _POSIX_VDISABLE;
  190         bt->c_cc[VERASE] =
  191             st->c_cc[IBCS2_VERASE] ? st->c_cc[IBCS2_VERASE] : _POSIX_VDISABLE;
  192         bt->c_cc[VKILL] =
  193             st->c_cc[IBCS2_VKILL]  ? st->c_cc[IBCS2_VKILL]  : _POSIX_VDISABLE;
  194         if (bt->c_lflag & ICANON) {
  195                 bt->c_cc[VEOF] =
  196                     st->c_cc[IBCS2_VEOF] ? st->c_cc[IBCS2_VEOF] : _POSIX_VDISABLE;
  197                 bt->c_cc[VEOL] =
  198                     st->c_cc[IBCS2_VEOL] ? st->c_cc[IBCS2_VEOL] : _POSIX_VDISABLE;
  199         } else {
  200                 bt->c_cc[VMIN]  = st->c_cc[IBCS2_VMIN];
  201                 bt->c_cc[VTIME] = st->c_cc[IBCS2_VTIME];
  202         }
  203         bt->c_cc[VEOL2] =
  204             st->c_cc[IBCS2_VEOL2]  ? st->c_cc[IBCS2_VEOL2]  : _POSIX_VDISABLE;
  205 #if 0
  206         bt->c_cc[VSWTCH] =
  207             st->c_cc[IBCS2_VSWTCH] ? st->c_cc[IBCS2_VSWTCH] : _POSIX_VDISABLE;
  208 #endif
  209         bt->c_cc[VSTART] =
  210             st->c_cc[IBCS2_VSTART] ? st->c_cc[IBCS2_VSTART] : _POSIX_VDISABLE;
  211         bt->c_cc[VSTOP] =
  212             st->c_cc[IBCS2_VSTOP]  ? st->c_cc[IBCS2_VSTOP]  : _POSIX_VDISABLE;
  213         bt->c_cc[VSUSP] =
  214             st->c_cc[IBCS2_VSUSP]  ? st->c_cc[IBCS2_VSUSP]  : _POSIX_VDISABLE;
  215         bt->c_cc[VDSUSP]   = _POSIX_VDISABLE;
  216         bt->c_cc[VREPRINT] = _POSIX_VDISABLE;
  217         bt->c_cc[VDISCARD] = _POSIX_VDISABLE;
  218         bt->c_cc[VWERASE]  = _POSIX_VDISABLE;
  219         bt->c_cc[VLNEXT]   = _POSIX_VDISABLE;
  220         bt->c_cc[VSTATUS]  = _POSIX_VDISABLE;
  221 }
  222 
  223 static void
  224 btios2stios(bt, st)
  225         struct termios *bt;
  226         struct ibcs2_termios *st;
  227 {
  228         register u_long l, r;
  229 
  230         l = bt->c_iflag;        r = 0;
  231         if (l & IGNBRK)         r |= IBCS2_IGNBRK;
  232         if (l & BRKINT)         r |= IBCS2_BRKINT;
  233         if (l & IGNPAR)         r |= IBCS2_IGNPAR;
  234         if (l & PARMRK)         r |= IBCS2_PARMRK;
  235         if (l & INPCK)          r |= IBCS2_INPCK;
  236         if (l & ISTRIP)         r |= IBCS2_ISTRIP;
  237         if (l & INLCR)          r |= IBCS2_INLCR;
  238         if (l & IGNCR)          r |= IBCS2_IGNCR;
  239         if (l & ICRNL)          r |= IBCS2_ICRNL;
  240         if (l & IXON)           r |= IBCS2_IXON;
  241         if (l & IXANY)          r |= IBCS2_IXANY;
  242         if (l & IXOFF)          r |= IBCS2_IXOFF;
  243         if (l & IMAXBEL)        r |= IBCS2_IMAXBEL;
  244         st->c_iflag = r;
  245 
  246         l = bt->c_oflag;        r = 0;
  247         if (l & OPOST)          r |= IBCS2_OPOST;
  248         if (l & ONLCR)          r |= IBCS2_ONLCR;
  249         if (l & OXTABS)         r |= IBCS2_TAB3;
  250         st->c_oflag = r;
  251 
  252         l = bt->c_cflag;        r = 0;
  253         switch (l & CSIZE) {
  254         case CS5:               r |= IBCS2_CS5; break;
  255         case CS6:               r |= IBCS2_CS6; break;
  256         case CS7:               r |= IBCS2_CS7; break;
  257         case CS8:               r |= IBCS2_CS8; break;
  258         }
  259         if (l & CSTOPB)         r |= IBCS2_CSTOPB;
  260         if (l & CREAD)          r |= IBCS2_CREAD;
  261         if (l & PARENB)         r |= IBCS2_PARENB;
  262         if (l & PARODD)         r |= IBCS2_PARODD;
  263         if (l & HUPCL)          r |= IBCS2_HUPCL;
  264         if (l & CLOCAL)         r |= IBCS2_CLOCAL;
  265         st->c_cflag = r;
  266 
  267         l = bt->c_lflag;        r = 0;
  268         if (l & ISIG)           r |= IBCS2_ISIG;
  269         if (l & ICANON)         r |= IBCS2_ICANON;
  270         if (l & ECHO)           r |= IBCS2_ECHO;
  271         if (l & ECHOE)          r |= IBCS2_ECHOE;
  272         if (l & ECHOK)          r |= IBCS2_ECHOK;
  273         if (l & ECHONL)         r |= IBCS2_ECHONL;
  274         if (l & NOFLSH)         r |= IBCS2_NOFLSH;
  275         if (l & TOSTOP)         r |= IBCS2_TOSTOP;
  276         st->c_lflag = r;
  277 
  278         l = ttspeedtab(bt->c_ospeed, sptab);
  279         if ((int)l >= 0)
  280                 st->c_cflag |= l;
  281 
  282         st->c_cc[IBCS2_VINTR] =
  283             bt->c_cc[VINTR]  != _POSIX_VDISABLE ? bt->c_cc[VINTR]  : 0;
  284         st->c_cc[IBCS2_VQUIT] =
  285             bt->c_cc[VQUIT]  != _POSIX_VDISABLE ? bt->c_cc[VQUIT]  : 0;
  286         st->c_cc[IBCS2_VERASE] =
  287             bt->c_cc[VERASE] != _POSIX_VDISABLE ? bt->c_cc[VERASE] : 0;
  288         st->c_cc[IBCS2_VKILL] =
  289             bt->c_cc[VKILL]  != _POSIX_VDISABLE ? bt->c_cc[VKILL]  : 0;
  290         if (bt->c_lflag & ICANON) {
  291                 st->c_cc[IBCS2_VEOF] =
  292                     bt->c_cc[VEOF] != _POSIX_VDISABLE ? bt->c_cc[VEOF] : 0;
  293                 st->c_cc[IBCS2_VEOL] =
  294                     bt->c_cc[VEOL] != _POSIX_VDISABLE ? bt->c_cc[VEOL] : 0;
  295         } else {
  296                 st->c_cc[IBCS2_VMIN]  = bt->c_cc[VMIN];
  297                 st->c_cc[IBCS2_VTIME] = bt->c_cc[VTIME];
  298         }
  299         st->c_cc[IBCS2_VEOL2] =
  300             bt->c_cc[VEOL2]  != _POSIX_VDISABLE ? bt->c_cc[VEOL2]  : 0;
  301         st->c_cc[IBCS2_VSWTCH] =
  302             0;
  303         st->c_cc[IBCS2_VSUSP] =
  304             bt->c_cc[VSUSP]  != _POSIX_VDISABLE ? bt->c_cc[VSUSP]  : 0;
  305         st->c_cc[IBCS2_VSTART] =
  306             bt->c_cc[VSTART] != _POSIX_VDISABLE ? bt->c_cc[VSTART] : 0;
  307         st->c_cc[IBCS2_VSTOP] =
  308             bt->c_cc[VSTOP]  != _POSIX_VDISABLE ? bt->c_cc[VSTOP]  : 0;
  309 
  310         st->c_line = 0;
  311 }
  312 
  313 static void
  314 stios2stio(ts, t)
  315         struct ibcs2_termios *ts;
  316         struct ibcs2_termio *t;
  317 {
  318         t->c_iflag = ts->c_iflag;
  319         t->c_oflag = ts->c_oflag;
  320         t->c_cflag = ts->c_cflag;
  321         t->c_lflag = ts->c_lflag;
  322         t->c_line  = ts->c_line;
  323         bcopy(ts->c_cc, t->c_cc, IBCS2_NCC);
  324 }
  325 
  326 static void
  327 stio2stios(t, ts)
  328         struct ibcs2_termio *t;
  329         struct ibcs2_termios *ts;
  330 {
  331         ts->c_iflag = t->c_iflag;
  332         ts->c_oflag = t->c_oflag;
  333         ts->c_cflag = t->c_cflag;
  334         ts->c_lflag = t->c_lflag;
  335         ts->c_line  = t->c_line;
  336         bcopy(t->c_cc, ts->c_cc, IBCS2_NCC);
  337 }
  338 
  339 int
  340 ibcs2_ioctl(td, uap)
  341         struct thread *td;
  342         struct ibcs2_ioctl_args *uap;
  343 {
  344         struct proc *p = td->td_proc;
  345         struct file *fp;
  346         int error;
  347 
  348         if ((error = fget(td, uap->fd, &fp)) != 0) {
  349                 DPRINTF(("ibcs2_ioctl(%d): bad fd %d ", p->p_pid,
  350                          uap->fd));
  351                 return EBADF;
  352         }
  353 
  354         if ((fp->f_flag & (FREAD|FWRITE)) == 0) {
  355                 fdrop(fp, td);
  356                 DPRINTF(("ibcs2_ioctl(%d): bad fp flag ", p->p_pid));
  357                 return EBADF;
  358         }
  359 
  360         switch (uap->cmd) {
  361         case IBCS2_TCGETA:
  362         case IBCS2_XCGETA:
  363         case IBCS2_OXCGETA:
  364             {
  365                 struct termios bts;
  366                 struct ibcs2_termios sts;
  367                 struct ibcs2_termio st;
  368         
  369                 if ((error = fo_ioctl(fp, TIOCGETA, (caddr_t)&bts,
  370                     td->td_ucred, td)) != 0)
  371                         break;
  372         
  373                 btios2stios (&bts, &sts);
  374                 if (uap->cmd == IBCS2_TCGETA) {
  375                         stios2stio (&sts, &st);
  376                         error = copyout((caddr_t)&st, uap->data,
  377                                         sizeof (st));
  378 #ifdef DEBUG_IBCS2
  379                         if (error)
  380                                 DPRINTF(("ibcs2_ioctl(%d): copyout failed ",
  381                                          p->p_pid));
  382 #endif
  383                         break;
  384                 } else {
  385                         error = copyout((caddr_t)&sts, uap->data,
  386                                         sizeof (sts));
  387                         break;
  388                 }
  389                 /*NOTREACHED*/
  390             }
  391 
  392         case IBCS2_TCSETA:
  393         case IBCS2_TCSETAW:
  394         case IBCS2_TCSETAF:
  395             {
  396                 struct termios bts;
  397                 struct ibcs2_termios sts;
  398                 struct ibcs2_termio st;
  399 
  400                 if ((error = copyin(uap->data, (caddr_t)&st,
  401                                     sizeof(st))) != 0) {
  402                         DPRINTF(("ibcs2_ioctl(%d): TCSET copyin failed ",
  403                                  p->p_pid));
  404                         break;
  405                 }
  406 
  407                 /* get full BSD termios so we don't lose information */
  408                 if ((error = fo_ioctl(fp, TIOCGETA, (caddr_t)&bts,
  409                     td->td_ucred, td)) != 0) {
  410                         DPRINTF(("ibcs2_ioctl(%d): TCSET ctl failed fd %d ",
  411                                  p->p_pid, uap->fd));
  412                         break;
  413                 }
  414 
  415                 /*
  416                  * convert to iBCS2 termios, copy in information from
  417                  * termio, and convert back, then set new values.
  418                  */
  419                 btios2stios(&bts, &sts);
  420                 stio2stios(&st, &sts);
  421                 stios2btios(&sts, &bts);
  422 
  423                 error = fo_ioctl(fp, uap->cmd - IBCS2_TCSETA + TIOCSETA,
  424                               (caddr_t)&bts, td->td_ucred, td);
  425                 break;
  426             }
  427 
  428         case IBCS2_XCSETA:
  429         case IBCS2_XCSETAW:
  430         case IBCS2_XCSETAF:
  431             {
  432                 struct termios bts;
  433                 struct ibcs2_termios sts;
  434 
  435                 if ((error = copyin(uap->data, (caddr_t)&sts,
  436                                     sizeof (sts))) != 0)
  437                         break;
  438                 stios2btios (&sts, &bts);
  439                 error = fo_ioctl(fp, uap->cmd - IBCS2_XCSETA + TIOCSETA,
  440                               (caddr_t)&bts, td->td_ucred, td);
  441                 break;
  442             }
  443 
  444         case IBCS2_OXCSETA:
  445         case IBCS2_OXCSETAW:
  446         case IBCS2_OXCSETAF:
  447             {
  448                 struct termios bts;
  449                 struct ibcs2_termios sts;
  450 
  451                 if ((error = copyin(uap->data, (caddr_t)&sts,
  452                                     sizeof (sts))) != 0)
  453                         break;
  454                 stios2btios (&sts, &bts);
  455                 error = fo_ioctl(fp, uap->cmd - IBCS2_OXCSETA + TIOCSETA,
  456                               (caddr_t)&bts, td->td_ucred, td);
  457                 break;
  458             }
  459 
  460         case IBCS2_TCSBRK:
  461                 DPRINTF(("ibcs2_ioctl(%d): TCSBRK ", p->p_pid));
  462                 error = ENOSYS;
  463                 break;
  464 
  465         case IBCS2_TCXONC:
  466             {
  467                 switch ((int)uap->data) {
  468                 case 0:
  469                 case 1:
  470                         DPRINTF(("ibcs2_ioctl(%d): TCXONC ", p->p_pid));
  471                         error = ENOSYS;
  472                         break;
  473                 case 2:
  474                         error = fo_ioctl(fp, TIOCSTOP, (caddr_t)0,
  475                             td->td_ucred, td);
  476                         break;
  477                 case 3:
  478                         error = fo_ioctl(fp, TIOCSTART, (caddr_t)1,
  479                             td->td_ucred, td);
  480                         break;
  481                 default:
  482                         error = EINVAL;
  483                         break;
  484                 }
  485                 break;
  486             }
  487 
  488         case IBCS2_TCFLSH:
  489             {
  490                 int arg;
  491 
  492                 switch ((int)uap->data) {
  493                 case 0:
  494                         arg = FREAD;
  495                         break;
  496                 case 1:
  497                         arg = FWRITE;
  498                         break;
  499                 case 2:
  500                         arg = FREAD | FWRITE;
  501                         break;
  502                 default:
  503                         fdrop(fp, td);
  504                         return EINVAL;
  505                 }
  506                 error = fo_ioctl(fp, TIOCFLUSH, (caddr_t)&arg, td->td_ucred,
  507                     td);
  508                 break;
  509             }
  510 
  511         case IBCS2_TIOCGWINSZ:
  512                 uap->cmd = TIOCGWINSZ;
  513                 error = ioctl(td, (struct ioctl_args *)uap);
  514                 break;
  515 
  516         case IBCS2_TIOCSWINSZ:
  517                 uap->cmd = TIOCSWINSZ;
  518                 error = ioctl(td, (struct ioctl_args *)uap);
  519                 break;
  520 
  521         case IBCS2_TIOCGPGRP:
  522             {
  523                 pid_t   pg_id;
  524 
  525                 PROC_LOCK(p);
  526                 pg_id = p->p_pgrp->pg_id;
  527                 PROC_UNLOCK(p);
  528                 error = copyout((caddr_t)&pg_id, uap->data,
  529                                 sizeof(pg_id));
  530                 break;
  531             }
  532 
  533         case IBCS2_TIOCSPGRP:   /* XXX - is uap->data a pointer to pgid? */
  534             {
  535                 struct setpgid_args sa;
  536 
  537                 sa.pid = 0;
  538                 sa.pgid = (int)uap->data;
  539                 error = setpgid(td, &sa);
  540                 break;
  541             }
  542 
  543         case IBCS2_TCGETSC:     /* SCO console - get scancode flags */
  544                 error = EINTR;  /* ENOSYS; */
  545                 break;
  546 
  547         case IBCS2_TCSETSC:     /* SCO console - set scancode flags */
  548                 error = 0;   /* ENOSYS; */
  549                 break;
  550 
  551         case IBCS2_JWINSIZE:    /* Unix to Jerq I/O control */
  552             {
  553                 struct ibcs2_jwinsize {
  554                   char bytex, bytey; 
  555                   short bitx, bity;
  556                 } ibcs2_jwinsize;
  557 
  558                 PROC_LOCK(p);
  559                 SESS_LOCK(p->p_session);
  560                 ibcs2_jwinsize.bytex = 80;
  561                   /* p->p_session->s_ttyp->t_winsize.ws_col; XXX */
  562                 ibcs2_jwinsize.bytey = 25;
  563                   /* p->p_session->s_ttyp->t_winsize.ws_row; XXX */
  564                 ibcs2_jwinsize.bitx = 
  565                   p->p_session->s_ttyp->t_winsize.ws_xpixel;
  566                 ibcs2_jwinsize.bity =
  567                   p->p_session->s_ttyp->t_winsize.ws_ypixel;
  568                 SESS_UNLOCK(p->p_session);
  569                 PROC_UNLOCK(p);
  570                 error = copyout((caddr_t)&ibcs2_jwinsize, uap->data,
  571                                sizeof(ibcs2_jwinsize));
  572                 break;
  573              }
  574 
  575         /* keyboard and display ioctl's -- type 'K' */
  576         case IBCS2_KDGKBMODE:        /* get keyboard translation mode */
  577                 uap->cmd = KDGKBMODE;
  578 /* printf("ioctl KDGKBMODE = %x\n", uap->cmd);*/
  579                 error = ioctl(td, (struct ioctl_args *)uap);
  580                 break;
  581 
  582         case IBCS2_KDSKBMODE:        /* set keyboard translation mode */
  583                 uap->cmd = KDSKBMODE;
  584                 error = ioctl(td, (struct ioctl_args *)uap);
  585                 break;
  586 
  587         case IBCS2_KDMKTONE:        /* sound tone */
  588                 uap->cmd = KDMKTONE;
  589                 error = ioctl(td, (struct ioctl_args *)uap);
  590                 break;
  591 
  592         case IBCS2_KDGETMODE:        /* get text/graphics mode */  
  593                 uap->cmd = KDGETMODE;
  594                 error = ioctl(td, (struct ioctl_args *)uap);
  595                 break;
  596 
  597         case IBCS2_KDSETMODE:       /* set text/graphics mode */
  598                 uap->cmd = KDSETMODE;
  599                 error = ioctl(td, (struct ioctl_args *)uap);
  600                 break;
  601 
  602         case IBCS2_KDSBORDER:       /* set ega color border */
  603                 uap->cmd = KDSBORDER;
  604                 error = ioctl(td, (struct ioctl_args *)uap);
  605                 break;
  606 
  607         case IBCS2_KDGKBSTATE:
  608                 uap->cmd = KDGKBSTATE;
  609                 error = ioctl(td, (struct ioctl_args *)uap);
  610                 break;
  611 
  612         case IBCS2_KDSETRAD:
  613                 uap->cmd = KDSETRAD;
  614                 error = ioctl(td, (struct ioctl_args *)uap);
  615                 break;
  616 
  617         case IBCS2_KDENABIO:       /* enable direct I/O to ports */
  618                 uap->cmd = KDENABIO;
  619                 error = ioctl(td, (struct ioctl_args *)uap);
  620                 break;
  621 
  622         case IBCS2_KDDISABIO:       /* disable direct I/O to ports */
  623                 uap->cmd = KDDISABIO;
  624                 error = ioctl(td, (struct ioctl_args *)uap);
  625                 break;
  626 
  627         case IBCS2_KIOCSOUND:       /* start sound generation */
  628                 uap->cmd = KIOCSOUND;
  629                 error = ioctl(td, (struct ioctl_args *)uap);
  630                 break;
  631 
  632         case IBCS2_KDGKBTYPE:       /* get keyboard type */
  633                 uap->cmd = KDGKBTYPE;
  634                 error = ioctl(td, (struct ioctl_args *)uap);
  635                 break;
  636 
  637         case IBCS2_KDGETLED:       /* get keyboard LED status */
  638                 uap->cmd = KDGETLED;
  639                 error = ioctl(td, (struct ioctl_args *)uap);
  640                 break;
  641 
  642         case IBCS2_KDSETLED:       /* set keyboard LED status */
  643                 uap->cmd = KDSETLED;
  644                 error = ioctl(td, (struct ioctl_args *)uap);
  645                 break;
  646 
  647             /* Xenix keyboard and display ioctl's from sys/kd.h -- type 'k' */
  648         case IBCS2_GETFKEY:      /* Get function key */
  649                 uap->cmd = GETFKEY;
  650                 error = ioctl(td, (struct ioctl_args *)uap);
  651                 break;
  652 
  653         case IBCS2_SETFKEY:      /* Set function key */
  654                 uap->cmd = SETFKEY;
  655                 error = ioctl(td, (struct ioctl_args *)uap);
  656                 break;
  657 
  658         case IBCS2_GIO_SCRNMAP:      /* Get screen output map table */
  659                 uap->cmd = GIO_SCRNMAP;
  660                 error = ioctl(td, (struct ioctl_args *)uap);
  661                 break;
  662 
  663         case IBCS2_PIO_SCRNMAP:      /* Set screen output map table */
  664                 uap->cmd = PIO_SCRNMAP;
  665                 error = ioctl(td, (struct ioctl_args *)uap);
  666                 break;
  667 
  668         case IBCS2_GIO_KEYMAP:      /* Get keyboard map table */
  669                 uap->cmd = GIO_KEYMAP;
  670                 error = ioctl(td, (struct ioctl_args *)uap);
  671                 break;
  672 
  673         case IBCS2_PIO_KEYMAP:      /* Set keyboard map table */
  674                 uap->cmd = PIO_KEYMAP;
  675                 error = ioctl(td, (struct ioctl_args *)uap);
  676                 break;
  677 
  678             /* socksys */
  679         case IBCS2_SIOCSOCKSYS:
  680                 error = ibcs2_socksys(td, (struct ibcs2_socksys_args *)uap);
  681                 break;
  682 
  683         case IBCS2_FIONREAD:
  684         case IBCS2_I_NREAD:     /* STREAMS */
  685                 uap->cmd = FIONREAD;
  686                 error = ioctl(td, (struct ioctl_args *)uap);
  687                 break;
  688 
  689         default:
  690                 DPRINTF(("ibcs2_ioctl(%d): unknown cmd 0x%lx ",
  691                          td->proc->p_pid, uap->cmd));
  692                 error = ENOSYS;
  693                 break;
  694         }
  695 
  696         fdrop(fp, td);
  697         return error;
  698 }

Cache object: ce0ff0501c47e6149ed531b10a9b9707


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.