1999-02-19 03:21:36 +03:00
/*
* Copyright ( c ) 1991 , 1992 Paul Kranenburg < pk @ cs . few . eur . nl >
* Copyright ( c ) 1993 Branko Lankester < branko @ hacktic . nl >
* Copyright ( c ) 1993 , 1994 , 1995 , 1996 Rick Sladkey < jrs @ world . std . com >
2001-08-04 01:52:13 +04:00
* Copyright ( c ) 1996 - 2001 Wichert Akkerman < wichert @ cistron . nl >
1999-02-19 03:21:36 +03:00
* All rights reserved .
*
* Redistribution and use in source and binary forms , with or without
* modification , are permitted provided that the following conditions
* are met :
* 1. Redistributions of source code must retain the above copyright
* notice , this list of conditions and the following disclaimer .
* 2. Redistributions in binary form must reproduce the above copyright
* notice , this list of conditions and the following disclaimer in the
* documentation and / or other materials provided with the distribution .
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission .
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ` ` AS IS ' ' AND ANY EXPRESS OR
* IMPLIED WARRANTIES , INCLUDING , BUT NOT LIMITED TO , THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED .
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT , INDIRECT ,
* INCIDENTAL , SPECIAL , EXEMPLARY , OR CONSEQUENTIAL DAMAGES ( INCLUDING , BUT
* NOT LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES ; LOSS OF USE ,
* DATA , OR PROFITS ; OR BUSINESS INTERRUPTION ) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT LIABILITY , OR TORT
* ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE .
*
* $ Id $
*/
# include "defs.h"
2004-09-03 Roland McGrath <roland@redhat.com>
* syscall.c (sysent0, sysent1, sysent2, sysent): Add const to defn.
(nsyscalls0, nsyscalls1, nsyscalls2): Likewise.
(errnoent0, errnoent1, errnoent2, errnoent): Likewise.
(nerrnos0, nerrnos1, nerrnos2): Likewise.
* signal.c (signalent0, signalent1, signalent2): Likewise.
(nsignals0, nsignals1, nsignals2): Likewise.
(signame): LIkewise.
* ioctl.c (ioctlent0, ioctlent1, ioctlent2): Likewise.
(nioctlents0, nioctlents1, nioctlents2): Likewise.
(ioctl_lookup, ioctl_next_match): Likewise.
* defs.h: Update decls.
* io.c (sys_ioctl): Update users.
2004-09-04 07:53:10 +04:00
const struct ioctlent ioctlent0 [ ] = {
1999-02-19 03:21:36 +03:00
/*
* ` ioctlent . h ' may be generated from ` ioctlent . raw ' by the auxiliary
* program ` ioctlsort ' , such that the list is sorted by the ` code ' field .
* This has the side - effect of resolving the _IO . . macros into
* plain integers , eliminating the need to include here everything
* in " /usr/include " .
*/
# include "ioctlent.h"
} ;
2001-03-17 20:26:34 +03:00
# ifdef LINUX
# include <asm/ioctl.h>
# endif
2004-09-03 Roland McGrath <roland@redhat.com>
* syscall.c (sysent0, sysent1, sysent2, sysent): Add const to defn.
(nsyscalls0, nsyscalls1, nsyscalls2): Likewise.
(errnoent0, errnoent1, errnoent2, errnoent): Likewise.
(nerrnos0, nerrnos1, nerrnos2): Likewise.
* signal.c (signalent0, signalent1, signalent2): Likewise.
(nsignals0, nsignals1, nsignals2): Likewise.
(signame): LIkewise.
* ioctl.c (ioctlent0, ioctlent1, ioctlent2): Likewise.
(nioctlents0, nioctlents1, nioctlents2): Likewise.
(ioctl_lookup, ioctl_next_match): Likewise.
* defs.h: Update decls.
* io.c (sys_ioctl): Update users.
2004-09-04 07:53:10 +04:00
const int nioctlents0 = sizeof ioctlent0 / sizeof ioctlent0 [ 0 ] ;
1999-02-19 03:21:36 +03:00
# if SUPPORTED_PERSONALITIES >= 2
2004-09-03 Roland McGrath <roland@redhat.com>
* syscall.c (sysent0, sysent1, sysent2, sysent): Add const to defn.
(nsyscalls0, nsyscalls1, nsyscalls2): Likewise.
(errnoent0, errnoent1, errnoent2, errnoent): Likewise.
(nerrnos0, nerrnos1, nerrnos2): Likewise.
* signal.c (signalent0, signalent1, signalent2): Likewise.
(nsignals0, nsignals1, nsignals2): Likewise.
(signame): LIkewise.
* ioctl.c (ioctlent0, ioctlent1, ioctlent2): Likewise.
(nioctlents0, nioctlents1, nioctlents2): Likewise.
(ioctl_lookup, ioctl_next_match): Likewise.
* defs.h: Update decls.
* io.c (sys_ioctl): Update users.
2004-09-04 07:53:10 +04:00
const struct ioctlent ioctlent1 [ ] = {
1999-02-19 03:21:36 +03:00
# include "ioctlent1.h"
} ;
2004-09-03 Roland McGrath <roland@redhat.com>
* syscall.c (sysent0, sysent1, sysent2, sysent): Add const to defn.
(nsyscalls0, nsyscalls1, nsyscalls2): Likewise.
(errnoent0, errnoent1, errnoent2, errnoent): Likewise.
(nerrnos0, nerrnos1, nerrnos2): Likewise.
* signal.c (signalent0, signalent1, signalent2): Likewise.
(nsignals0, nsignals1, nsignals2): Likewise.
(signame): LIkewise.
* ioctl.c (ioctlent0, ioctlent1, ioctlent2): Likewise.
(nioctlents0, nioctlents1, nioctlents2): Likewise.
(ioctl_lookup, ioctl_next_match): Likewise.
* defs.h: Update decls.
* io.c (sys_ioctl): Update users.
2004-09-04 07:53:10 +04:00
const int nioctlents1 = sizeof ioctlent1 / sizeof ioctlent1 [ 0 ] ;
1999-02-19 03:21:36 +03:00
# endif /* SUPPORTED_PERSONALITIES >= 2 */
# if SUPPORTED_PERSONALITIES >= 3
2004-09-03 Roland McGrath <roland@redhat.com>
* syscall.c (sysent0, sysent1, sysent2, sysent): Add const to defn.
(nsyscalls0, nsyscalls1, nsyscalls2): Likewise.
(errnoent0, errnoent1, errnoent2, errnoent): Likewise.
(nerrnos0, nerrnos1, nerrnos2): Likewise.
* signal.c (signalent0, signalent1, signalent2): Likewise.
(nsignals0, nsignals1, nsignals2): Likewise.
(signame): LIkewise.
* ioctl.c (ioctlent0, ioctlent1, ioctlent2): Likewise.
(nioctlents0, nioctlents1, nioctlents2): Likewise.
(ioctl_lookup, ioctl_next_match): Likewise.
* defs.h: Update decls.
* io.c (sys_ioctl): Update users.
2004-09-04 07:53:10 +04:00
const struct ioctlent ioctlent2 [ ] = {
1999-02-19 03:21:36 +03:00
# include "ioctlent2.h"
} ;
2005-02-02 23:32:13 +03:00
const int nioctlents2 = sizeof ioctlent2 / sizeof ioctlent2 [ 0 ] ;
1999-02-19 03:21:36 +03:00
# endif /* SUPPORTED_PERSONALITIES >= 3 */
2004-09-03 Roland McGrath <roland@redhat.com>
* syscall.c (sysent0, sysent1, sysent2, sysent): Add const to defn.
(nsyscalls0, nsyscalls1, nsyscalls2): Likewise.
(errnoent0, errnoent1, errnoent2, errnoent): Likewise.
(nerrnos0, nerrnos1, nerrnos2): Likewise.
* signal.c (signalent0, signalent1, signalent2): Likewise.
(nsignals0, nsignals1, nsignals2): Likewise.
(signame): LIkewise.
* ioctl.c (ioctlent0, ioctlent1, ioctlent2): Likewise.
(nioctlents0, nioctlents1, nioctlents2): Likewise.
(ioctl_lookup, ioctl_next_match): Likewise.
* defs.h: Update decls.
* io.c (sys_ioctl): Update users.
2004-09-04 07:53:10 +04:00
const struct ioctlent * ioctlent ;
1999-02-19 03:21:36 +03:00
int nioctlents ;
static int
compare ( a , b )
const void * a ;
const void * b ;
{
unsigned long code1 = ( ( struct ioctlent * ) a ) - > code ;
unsigned long code2 = ( ( struct ioctlent * ) b ) - > code ;
return ( code1 > code2 ) ? 1 : ( code1 < code2 ) ? - 1 : 0 ;
}
2004-09-03 Roland McGrath <roland@redhat.com>
* syscall.c (sysent0, sysent1, sysent2, sysent): Add const to defn.
(nsyscalls0, nsyscalls1, nsyscalls2): Likewise.
(errnoent0, errnoent1, errnoent2, errnoent): Likewise.
(nerrnos0, nerrnos1, nerrnos2): Likewise.
* signal.c (signalent0, signalent1, signalent2): Likewise.
(nsignals0, nsignals1, nsignals2): Likewise.
(signame): LIkewise.
* ioctl.c (ioctlent0, ioctlent1, ioctlent2): Likewise.
(nioctlents0, nioctlents1, nioctlents2): Likewise.
(ioctl_lookup, ioctl_next_match): Likewise.
* defs.h: Update decls.
* io.c (sys_ioctl): Update users.
2004-09-04 07:53:10 +04:00
const struct ioctlent *
1999-02-19 03:21:36 +03:00
ioctl_lookup ( code )
long code ;
{
struct ioctlent * iop , ioent ;
ioent . code = code ;
2001-03-17 20:26:34 +03:00
# ifdef LINUX
2001-08-04 01:51:35 +04:00
ioent . code & = ( _IOC_NRMASK < < _IOC_NRSHIFT ) | ( _IOC_TYPEMASK < < _IOC_TYPESHIFT ) ;
2001-03-17 20:26:34 +03:00
# endif
1999-02-19 03:21:36 +03:00
iop = ( struct ioctlent * ) bsearch ( ( char * ) & ioent , ( char * ) ioctlent ,
nioctlents , sizeof ( struct ioctlent ) , compare ) ;
2003-11-14 05:54:03 +03:00
while ( iop > ioctlent )
if ( ( - - iop ) - > code ! = ioent . code ) {
iop + + ;
break ;
}
return iop ;
}
2004-09-03 Roland McGrath <roland@redhat.com>
* syscall.c (sysent0, sysent1, sysent2, sysent): Add const to defn.
(nsyscalls0, nsyscalls1, nsyscalls2): Likewise.
(errnoent0, errnoent1, errnoent2, errnoent): Likewise.
(nerrnos0, nerrnos1, nerrnos2): Likewise.
* signal.c (signalent0, signalent1, signalent2): Likewise.
(nsignals0, nsignals1, nsignals2): Likewise.
(signame): LIkewise.
* ioctl.c (ioctlent0, ioctlent1, ioctlent2): Likewise.
(nioctlents0, nioctlents1, nioctlents2): Likewise.
(ioctl_lookup, ioctl_next_match): Likewise.
* defs.h: Update decls.
* io.c (sys_ioctl): Update users.
2004-09-04 07:53:10 +04:00
const struct ioctlent *
2003-11-14 05:54:03 +03:00
ioctl_next_match ( iop )
2004-09-03 Roland McGrath <roland@redhat.com>
* syscall.c (sysent0, sysent1, sysent2, sysent): Add const to defn.
(nsyscalls0, nsyscalls1, nsyscalls2): Likewise.
(errnoent0, errnoent1, errnoent2, errnoent): Likewise.
(nerrnos0, nerrnos1, nerrnos2): Likewise.
* signal.c (signalent0, signalent1, signalent2): Likewise.
(nsignals0, nsignals1, nsignals2): Likewise.
(signame): LIkewise.
* ioctl.c (ioctlent0, ioctlent1, ioctlent2): Likewise.
(nioctlents0, nioctlents1, nioctlents2): Likewise.
(ioctl_lookup, ioctl_next_match): Likewise.
* defs.h: Update decls.
* io.c (sys_ioctl): Update users.
2004-09-04 07:53:10 +04:00
const struct ioctlent * iop ;
2003-11-14 05:54:03 +03:00
{
long code ;
code = ( iop + + ) - > code ;
if ( iop < ioctlent + nioctlents & & iop - > code = = code )
return iop ;
return NULL ;
1999-02-19 03:21:36 +03:00
}
int
ioctl_decode ( tcp , code , arg )
struct tcb * tcp ;
long code , arg ;
{
switch ( ( code > > 8 ) & 0xff ) {
# ifdef LINUX
2003-01-14 10:53:34 +03:00
# if defined(ALPHA) || defined(POWERPC)
1999-02-19 03:21:36 +03:00
case ' f ' : case ' t ' : case ' T ' :
# else /* !ALPHA */
case 0x54 :
# endif /* !ALPHA */
# else /* !LINUX */
case ' f ' : case ' t ' : case ' T ' :
# endif /* !LINUX */
return term_ioctl ( tcp , code , arg ) ;
# ifdef LINUX
case 0x89 :
# else /* !LINUX */
2000-09-02 01:03:06 +04:00
case ' r ' : case ' s ' : case ' i ' :
2004-09-03 Roland McGrath <roland@redhat.com>
* syscall.c (sysent0, sysent1, sysent2, sysent): Add const to defn.
(nsyscalls0, nsyscalls1, nsyscalls2): Likewise.
(errnoent0, errnoent1, errnoent2, errnoent): Likewise.
(nerrnos0, nerrnos1, nerrnos2): Likewise.
* signal.c (signalent0, signalent1, signalent2): Likewise.
(nsignals0, nsignals1, nsignals2): Likewise.
(signame): LIkewise.
* ioctl.c (ioctlent0, ioctlent1, ioctlent2): Likewise.
(nioctlents0, nioctlents1, nioctlents2): Likewise.
(ioctl_lookup, ioctl_next_match): Likewise.
* defs.h: Update decls.
* io.c (sys_ioctl): Update users.
2004-09-04 07:53:10 +04:00
# ifndef FREEBSD
2000-09-02 01:03:06 +04:00
case ' p ' :
2004-09-03 Roland McGrath <roland@redhat.com>
* syscall.c (sysent0, sysent1, sysent2, sysent): Add const to defn.
(nsyscalls0, nsyscalls1, nsyscalls2): Likewise.
(errnoent0, errnoent1, errnoent2, errnoent): Likewise.
(nerrnos0, nerrnos1, nerrnos2): Likewise.
* signal.c (signalent0, signalent1, signalent2): Likewise.
(nsignals0, nsignals1, nsignals2): Likewise.
(signame): LIkewise.
* ioctl.c (ioctlent0, ioctlent1, ioctlent2): Likewise.
(nioctlents0, nioctlents1, nioctlents2): Likewise.
(ioctl_lookup, ioctl_next_match): Likewise.
* defs.h: Update decls.
* io.c (sys_ioctl): Update users.
2004-09-04 07:53:10 +04:00
# endif
1999-02-19 03:21:36 +03:00
# endif /* !LINUX */
return sock_ioctl ( tcp , code , arg ) ;
2000-09-02 01:03:06 +04:00
# ifdef USE_PROCFS
1999-11-29 18:34:02 +03:00
# ifndef HAVE_MP_PROCFS
2000-09-02 01:03:06 +04:00
# ifndef FREEBSD
1999-02-19 03:21:36 +03:00
case ' q ' :
2000-09-02 01:03:06 +04:00
# else
case ' p ' :
2004-09-03 Roland McGrath <roland@redhat.com>
* syscall.c (sysent0, sysent1, sysent2, sysent): Add const to defn.
(nsyscalls0, nsyscalls1, nsyscalls2): Likewise.
(errnoent0, errnoent1, errnoent2, errnoent): Likewise.
(nerrnos0, nerrnos1, nerrnos2): Likewise.
* signal.c (signalent0, signalent1, signalent2): Likewise.
(nsignals0, nsignals1, nsignals2): Likewise.
(signame): LIkewise.
* ioctl.c (ioctlent0, ioctlent1, ioctlent2): Likewise.
(nioctlents0, nioctlents1, nioctlents2): Likewise.
(ioctl_lookup, ioctl_next_match): Likewise.
* defs.h: Update decls.
* io.c (sys_ioctl): Update users.
2004-09-04 07:53:10 +04:00
# endif
1999-02-19 03:21:36 +03:00
return proc_ioctl ( tcp , code , arg ) ;
1999-08-30 03:15:07 +04:00
# endif
2000-09-02 01:03:06 +04:00
# endif /* USE_PROCFS */
1999-02-19 03:21:36 +03:00
# ifdef HAVE_SYS_STREAM_H
case ' S ' :
return stream_ioctl ( tcp , code , arg ) ;
# endif /* HAVE_SYS_STREAM_H */
2004-10-07 02:27:43 +04:00
# ifdef LINUX
case ' p ' :
return rtc_ioctl ( tcp , code , arg ) ;
# endif
1999-02-19 03:21:36 +03:00
default :
break ;
}
return 0 ;
}
/*
* Registry of ioctl characters , culled from
* @ ( # ) ioccom . h 1.7 89 / 06 / 16 SMI ; from UCB ioctl . h 7.1 6 / 4 / 86
*
* char file where defined notes
* - - - - - - - - - - - - - - - - - - - - - - - - - - -
* F sun / fbio . h
* G sun / gpio . h
* H vaxif / if_hy . h
* M sundev / mcpcmd . h * overlap *
* M sys / modem . h * overlap *
* S sys / stropts . h
* T sys / termio . h - no overlap -
* T sys / termios . h - no overlap -
* V sundev / mdreg . h
* a vaxuba / adreg . h
* d sun / dkio . h - no overlap with sys / des . h -
* d sys / des . h ( possible overlap )
* d vax / dkio . h ( possible overlap )
* d vaxuba / rxreg . h ( possible overlap )
* f sys / filio . h
* g sunwindow / win_ioctl . h - no overlap -
* g sunwindowdev / winioctl . c ! no manifest constant ! - no overlap -
* h sundev / hrc_common . h
* i sys / sockio . h * overlap *
* i vaxuba / ikreg . h * overlap *
* k sundev / kbio . h
* m sundev / msio . h ( possible overlap )
* m sundev / msreg . h ( possible overlap )
* m sys / mtio . h ( possible overlap )
* n sun / ndio . h
* p net / nit_buf . h ( possible overlap )
* p net / nit_if . h ( possible overlap )
* p net / nit_pf . h ( possible overlap )
* p sundev / fpareg . h ( possible overlap )
* p sys / sockio . h ( possible overlap )
* p vaxuba / psreg . h ( possible overlap )
* q sun / sqz . h
* r sys / sockio . h
* s sys / sockio . h
* t sys / ttold . h ( possible overlap )
* t sys / ttycom . h ( possible overlap )
* v sundev / vuid_event . h * overlap *
* v sys / vcmd . h * overlap *
*
* End of Registry
*/