Home | History | Annotate | Download | only in strace
      1 /*
      2  * Copyright (c) 1991, 1992 Paul Kranenburg <pk (at) cs.few.eur.nl>
      3  * Copyright (c) 1993 Branko Lankester <branko (at) hacktic.nl>
      4  * Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs (at) world.std.com>
      5  * Copyright (c) 1996-2001 Wichert Akkerman <wichert (at) cistron.nl>
      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  *	$Id: ioctl.c,v 1.14 2005/02/02 20:32:13 roland Exp $
     31  */
     32 
     33 #include "defs.h"
     34 
     35 const struct ioctlent ioctlent0[] = {
     36 /*
     37  * `ioctlent.h' may be generated from `ioctlent.raw' by the auxiliary
     38  * program `ioctlsort', such that the list is sorted by the `code' field.
     39  * This has the side-effect of resolving the _IO.. macros into
     40  * plain integers, eliminating the need to include here everything
     41  * in "/usr/include" .
     42  */
     43 #include "ioctlent.h"
     44 };
     45 
     46 #ifdef LINUX
     47 #include <asm/ioctl.h>
     48 #endif
     49 
     50 const int nioctlents0 = sizeof ioctlent0 / sizeof ioctlent0[0];
     51 
     52 #if SUPPORTED_PERSONALITIES >= 2
     53 const struct ioctlent ioctlent1[] = {
     54 #include "ioctlent1.h"
     55 };
     56 
     57 const int nioctlents1 = sizeof ioctlent1 / sizeof ioctlent1[0];
     58 #endif /* SUPPORTED_PERSONALITIES >= 2 */
     59 
     60 #if SUPPORTED_PERSONALITIES >= 3
     61 const struct ioctlent ioctlent2[] = {
     62 #include "ioctlent2.h"
     63 };
     64 
     65 const int nioctlents2 = sizeof ioctlent2 / sizeof ioctlent2[0];
     66 #endif /* SUPPORTED_PERSONALITIES >= 3 */
     67 
     68 const struct ioctlent *ioctlent;
     69 int nioctlents;
     70 
     71 static int
     72 compare(a, b)
     73 const void *a;
     74 const void *b;
     75 {
     76 	unsigned long code1 = ((struct ioctlent *) a)->code;
     77 	unsigned long code2 = ((struct ioctlent *) b)->code;
     78 	return (code1 > code2) ? 1 : (code1 < code2) ? -1 : 0;
     79 }
     80 
     81 const struct ioctlent *
     82 ioctl_lookup(code)
     83 long code;
     84 {
     85 	struct ioctlent *iop, ioent;
     86 
     87 	ioent.code = code;
     88 #ifdef LINUX
     89 	ioent.code &= (_IOC_NRMASK<<_IOC_NRSHIFT) | (_IOC_TYPEMASK<<_IOC_TYPESHIFT);
     90 #endif
     91 	iop = (struct ioctlent *) bsearch((char *) &ioent, (char *) ioctlent,
     92 			nioctlents, sizeof(struct ioctlent), compare);
     93 	while (iop > ioctlent)
     94 		if ((--iop)->code != ioent.code) {
     95 			iop++;
     96 			break;
     97 		}
     98 	return iop;
     99 }
    100 
    101 const struct ioctlent *
    102 ioctl_next_match(iop)
    103 const struct ioctlent *iop;
    104 {
    105 	long code;
    106 
    107 	code = (iop++)->code;
    108 	if (iop < ioctlent + nioctlents && iop->code == code)
    109 		return iop;
    110 	return NULL;
    111 }
    112 
    113 int
    114 ioctl_decode(tcp, code, arg)
    115 struct tcb *tcp;
    116 long code, arg;
    117 {
    118 	switch ((code >> 8) & 0xff) {
    119 #ifdef LINUX
    120 #if defined(ALPHA) || defined(POWERPC)
    121 	case 'f': case 't': case 'T':
    122 #else /* !ALPHA */
    123 	case 0x54:
    124 #endif /* !ALPHA */
    125 #else /* !LINUX */
    126 	case 'f': case 't': case 'T':
    127 #endif /* !LINUX */
    128 		return term_ioctl(tcp, code, arg);
    129 #ifdef LINUX
    130 	case 0x89:
    131 #else /* !LINUX */
    132 	case 'r': case 's': case 'i':
    133 #ifndef FREEBSD
    134 	case 'p':
    135 #endif
    136 #endif /* !LINUX */
    137 		return sock_ioctl(tcp, code, arg);
    138 #ifdef USE_PROCFS
    139 #ifndef HAVE_MP_PROCFS
    140 #ifndef FREEBSD
    141 	case 'q':
    142 #else
    143 	case 'p':
    144 #endif
    145 		return proc_ioctl(tcp, code, arg);
    146 #endif
    147 #endif /* USE_PROCFS */
    148 #ifdef HAVE_SYS_STREAM_H
    149 	case 'S':
    150 		return stream_ioctl(tcp, code, arg);
    151 #endif /* HAVE_SYS_STREAM_H */
    152 #ifdef LINUX
    153 	case 'p':
    154 		return rtc_ioctl(tcp, code, arg);
    155 #endif
    156 	default:
    157 		break;
    158 	}
    159 	return 0;
    160 }
    161 
    162 /*
    163  * Registry of ioctl characters, culled from
    164  *	@(#)ioccom.h 1.7 89/06/16 SMI; from UCB ioctl.h 7.1 6/4/86
    165  *
    166  * char	file where defined		notes
    167  * ----	------------------		-----
    168  *   F	sun/fbio.h
    169  *   G	sun/gpio.h
    170  *   H	vaxif/if_hy.h
    171  *   M	sundev/mcpcmd.h			*overlap*
    172  *   M	sys/modem.h			*overlap*
    173  *   S	sys/stropts.h
    174  *   T	sys/termio.h			-no overlap-
    175  *   T	sys/termios.h			-no overlap-
    176  *   V	sundev/mdreg.h
    177  *   a	vaxuba/adreg.h
    178  *   d	sun/dkio.h			-no overlap with sys/des.h-
    179  *   d	sys/des.h			(possible overlap)
    180  *   d	vax/dkio.h			(possible overlap)
    181  *   d	vaxuba/rxreg.h			(possible overlap)
    182  *   f	sys/filio.h
    183  *   g	sunwindow/win_ioctl.h		-no overlap-
    184  *   g	sunwindowdev/winioctl.c		!no manifest constant! -no overlap-
    185  *   h	sundev/hrc_common.h
    186  *   i	sys/sockio.h			*overlap*
    187  *   i	vaxuba/ikreg.h			*overlap*
    188  *   k	sundev/kbio.h
    189  *   m	sundev/msio.h			(possible overlap)
    190  *   m	sundev/msreg.h			(possible overlap)
    191  *   m	sys/mtio.h			(possible overlap)
    192  *   n	sun/ndio.h
    193  *   p	net/nit_buf.h			(possible overlap)
    194  *   p	net/nit_if.h			(possible overlap)
    195  *   p	net/nit_pf.h			(possible overlap)
    196  *   p	sundev/fpareg.h			(possible overlap)
    197  *   p	sys/sockio.h			(possible overlap)
    198  *   p	vaxuba/psreg.h			(possible overlap)
    199  *   q	sun/sqz.h
    200  *   r	sys/sockio.h
    201  *   s	sys/sockio.h
    202  *   t	sys/ttold.h			(possible overlap)
    203  *   t	sys/ttycom.h			(possible overlap)
    204  *   v	sundev/vuid_event.h		*overlap*
    205  *   v	sys/vcmd.h			*overlap*
    206  *
    207  * End of Registry
    208  */
    209