Home | History | Annotate | Download | only in strace
      1 /*
      2  * Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs (at) world.std.com>
      3  * All rights reserved.
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions
      7  * are met:
      8  * 1. Redistributions of source code must retain the above copyright
      9  *    notice, this list of conditions and the following disclaimer.
     10  * 2. Redistributions in binary form must reproduce the above copyright
     11  *    notice, this list of conditions and the following disclaimer in the
     12  *    documentation and/or other materials provided with the distribution.
     13  * 3. The name of the author may not be used to endorse or promote products
     14  *    derived from this software without specific prior written permission.
     15  *
     16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     17  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     18  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     19  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     20  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     21  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     22  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     23  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     25  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     26  */
     27 
     28 #include "defs.h"
     29 /*
     30  * The C library's definition of struct termios might differ from
     31  * the kernel one, and we need to use the kernel layout.
     32  */
     33 #include <linux/termios.h>
     34 #ifdef HAVE_SYS_FILIO_H
     35 # include <sys/filio.h>
     36 #endif
     37 
     38 #include "xlat/tcxonc_options.h"
     39 
     40 #ifdef TCLFLSH
     41 #include "xlat/tcflsh_options.h"
     42 #endif
     43 
     44 #include "xlat/baud_options.h"
     45 #include "xlat/modem_flags.h"
     46 
     47 int
     48 term_ioctl(struct tcb *tcp, const unsigned int code, long arg)
     49 {
     50 	struct termios tios;
     51 	struct termio tio;
     52 	struct winsize ws;
     53 #ifdef TIOCGSIZE
     54 	struct  ttysize ts;
     55 #endif
     56 	int i;
     57 
     58 	if (entering(tcp))
     59 		return 0;
     60 
     61 	switch (code) {
     62 
     63 	/* ioctls with termios or termio args */
     64 
     65 #ifdef TCGETS
     66 	case TCGETS:
     67 		if (syserror(tcp))
     68 			return 0;
     69 	case TCSETS:
     70 	case TCSETSW:
     71 	case TCSETSF:
     72 		if (!verbose(tcp) || umove(tcp, arg, &tios) < 0)
     73 			return 0;
     74 		if (abbrev(tcp)) {
     75 			tprints(", {");
     76 			printxval(baud_options, tios.c_cflag & CBAUD, "B???");
     77 			tprintf(" %sopost %sisig %sicanon %secho ...}",
     78 				(tios.c_oflag & OPOST) ? "" : "-",
     79 				(tios.c_lflag & ISIG) ? "" : "-",
     80 				(tios.c_lflag & ICANON) ? "" : "-",
     81 				(tios.c_lflag & ECHO) ? "" : "-");
     82 			return 1;
     83 		}
     84 		tprintf(", {c_iflags=%#lx, c_oflags=%#lx, ",
     85 			(long) tios.c_iflag, (long) tios.c_oflag);
     86 		tprintf("c_cflags=%#lx, c_lflags=%#lx, ",
     87 			(long) tios.c_cflag, (long) tios.c_lflag);
     88 		tprintf("c_line=%u, ", tios.c_line);
     89 		if (!(tios.c_lflag & ICANON))
     90 			tprintf("c_cc[VMIN]=%d, c_cc[VTIME]=%d, ",
     91 				tios.c_cc[VMIN], tios.c_cc[VTIME]);
     92 		tprintf("c_cc=\"");
     93 		for (i = 0; i < NCCS; i++)
     94 			tprintf("\\x%02x", tios.c_cc[i]);
     95 		tprintf("\"}");
     96 		return 1;
     97 #endif /* TCGETS */
     98 
     99 #ifdef TCGETA
    100 	case TCGETA:
    101 		if (syserror(tcp))
    102 			return 0;
    103 	case TCSETA:
    104 	case TCSETAW:
    105 	case TCSETAF:
    106 		if (!verbose(tcp) || umove(tcp, arg, &tio) < 0)
    107 			return 0;
    108 		if (abbrev(tcp)) {
    109 			tprints(", {");
    110 			printxval(baud_options, tio.c_cflag & CBAUD, "B???");
    111 			tprintf(" %sopost %sisig %sicanon %secho ...}",
    112 				(tio.c_oflag & OPOST) ? "" : "-",
    113 				(tio.c_lflag & ISIG) ? "" : "-",
    114 				(tio.c_lflag & ICANON) ? "" : "-",
    115 				(tio.c_lflag & ECHO) ? "" : "-");
    116 			return 1;
    117 		}
    118 		tprintf(", {c_iflags=%#lx, c_oflags=%#lx, ",
    119 			(long) tio.c_iflag, (long) tio.c_oflag);
    120 		tprintf("c_cflags=%#lx, c_lflags=%#lx, ",
    121 			(long) tio.c_cflag, (long) tio.c_lflag);
    122 		tprintf("c_line=%u, ", tio.c_line);
    123 #ifdef _VMIN
    124 		if (!(tio.c_lflag & ICANON))
    125 			tprintf("c_cc[_VMIN]=%d, c_cc[_VTIME]=%d, ",
    126 				tio.c_cc[_VMIN], tio.c_cc[_VTIME]);
    127 #else /* !_VMIN */
    128 		if (!(tio.c_lflag & ICANON))
    129 			tprintf("c_cc[VMIN]=%d, c_cc[VTIME]=%d, ",
    130 				tio.c_cc[VMIN], tio.c_cc[VTIME]);
    131 #endif /* !_VMIN */
    132 		tprintf("c_cc=\"");
    133 		for (i = 0; i < NCC; i++)
    134 			tprintf("\\x%02x", tio.c_cc[i]);
    135 		tprintf("\"}");
    136 		return 1;
    137 #endif /* TCGETA */
    138 
    139 	/* ioctls with winsize or ttysize args */
    140 
    141 #ifdef TIOCGWINSZ
    142 	case TIOCGWINSZ:
    143 		if (syserror(tcp))
    144 			return 0;
    145 	case TIOCSWINSZ:
    146 		if (!verbose(tcp) || umove(tcp, arg, &ws) < 0)
    147 			return 0;
    148 		tprintf(", {ws_row=%d, ws_col=%d, ws_xpixel=%d, ws_ypixel=%d}",
    149 			ws.ws_row, ws.ws_col, ws.ws_xpixel, ws.ws_ypixel);
    150 		return 1;
    151 #endif /* TIOCGWINSZ */
    152 
    153 #ifdef TIOCGSIZE
    154 	case TIOCGSIZE:
    155 		if (syserror(tcp))
    156 			return 0;
    157 	case TIOCSSIZE:
    158 		if (!verbose(tcp) || umove(tcp, arg, &ts) < 0)
    159 			return 0;
    160 		tprintf(", {ts_lines=%d, ts_cols=%d}",
    161 			ts.ts_lines, ts.ts_cols);
    162 		return 1;
    163 #endif
    164 
    165 	/* ioctls with a direct decodable arg */
    166 #ifdef TCXONC
    167 	case TCXONC:
    168 		tprints(", ");
    169 		printxval(tcxonc_options, arg, "TC???");
    170 		return 1;
    171 #endif
    172 #ifdef TCLFLSH
    173 	case TCFLSH:
    174 		tprints(", ");
    175 		printxval(tcflsh_options, arg, "TC???");
    176 		return 1;
    177 #endif
    178 #ifdef TIOCSCTTY
    179 	case TIOCSCTTY:
    180 		tprintf(", %ld", arg);
    181 		return 1;
    182 #endif
    183 
    184 	/* ioctls with an indirect parameter displayed as modem flags */
    185 
    186 #ifdef TIOCMGET
    187 	case TIOCMGET:
    188 	case TIOCMBIS:
    189 	case TIOCMBIC:
    190 	case TIOCMSET:
    191 		if (umove(tcp, arg, &i) < 0)
    192 			return 0;
    193 		tprints(", [");
    194 		printflags(modem_flags, i, "TIOCM_???");
    195 		tprints("]");
    196 		return 1;
    197 #endif /* TIOCMGET */
    198 
    199 	/* ioctls with an indirect parameter displayed in decimal */
    200 
    201 	case TIOCSPGRP:
    202 	case TIOCGPGRP:
    203 #ifdef TIOCGETPGRP
    204 	case TIOCGETPGRP:
    205 #endif
    206 #ifdef TIOCSETPGRP
    207 	case TIOCSETPGRP:
    208 #endif
    209 #ifdef FIONREAD
    210 	case FIONREAD:
    211 #endif
    212 	case TIOCOUTQ:
    213 #ifdef FIONBIO
    214 	case FIONBIO:
    215 #endif
    216 #ifdef FIOASYNC
    217 	case FIOASYNC:
    218 #endif
    219 #ifdef FIOGETOWN
    220 	case FIOGETOWN:
    221 #endif
    222 #ifdef FIOSETOWN
    223 	case FIOSETOWN:
    224 #endif
    225 #ifdef TIOCGETD
    226 	case TIOCGETD:
    227 #endif
    228 #ifdef TIOCSETD
    229 	case TIOCSETD:
    230 #endif
    231 #ifdef TIOCPKT
    232 	case TIOCPKT:
    233 #endif
    234 #ifdef TIOCREMOTE
    235 	case TIOCREMOTE:
    236 #endif
    237 #ifdef TIOCUCNTL
    238 	case TIOCUCNTL:
    239 #endif
    240 #ifdef TIOCTCNTL
    241 	case TIOCTCNTL:
    242 #endif
    243 #ifdef TIOCSIGNAL
    244 	case TIOCSIGNAL:
    245 #endif
    246 #ifdef TIOCSSOFTCAR
    247 	case TIOCSSOFTCAR:
    248 #endif
    249 #ifdef TIOCGSOFTCAR
    250 	case TIOCGSOFTCAR:
    251 #endif
    252 #ifdef TIOCISPACE
    253 	case TIOCISPACE:
    254 #endif
    255 #ifdef TIOCISIZE
    256 	case TIOCISIZE:
    257 #endif
    258 #ifdef TIOCSINTR
    259 	case TIOCSINTR:
    260 #endif
    261 #ifdef TIOCSPTLCK
    262 	case TIOCSPTLCK:
    263 #endif
    264 #ifdef TIOCGPTN
    265 	case TIOCGPTN:
    266 #endif
    267 		tprints(", ");
    268 		printnum_int(tcp, arg, "%d");
    269 		return 1;
    270 
    271 	/* ioctls with an indirect parameter displayed as a char */
    272 
    273 #ifdef TIOCSTI
    274 	case TIOCSTI:
    275 #endif
    276 		tprints(", ");
    277 		printstr(tcp, arg, 1);
    278 		return 1;
    279 
    280 	/* ioctls with no parameters */
    281 
    282 #ifdef TIOCNOTTY
    283 	case TIOCNOTTY:
    284 #endif
    285 #ifdef FIOCLEX
    286 	case FIOCLEX:
    287 #endif
    288 #ifdef FIONCLEX
    289 	case FIONCLEX:
    290 #endif
    291 #ifdef TIOCCONS
    292 	case TIOCCONS:
    293 #endif
    294 		return 1;
    295 
    296 	/* ioctls which are unknown */
    297 
    298 	default:
    299 		return 0;
    300 	}
    301 }
    302