root/compat/svr4/svr4_ioctl.c

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

DEFINITIONS

This source file includes following definitions.
  1. svr4_decode_cmd
  2. svr4_sys_ioctl

    1 /*      $OpenBSD: svr4_ioctl.c,v 1.12 2002/11/06 09:57:18 niklas Exp $   */
    2 /*      $NetBSD: svr4_ioctl.c,v 1.16 1996/04/11 12:54:41 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_syscallargs.h>
   50 #include <compat/svr4/svr4_stropts.h>
   51 #include <compat/svr4/svr4_ioctl.h>
   52 #include <compat/svr4/svr4_jioctl.h>
   53 #include <compat/svr4/svr4_termios.h>
   54 #include <compat/svr4/svr4_ttold.h>
   55 #include <compat/svr4/svr4_filio.h>
   56 #include <compat/svr4/svr4_sockio.h>
   57 
   58 #ifdef DEBUG_SVR4
   59 static void svr4_decode_cmd(u_long, char *, char *, int *, int *);
   60 /*
   61  * Decode an ioctl command symbolically
   62  */
   63 static void
   64 svr4_decode_cmd(cmd, dir, c, num, argsiz)
   65         u_long            cmd;
   66         char             *dir, *c;
   67         int              *num, *argsiz;
   68 {
   69         if (cmd & SVR4_IOC_VOID)
   70                 *dir++ = 'V';
   71         if (cmd & SVR4_IOC_IN)
   72                 *dir++ = 'R';
   73         if (cmd & SVR4_IOC_OUT)
   74                 *dir++ = 'W';
   75         *dir = '\0';
   76         if (cmd & SVR4_IOC_INOUT)
   77                 *argsiz = (cmd >> 16) & 0xff;
   78         else
   79                 *argsiz = -1;
   80 
   81         *c = (cmd >> 8) & 0xff;
   82         *num = cmd & 0xff;
   83 }
   84 #endif
   85 
   86 int
   87 svr4_sys_ioctl(p, v, retval)
   88         register struct proc *p;
   89         void *v;
   90         register_t *retval;
   91 {
   92         struct svr4_sys_ioctl_args *uap = v;
   93         struct file     *fp;
   94         struct filedesc *fdp;
   95         u_long           cmd;
   96         int (*fun)(struct file *, struct proc *, register_t *,
   97                         int, u_long, caddr_t);
   98         int error = 0;
   99 #ifdef DEBUG_SVR4
  100         char             dir[4];
  101         char             c;
  102         int              num;
  103         int              argsiz;
  104 
  105         svr4_decode_cmd(SCARG(uap, com), dir, &c, &num, &argsiz);
  106 
  107         uprintf("svr4_ioctl(%d, _IO%s(%c, %d, %d), %p);\n", SCARG(uap, fd),
  108             dir, c, num, argsiz, SCARG(uap, data));
  109 #endif
  110         fdp = p->p_fd;
  111         cmd = SCARG(uap, com);
  112 
  113         if ((fp = fd_getfile(fdp, SCARG(uap, fd))) == NULL)
  114                 return EBADF;
  115 
  116         if ((fp->f_flag & (FREAD | FWRITE)) == 0)
  117                 return EBADF;
  118 
  119         switch (cmd & 0xff00) {
  120         case SVR4_tIOC:
  121                 fun = svr4_ttold_ioctl;
  122                 break;
  123 
  124         case SVR4_TIOC:
  125                 fun = svr4_term_ioctl;
  126                 break;
  127 
  128         case SVR4_STR:
  129                 fun = svr4_stream_ioctl;
  130                 break;
  131 
  132         case SVR4_FIOC:
  133                 fun = svr4_fil_ioctl;
  134                 break;
  135 
  136         case SVR4_SIOC:
  137                 fun = svr4_sock_ioctl;
  138                 break;
  139 
  140         case SVR4_jIOC:
  141                 fun = svr4_jerq_ioctl;
  142                 break;
  143 
  144         case SVR4_XIOC:
  145                 /* We do not support those */
  146                 error = EINVAL;
  147                 goto out;
  148 
  149         default:
  150                 DPRINTF(("Unimplemented ioctl %lx\n", cmd));
  151                 error = 0;      /* XXX: really ENOSYS */
  152                 goto out;
  153         }
  154         FREF(fp);
  155         error = (*fun)(fp, p, retval, SCARG(uap, fd), cmd, SCARG(uap, data));
  156         FRELE(fp);
  157 out:
  158         return (error);
  159 }

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