1999-02-19 00:21:36 +00:00
/*
* Copyright ( c ) 1993 , 1994 , 1995 , 1996 Rick Sladkey < jrs @ world . std . com >
* 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 .
*/
# include "defs.h"
2003-01-14 07:53:40 +00:00
/*
* The C library ' s definition of struct termios might differ from
* the kernel one , and we need to use the kernel layout .
*/
# include <linux/termios.h>
1999-02-19 00:21:36 +00:00
# ifdef HAVE_SYS_FILIO_H
2012-03-16 12:02:22 +01:00
# include <sys / filio.h>
1999-02-19 00:21:36 +00:00
# endif
2014-04-25 23:30:54 +00:00
# include "xlat/tcxonc_options.h"
1999-02-19 00:21:36 +00:00
2000-09-01 21:03:06 +00:00
# ifdef TCLFLSH
2014-04-25 23:30:54 +00:00
# include "xlat/tcflsh_options.h"
2000-09-01 21:03:06 +00:00
# endif
1999-02-19 00:21:36 +00:00
2014-04-25 23:30:54 +00:00
# include "xlat/baud_options.h"
# include "xlat/modem_flags.h"
1999-02-19 00:21:36 +00:00
Remove dead code
* defs.h (tv_tv): Remove.
* net.c (sys_xsetsockaddr): Remove commented out dead code.
* process.c (setarg, sys_execv, sys_execve, struct_user_offsets):
Likewise.
* signal.c (sys_sigsuspend): Likewise.
* strace.c (reaper, trace): Likewise.
* stream.c (internal_stream_ioctl): Likewise.
* syscall.c (trace_syscall): Likewise.
* term.c (term_ioctl): Likewise.
* util.c (tv_tv, umoven, uload, getpc, fixvfork, setbpt, clearbpt):
Likewise.
2009-12-31 22:50:49 +00:00
int term_ioctl ( struct tcb * tcp , long code , long arg )
1999-02-19 00:21:36 +00:00
{
struct termios tios ;
struct termio tio ;
struct winsize ws ;
# ifdef TIOCGSIZE
struct ttysize ts ;
# endif
int i ;
if ( entering ( tcp ) )
return 0 ;
switch ( code ) {
/* ioctls with termios or termio args */
# ifdef TCGETS
case TCGETS :
if ( syserror ( tcp ) )
return 0 ;
case TCSETS :
case TCSETSW :
case TCSETSF :
if ( ! verbose ( tcp ) | | umove ( tcp , arg , & tios ) < 0 )
return 0 ;
if ( abbrev ( tcp ) ) {
2011-09-01 10:00:28 +02:00
tprints ( " , { " ) ;
1999-02-19 00:21:36 +00:00
printxval ( baud_options , tios . c_cflag & CBAUD , " B??? " ) ;
tprintf ( " %sopost %sisig %sicanon %secho ...} " ,
( tios . c_oflag & OPOST ) ? " " : " - " ,
( tios . c_lflag & ISIG ) ? " " : " - " ,
( tios . c_lflag & ICANON ) ? " " : " - " ,
( tios . c_lflag & ECHO ) ? " " : " - " ) ;
return 1 ;
}
tprintf ( " , {c_iflags=%#lx, c_oflags=%#lx, " ,
( long ) tios . c_iflag , ( long ) tios . c_oflag ) ;
tprintf ( " c_cflags=%#lx, c_lflags=%#lx, " ,
( long ) tios . c_cflag , ( long ) tios . c_lflag ) ;
tprintf ( " c_line=%u, " , tios . c_line ) ;
if ( ! ( tios . c_lflag & ICANON ) )
tprintf ( " c_cc[VMIN]=%d, c_cc[VTIME]=%d, " ,
tios . c_cc [ VMIN ] , tios . c_cc [ VTIME ] ) ;
tprintf ( " c_cc= \" " ) ;
for ( i = 0 ; i < NCCS ; i + + )
tprintf ( " \\ x%02x " , tios . c_cc [ i ] ) ;
tprintf ( " \" } " ) ;
return 1 ;
# endif /* TCGETS */
# ifdef TCGETA
case TCGETA :
if ( syserror ( tcp ) )
return 0 ;
case TCSETA :
case TCSETAW :
case TCSETAF :
if ( ! verbose ( tcp ) | | umove ( tcp , arg , & tio ) < 0 )
return 0 ;
if ( abbrev ( tcp ) ) {
2011-09-01 10:00:28 +02:00
tprints ( " , { " ) ;
1999-02-19 00:21:36 +00:00
printxval ( baud_options , tio . c_cflag & CBAUD , " B??? " ) ;
tprintf ( " %sopost %sisig %sicanon %secho ...} " ,
( tio . c_oflag & OPOST ) ? " " : " - " ,
( tio . c_lflag & ISIG ) ? " " : " - " ,
( tio . c_lflag & ICANON ) ? " " : " - " ,
( tio . c_lflag & ECHO ) ? " " : " - " ) ;
return 1 ;
}
tprintf ( " , {c_iflags=%#lx, c_oflags=%#lx, " ,
( long ) tio . c_iflag , ( long ) tio . c_oflag ) ;
tprintf ( " c_cflags=%#lx, c_lflags=%#lx, " ,
( long ) tio . c_cflag , ( long ) tio . c_lflag ) ;
tprintf ( " c_line=%u, " , tio . c_line ) ;
# ifdef _VMIN
if ( ! ( tio . c_lflag & ICANON ) )
tprintf ( " c_cc[_VMIN]=%d, c_cc[_VTIME]=%d, " ,
tio . c_cc [ _VMIN ] , tio . c_cc [ _VTIME ] ) ;
# else /* !_VMIN */
if ( ! ( tio . c_lflag & ICANON ) )
tprintf ( " c_cc[VMIN]=%d, c_cc[VTIME]=%d, " ,
tio . c_cc [ VMIN ] , tio . c_cc [ VTIME ] ) ;
# endif /* !_VMIN */
tprintf ( " c_cc= \" " ) ;
for ( i = 0 ; i < NCC ; i + + )
tprintf ( " \\ x%02x " , tio . c_cc [ i ] ) ;
tprintf ( " \" } " ) ;
return 1 ;
# endif /* TCGETA */
/* ioctls with winsize or ttysize args */
# ifdef TIOCGWINSZ
case TIOCGWINSZ :
if ( syserror ( tcp ) )
return 0 ;
case TIOCSWINSZ :
if ( ! verbose ( tcp ) | | umove ( tcp , arg , & ws ) < 0 )
return 0 ;
tprintf ( " , {ws_row=%d, ws_col=%d, ws_xpixel=%d, ws_ypixel=%d} " ,
ws . ws_row , ws . ws_col , ws . ws_xpixel , ws . ws_ypixel ) ;
return 1 ;
# endif /* TIOCGWINSZ */
# ifdef TIOCGSIZE
case TIOCGSIZE :
if ( syserror ( tcp ) )
return 0 ;
case TIOCSSIZE :
if ( ! verbose ( tcp ) | | umove ( tcp , arg , & ts ) < 0 )
return 0 ;
tprintf ( " , {ts_lines=%d, ts_cols=%d} " ,
ts . ts_lines , ts . ts_cols ) ;
return 1 ;
# endif
/* ioctls with a direct decodable arg */
2000-09-01 21:03:06 +00:00
# ifdef TCXONC
1999-02-19 00:21:36 +00:00
case TCXONC :
2011-09-01 10:00:28 +02:00
tprints ( " , " ) ;
1999-02-19 00:21:36 +00:00
printxval ( tcxonc_options , arg , " TC??? " ) ;
return 1 ;
2000-09-01 21:03:06 +00:00
# endif
# ifdef TCLFLSH
1999-02-19 00:21:36 +00:00
case TCFLSH :
2011-09-01 10:00:28 +02:00
tprints ( " , " ) ;
1999-02-19 00:21:36 +00:00
printxval ( tcflsh_options , arg , " TC??? " ) ;
return 1 ;
2000-09-01 21:03:06 +00:00
# endif
2011-10-22 04:52:18 +02:00
# ifdef TIOCSCTTY
case TIOCSCTTY :
tprintf ( " , %ld " , arg ) ;
return 1 ;
# endif
1999-02-19 00:21:36 +00:00
/* ioctls with an indirect parameter displayed as modem flags */
# ifdef TIOCMGET
case TIOCMGET :
case TIOCMBIS :
case TIOCMBIC :
case TIOCMSET :
2008-07-22 00:21:43 +00:00
if ( umove ( tcp , arg , & i ) < 0 )
1999-02-19 00:21:36 +00:00
return 0 ;
2011-09-01 10:00:28 +02:00
tprints ( " , [ " ) ;
2008-07-22 00:21:43 +00:00
printflags ( modem_flags , i , " TIOCM_??? " ) ;
2011-09-01 10:00:28 +02:00
tprints ( " ] " ) ;
1999-02-19 00:21:36 +00:00
return 1 ;
# endif /* TIOCMGET */
/* ioctls with an indirect parameter displayed in decimal */
case TIOCSPGRP :
case TIOCGPGRP :
# ifdef TIOCGETPGRP
case TIOCGETPGRP :
# endif
# ifdef TIOCSETPGRP
case TIOCSETPGRP :
# endif
# ifdef FIONREAD
case FIONREAD :
# endif
case TIOCOUTQ :
# ifdef FIONBIO
case FIONBIO :
# endif
# ifdef FIOASYNC
case FIOASYNC :
# endif
# ifdef FIOGETOWN
case FIOGETOWN :
# endif
# ifdef FIOSETOWN
case FIOSETOWN :
# endif
# ifdef TIOCGETD
case TIOCGETD :
# endif
# ifdef TIOCSETD
case TIOCSETD :
# endif
# ifdef TIOCPKT
case TIOCPKT :
# endif
# ifdef TIOCREMOTE
case TIOCREMOTE :
# endif
# ifdef TIOCUCNTL
case TIOCUCNTL :
# endif
# ifdef TIOCTCNTL
case TIOCTCNTL :
# endif
# ifdef TIOCSIGNAL
case TIOCSIGNAL :
# endif
# ifdef TIOCSSOFTCAR
case TIOCSSOFTCAR :
# endif
# ifdef TIOCGSOFTCAR
case TIOCGSOFTCAR :
# endif
# ifdef TIOCISPACE
case TIOCISPACE :
# endif
# ifdef TIOCISIZE
case TIOCISIZE :
# endif
# ifdef TIOCSINTR
case TIOCSINTR :
1999-05-09 00:29:58 +00:00
# endif
# ifdef TIOCSPTLCK
case TIOCSPTLCK :
# endif
# ifdef TIOCGPTN
case TIOCGPTN :
1999-02-19 00:21:36 +00:00
# endif
2011-09-01 10:00:28 +02:00
tprints ( " , " ) ;
2008-07-22 00:21:43 +00:00
printnum_int ( tcp , arg , " %d " ) ;
1999-02-19 00:21:36 +00:00
return 1 ;
/* ioctls with an indirect parameter displayed as a char */
# ifdef TIOCSTI
case TIOCSTI :
# endif
2011-09-01 10:00:28 +02:00
tprints ( " , " ) ;
1999-02-19 00:21:36 +00:00
printstr ( tcp , arg , 1 ) ;
return 1 ;
/* ioctls with no parameters */
# ifdef TIOCNOTTY
case TIOCNOTTY :
# endif
# ifdef FIOCLEX
case FIOCLEX :
# endif
# ifdef FIONCLEX
case FIONCLEX :
# endif
# ifdef TIOCCONS
case TIOCCONS :
# endif
return 1 ;
/* ioctls which are unknown */
default :
return 0 ;
}
}