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 term_ioctl(struct tcb *tcp, long code, long arg)
     48 {
     49 	struct termios tios;
     50 	struct termio tio;
     51 	struct winsize ws;
     52 #ifdef TIOCGSIZE
     53 	struct  ttysize ts;
     54 #endif
     55 	int i;
     56 
     57 	if (entering(tcp))
     58 		return 0;
     59 
     60 	switch (code) {
     61 
     62 	/* ioctls with termios or termio args */
     63 
     64 #ifdef TCGETS
     65 	case TCGETS:
     66 		if (syserror(tcp))
     67 			return 0;
     68 	case TCSETS:
     69 	case TCSETSW:
     70 	case TCSETSF:
     71 		if (!verbose(tcp) || umove(tcp, arg, &tios) < 0)
     72 			return 0;
     73 		if (abbrev(tcp)) {
     74 			tprints(", {");
     75 			printxval(baud_options, tios.c_cflag & CBAUD, "B???");
     76 			tprintf(" %sopost %sisig %sicanon %secho ...}",
     77 				(tios.c_oflag & OPOST) ? "" : "-",
     78 				(tios.c_lflag & ISIG) ? "" : "-",
     79 				(tios.c_lflag & ICANON) ? "" : "-",
     80 				(tios.c_lflag & ECHO) ? "" : "-");
     81 			return 1;
     82 		}
     83 		tprintf(", {c_iflags=%#lx, c_oflags=%#lx, ",
     84 			(long) tios.c_iflag, (long) tios.c_oflag);
     85 		tprintf("c_cflags=%#lx, c_lflags=%#lx, ",
     86 			(long) tios.c_cflag, (long) tios.c_lflag);
     87 		tprintf("c_line=%u, ", tios.c_line);
     88 		if (!(tios.c_lflag & ICANON))
     89 			tprintf("c_cc[VMIN]=%d, c_cc[VTIME]=%d, ",
     90 				tios.c_cc[VMIN], tios.c_cc[VTIME]);
     91 		tprintf("c_cc=\"");
     92 		for (i = 0; i < NCCS; i++)
     93 			tprintf("\\x%02x", tios.c_cc[i]);
     94 		tprintf("\"}");
     95 		return 1;
     96 #endif /* TCGETS */
     97 
     98 #ifdef TCGETA
     99 	case TCGETA:
    100 		if (syserror(tcp))
    101 			return 0;
    102 	case TCSETA:
    103 	case TCSETAW:
    104 	case TCSETAF:
    105 		if (!verbose(tcp) || umove(tcp, arg, &tio) < 0)
    106 			return 0;
    107 		if (abbrev(tcp)) {
    108 			tprints(", {");
    109 			printxval(baud_options, tio.c_cflag & CBAUD, "B???");
    110 			tprintf(" %sopost %sisig %sicanon %secho ...}",
    111 				(tio.c_oflag & OPOST) ? "" : "-",
    112 				(tio.c_lflag & ISIG) ? "" : "-",
    113 				(tio.c_lflag & ICANON) ? "" : "-",
    114 				(tio.c_lflag & ECHO) ? "" : "-");
    115 			return 1;
    116 		}
    117 		tprintf(", {c_iflags=%#lx, c_oflags=%#lx, ",
    118 			(long) tio.c_iflag, (long) tio.c_oflag);
    119 		tprintf("c_cflags=%#lx, c_lflags=%#lx, ",
    120 			(long) tio.c_cflag, (long) tio.c_lflag);
    121 		tprintf("c_line=%u, ", tio.c_line);
    122 #ifdef _VMIN
    123 		if (!(tio.c_lflag & ICANON))
    124 			tprintf("c_cc[_VMIN]=%d, c_cc[_VTIME]=%d, ",
    125 				tio.c_cc[_VMIN], tio.c_cc[_VTIME]);
    126 #else /* !_VMIN */
    127 		if (!(tio.c_lflag & ICANON))
    128 			tprintf("c_cc[VMIN]=%d, c_cc[VTIME]=%d, ",
    129 				tio.c_cc[VMIN], tio.c_cc[VTIME]);
    130 #endif /* !_VMIN */
    131 		tprintf("c_cc=\"");
    132 		for (i = 0; i < NCC; i++)
    133 			tprintf("\\x%02x", tio.c_cc[i]);
    134 		tprintf("\"}");
    135 		return 1;
    136 #endif /* TCGETA */
    137 
    138 	/* ioctls with winsize or ttysize args */
    139 
    140 #ifdef TIOCGWINSZ
    141 	case TIOCGWINSZ:
    142 		if (syserror(tcp))
    143 			return 0;
    144 	case TIOCSWINSZ:
    145 		if (!verbose(tcp) || umove(tcp, arg, &ws) < 0)
    146 			return 0;
    147 		tprintf(", {ws_row=%d, ws_col=%d, ws_xpixel=%d, ws_ypixel=%d}",
    148 			ws.ws_row, ws.ws_col, ws.ws_xpixel, ws.ws_ypixel);
    149 		return 1;
    150 #endif /* TIOCGWINSZ */
    151 
    152 #ifdef TIOCGSIZE
    153 	case TIOCGSIZE:
    154 		if (syserror(tcp))
    155 			return 0;
    156 	case TIOCSSIZE:
    157 		if (!verbose(tcp) || umove(tcp, arg, &ts) < 0)
    158 			return 0;
    159 		tprintf(", {ts_lines=%d, ts_cols=%d}",
    160 			ts.ts_lines, ts.ts_cols);
    161 		return 1;
    162 #endif
    163 
    164 	/* ioctls with a direct decodable arg */
    165 #ifdef TCXONC
    166 	case TCXONC:
    167 		tprints(", ");
    168 		printxval(tcxonc_options, arg, "TC???");
    169 		return 1;
    170 #endif
    171 #ifdef TCLFLSH
    172 	case TCFLSH:
    173 		tprints(", ");
    174 		printxval(tcflsh_options, arg, "TC???");
    175 		return 1;
    176 #endif
    177 #ifdef TIOCSCTTY
    178 	case TIOCSCTTY:
    179 		tprintf(", %ld", arg);
    180 		return 1;
    181 #endif
    182 
    183 	/* ioctls with an indirect parameter displayed as modem flags */
    184 
    185 #ifdef TIOCMGET
    186 	case TIOCMGET:
    187 	case TIOCMBIS:
    188 	case TIOCMBIC:
    189 	case TIOCMSET:
    190 		if (umove(tcp, arg, &i) < 0)
    191 			return 0;
    192 		tprints(", [");
    193 		printflags(modem_flags, i, "TIOCM_???");
    194 		tprints("]");
    195 		return 1;
    196 #endif /* TIOCMGET */
    197 
    198 	/* ioctls with an indirect parameter displayed in decimal */
    199 
    200 	case TIOCSPGRP:
    201 	case TIOCGPGRP:
    202 #ifdef TIOCGETPGRP
    203 	case TIOCGETPGRP:
    204 #endif
    205 #ifdef TIOCSETPGRP
    206 	case TIOCSETPGRP:
    207 #endif
    208 #ifdef FIONREAD
    209 	case FIONREAD:
    210 #endif
    211 	case TIOCOUTQ:
    212 #ifdef FIONBIO
    213 	case FIONBIO:
    214 #endif
    215 #ifdef FIOASYNC
    216 	case FIOASYNC:
    217 #endif
    218 #ifdef FIOGETOWN
    219 	case FIOGETOWN:
    220 #endif
    221 #ifdef FIOSETOWN
    222 	case FIOSETOWN:
    223 #endif
    224 #ifdef TIOCGETD
    225 	case TIOCGETD:
    226 #endif
    227 #ifdef TIOCSETD
    228 	case TIOCSETD:
    229 #endif
    230 #ifdef TIOCPKT
    231 	case TIOCPKT:
    232 #endif
    233 #ifdef TIOCREMOTE
    234 	case TIOCREMOTE:
    235 #endif
    236 #ifdef TIOCUCNTL
    237 	case TIOCUCNTL:
    238 #endif
    239 #ifdef TIOCTCNTL
    240 	case TIOCTCNTL:
    241 #endif
    242 #ifdef TIOCSIGNAL
    243 	case TIOCSIGNAL:
    244 #endif
    245 #ifdef TIOCSSOFTCAR
    246 	case TIOCSSOFTCAR:
    247 #endif
    248 #ifdef TIOCGSOFTCAR
    249 	case TIOCGSOFTCAR:
    250 #endif
    251 #ifdef TIOCISPACE
    252 	case TIOCISPACE:
    253 #endif
    254 #ifdef TIOCISIZE
    255 	case TIOCISIZE:
    256 #endif
    257 #ifdef TIOCSINTR
    258 	case TIOCSINTR:
    259 #endif
    260 #ifdef TIOCSPTLCK
    261 	case TIOCSPTLCK:
    262 #endif
    263 #ifdef TIOCGPTN
    264 	case TIOCGPTN:
    265 #endif
    266 		tprints(", ");
    267 		printnum_int(tcp, arg, "%d");
    268 		return 1;
    269 
    270 	/* ioctls with an indirect parameter displayed as a char */
    271 
    272 #ifdef TIOCSTI
    273 	case TIOCSTI:
    274 #endif
    275 		tprints(", ");
    276 		printstr(tcp, arg, 1);
    277 		return 1;
    278 
    279 	/* ioctls with no parameters */
    280 
    281 #ifdef TIOCNOTTY
    282 	case TIOCNOTTY:
    283 #endif
    284 #ifdef FIOCLEX
    285 	case FIOCLEX:
    286 #endif
    287 #ifdef FIONCLEX
    288 	case FIONCLEX:
    289 #endif
    290 #ifdef TIOCCONS
    291 	case TIOCCONS:
    292 #endif
    293 		return 1;
    294 
    295 	/* ioctls which are unknown */
    296 
    297 	default:
    298 		return 0;
    299 	}
    300 }
    301