1999-02-19 03:21:36 +03: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 10:53:40 +03: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 03:21:36 +03:00
2015-07-13 23:10:20 +03:00
# include "xlat/tcxonc_options.h"
# include "xlat/tcflsh_options.h"
2014-04-26 03:30:54 +04:00
# include "xlat/baud_options.h"
# include "xlat/modem_flags.h"
1999-02-19 03:21:36 +03:00
2015-07-13 23:10:20 +03:00
static void
decode_termios ( struct tcb * tcp , const long addr )
1999-02-19 03:21:36 +03:00
{
struct termios tios ;
2015-07-13 23:10:20 +03:00
int i ;
if ( ! verbose ( tcp ) )
return ;
tprints ( " , " ) ;
if ( umove_or_printaddr ( tcp , addr , & tios ) )
return ;
if ( abbrev ( tcp ) ) {
tprints ( " { " ) ;
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 ;
}
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 ( " \" } " ) ;
}
static void
decode_termio ( struct tcb * tcp , const long addr )
{
1999-02-19 03:21:36 +03:00
struct termio tio ;
2015-07-13 23:10:20 +03:00
int i ;
if ( ! verbose ( tcp ) )
return ;
tprints ( " , " ) ;
if ( umove_or_printaddr ( tcp , addr , & tio ) )
return ;
if ( abbrev ( tcp ) ) {
tprints ( " { " ) ;
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 ;
}
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 ( " \" } " ) ;
}
static void
decode_winsize ( struct tcb * tcp , const long addr )
{
1999-02-19 03:21:36 +03:00
struct winsize ws ;
2015-07-13 23:10:20 +03:00
if ( ! verbose ( tcp ) )
return ;
tprints ( " , " ) ;
if ( umove_or_printaddr ( tcp , addr , & ws ) )
return ;
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 ) ;
}
1999-02-19 03:21:36 +03:00
# ifdef TIOCGSIZE
2015-07-13 23:10:20 +03:00
static void
decode_ttysize ( struct tcb * tcp , const long addr )
{
struct ttysize ts ;
if ( ! verbose ( tcp ) )
return ;
tprints ( " , " ) ;
if ( umove_or_printaddr ( tcp , addr , & ts ) )
return ;
tprintf ( " {ts_lines=%d, ts_cols=%d} " ,
ts . ts_lines , ts . ts_cols ) ;
}
1999-02-19 03:21:36 +03:00
# endif
2015-07-13 23:10:20 +03:00
static void
decode_modem_flags ( struct tcb * tcp , const long addr )
{
int i ;
1999-02-19 03:21:36 +03:00
2015-07-13 23:10:20 +03:00
if ( ! verbose ( tcp ) )
return ;
1999-02-19 03:21:36 +03:00
2015-07-13 23:10:20 +03:00
tprints ( " , " ) ;
if ( umove_or_printaddr ( tcp , addr , & i ) )
return ;
tprints ( " [ " ) ;
printflags ( modem_flags , i , " TIOCM_??? " ) ;
tprints ( " ] " ) ;
}
1999-02-19 03:21:36 +03:00
2015-07-13 23:10:20 +03:00
int
term_ioctl ( struct tcb * tcp , const unsigned int code , const long arg )
{
switch ( code ) {
/* struct termios */
1999-02-19 03:21:36 +03:00
case TCGETS :
2015-07-13 23:10:20 +03:00
# ifdef TCGETS2
case TCGETS2 :
# endif
case TIOCGLCKTRMIOS :
if ( entering ( tcp ) )
1999-02-19 03:21:36 +03:00
return 0 ;
case TCSETS :
2015-07-13 23:10:20 +03:00
# ifdef TCSETS2
case TCSETS2 :
# endif
1999-02-19 03:21:36 +03:00
case TCSETSW :
2015-07-13 23:10:20 +03:00
# ifdef TCSETSW2
case TCSETSW2 :
# endif
1999-02-19 03:21:36 +03:00
case TCSETSF :
2015-07-13 23:10:20 +03:00
# ifdef TCSETSF2
case TCSETSF2 :
# endif
case TIOCSLCKTRMIOS :
decode_termios ( tcp , arg ) ;
break ;
1999-02-19 03:21:36 +03:00
2015-07-13 23:10:20 +03:00
/* struct termio */
1999-02-19 03:21:36 +03:00
case TCGETA :
2015-07-13 23:10:20 +03:00
if ( entering ( tcp ) )
1999-02-19 03:21:36 +03:00
return 0 ;
case TCSETA :
case TCSETAW :
case TCSETAF :
2015-07-13 23:10:20 +03:00
decode_termio ( tcp , arg ) ;
break ;
1999-02-19 03:21:36 +03:00
2015-07-13 23:10:20 +03:00
/* struct winsize */
1999-02-19 03:21:36 +03:00
case TIOCGWINSZ :
2015-07-13 23:10:20 +03:00
if ( entering ( tcp ) )
1999-02-19 03:21:36 +03:00
return 0 ;
case TIOCSWINSZ :
2015-07-13 23:10:20 +03:00
decode_winsize ( tcp , arg ) ;
break ;
1999-02-19 03:21:36 +03:00
2015-07-13 23:10:20 +03:00
/* struct ttysize */
1999-02-19 03:21:36 +03:00
# ifdef TIOCGSIZE
case TIOCGSIZE :
2015-07-13 23:10:20 +03:00
if ( entering ( tcp ) )
1999-02-19 03:21:36 +03:00
return 0 ;
case TIOCSSIZE :
2015-07-13 23:10:20 +03:00
decode_ttysize ( tcp , arg ) ;
break ;
1999-02-19 03:21:36 +03:00
# endif
/* ioctls with a direct decodable arg */
case TCXONC :
2011-09-01 12:00:28 +04:00
tprints ( " , " ) ;
1999-02-19 03:21:36 +03:00
printxval ( tcxonc_options , arg , " TC??? " ) ;
2015-07-13 23:10:20 +03:00
break ;
1999-02-19 03:21:36 +03:00
case TCFLSH :
2011-09-01 12:00:28 +04:00
tprints ( " , " ) ;
1999-02-19 03:21:36 +03:00
printxval ( tcflsh_options , arg , " TC??? " ) ;
2015-07-13 23:10:20 +03:00
break ;
case TCSBRK :
case TCSBRKP :
2011-10-22 06:52:18 +04:00
case TIOCSCTTY :
2015-07-13 23:10:20 +03:00
tprintf ( " , %d " , ( int ) arg ) ;
break ;
1999-02-19 03:21:36 +03:00
/* ioctls with an indirect parameter displayed as modem flags */
case TIOCMGET :
2015-07-13 23:10:20 +03:00
if ( entering ( tcp ) )
return 0 ;
1999-02-19 03:21:36 +03:00
case TIOCMBIS :
case TIOCMBIC :
case TIOCMSET :
2015-07-13 23:10:20 +03:00
decode_modem_flags ( tcp , arg ) ;
break ;
1999-02-19 03:21:36 +03:00
/* ioctls with an indirect parameter displayed in decimal */
case TIOCGPGRP :
2015-07-13 23:10:20 +03:00
case TIOCGSID :
case TIOCGETD :
case TIOCGSOFTCAR :
case TIOCGPTN :
1999-02-19 03:21:36 +03:00
case FIONREAD :
case TIOCOUTQ :
2015-07-13 23:10:20 +03:00
# ifdef TIOCGEXCL
case TIOCGEXCL :
1999-02-19 03:21:36 +03:00
# endif
2015-07-13 23:10:20 +03:00
# ifdef TIOCGDEV
case TIOCGDEV :
1999-02-19 03:21:36 +03:00
# endif
2015-07-13 23:10:20 +03:00
if ( entering ( tcp ) )
return 0 ;
case TIOCSPGRP :
1999-02-19 03:21:36 +03:00
case TIOCSETD :
2015-07-13 23:10:20 +03:00
case FIONBIO :
case FIOASYNC :
1999-02-19 03:21:36 +03:00
case TIOCPKT :
case TIOCSSOFTCAR :
1999-05-09 04:29:58 +04:00
case TIOCSPTLCK :
2011-09-01 12:00:28 +04:00
tprints ( " , " ) ;
2008-07-22 04:21:43 +04:00
printnum_int ( tcp , arg , " %d " ) ;
2015-07-13 23:10:20 +03:00
break ;
1999-02-19 03:21:36 +03:00
/* ioctls with an indirect parameter displayed as a char */
case TIOCSTI :
2011-09-01 12:00:28 +04:00
tprints ( " , " ) ;
1999-02-19 03:21:36 +03:00
printstr ( tcp , arg , 1 ) ;
2015-07-13 23:10:20 +03:00
break ;
1999-02-19 03:21:36 +03:00
/* ioctls with no parameters */
2015-07-13 23:10:20 +03:00
case TIOCSBRK :
case TIOCCBRK :
case TIOCCONS :
1999-02-19 03:21:36 +03:00
case TIOCNOTTY :
2015-07-13 23:10:20 +03:00
case TIOCEXCL :
case TIOCNXCL :
1999-02-19 03:21:36 +03:00
case FIOCLEX :
case FIONCLEX :
2015-07-13 23:10:20 +03:00
# ifdef TIOCVHANGUP
case TIOCVHANGUP :
1999-02-19 03:21:36 +03:00
# endif
2015-07-13 23:10:20 +03:00
# ifdef TIOCSSERIAL
case TIOCSSERIAL :
1999-02-19 03:21:36 +03:00
# endif
2015-07-13 23:10:20 +03:00
break ;
1999-02-19 03:21:36 +03:00
/* ioctls which are unknown */
default :
2015-07-13 23:10:20 +03:00
return RVAL_DECODED ;
1999-02-19 03:21:36 +03:00
}
2015-07-13 23:10:20 +03:00
return RVAL_DECODED | 1 ;
1999-02-19 03:21:36 +03:00
}