blob: cfb878b0fa561e8974b4369441ac2cfdbb5867b6 [file] [log] [blame]
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001/*
2 * Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs@world.std.com>
Elliott Hughes28e98bc2018-06-14 16:59:04 -07003 * Copyright (c) 1996-2018 The strace developers.
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00004 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * 3. The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Wichert Akkerman76baf7c1999-02-19 00:21:36 +000027 */
28
29#include "defs.h"
Roland McGrath6e87ee02003-01-14 07:53:40 +000030/*
31 * The C library's definition of struct termios might differ from
32 * the kernel one, and we need to use the kernel layout.
33 */
34#include <linux/termios.h>
Wichert Akkerman76baf7c1999-02-19 00:21:36 +000035
Dmitry V. Levinfd3cdc02015-07-13 20:10:20 +000036#include "xlat/tcxonc_options.h"
37#include "xlat/tcflsh_options.h"
Dmitry V. Levin0ed617b2014-04-25 23:30:54 +000038#include "xlat/baud_options.h"
Dmitry V. Levin0ed617b2014-04-25 23:30:54 +000039#include "xlat/modem_flags.h"
Wichert Akkerman76baf7c1999-02-19 00:21:36 +000040
Dmitry V. Levinfd3cdc02015-07-13 20:10:20 +000041static void
Elliott Hughesd35df492017-02-15 15:19:05 -080042decode_termios(struct tcb *const tcp, const kernel_ulong_t addr)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +000043{
44 struct termios tios;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +000045
Dmitry V. Levinfd3cdc02015-07-13 20:10:20 +000046 tprints(", ");
47 if (umove_or_printaddr(tcp, addr, &tios))
48 return;
49 if (abbrev(tcp)) {
50 tprints("{");
51 printxval(baud_options, tios.c_cflag & CBAUD, "B???");
52 tprintf(" %sopost %sisig %sicanon %secho ...}",
53 (tios.c_oflag & OPOST) ? "" : "-",
54 (tios.c_lflag & ISIG) ? "" : "-",
55 (tios.c_lflag & ICANON) ? "" : "-",
56 (tios.c_lflag & ECHO) ? "" : "-");
57 return;
58 }
59 tprintf("{c_iflags=%#lx, c_oflags=%#lx, ",
60 (long) tios.c_iflag, (long) tios.c_oflag);
61 tprintf("c_cflags=%#lx, c_lflags=%#lx, ",
62 (long) tios.c_cflag, (long) tios.c_lflag);
63 tprintf("c_line=%u, ", tios.c_line);
64 if (!(tios.c_lflag & ICANON))
65 tprintf("c_cc[VMIN]=%d, c_cc[VTIME]=%d, ",
66 tios.c_cc[VMIN], tios.c_cc[VTIME]);
Elliott Hughes77c3ff82017-09-08 17:11:00 -070067 tprints("c_cc=");
68 print_quoted_string((char *) tios.c_cc, NCCS, QUOTE_FORCE_HEX);
69 tprints("}");
Dmitry V. Levinfd3cdc02015-07-13 20:10:20 +000070}
71
72static void
Elliott Hughesd35df492017-02-15 15:19:05 -080073decode_termio(struct tcb *const tcp, const kernel_ulong_t addr)
Dmitry V. Levinfd3cdc02015-07-13 20:10:20 +000074{
75 struct termio tio;
76 int i;
77
Dmitry V. Levinfd3cdc02015-07-13 20:10:20 +000078 tprints(", ");
79 if (umove_or_printaddr(tcp, addr, &tio))
80 return;
81 if (abbrev(tcp)) {
82 tprints("{");
83 printxval(baud_options, tio.c_cflag & CBAUD, "B???");
84 tprintf(" %sopost %sisig %sicanon %secho ...}",
85 (tio.c_oflag & OPOST) ? "" : "-",
86 (tio.c_lflag & ISIG) ? "" : "-",
87 (tio.c_lflag & ICANON) ? "" : "-",
88 (tio.c_lflag & ECHO) ? "" : "-");
89 return;
90 }
91 tprintf("{c_iflags=%#lx, c_oflags=%#lx, ",
92 (long) tio.c_iflag, (long) tio.c_oflag);
93 tprintf("c_cflags=%#lx, c_lflags=%#lx, ",
94 (long) tio.c_cflag, (long) tio.c_lflag);
95 tprintf("c_line=%u, ", tio.c_line);
96#ifdef _VMIN
97 if (!(tio.c_lflag & ICANON))
98 tprintf("c_cc[_VMIN]=%d, c_cc[_VTIME]=%d, ",
99 tio.c_cc[_VMIN], tio.c_cc[_VTIME]);
100#else /* !_VMIN */
101 if (!(tio.c_lflag & ICANON))
102 tprintf("c_cc[VMIN]=%d, c_cc[VTIME]=%d, ",
103 tio.c_cc[VMIN], tio.c_cc[VTIME]);
104#endif /* !_VMIN */
Dmitry V. Levincce5aae2016-10-02 16:20:05 +0000105 tprints("c_cc=\"");
Dmitry V. Levinfd3cdc02015-07-13 20:10:20 +0000106 for (i = 0; i < NCC; i++)
107 tprintf("\\x%02x", tio.c_cc[i]);
Dmitry V. Levincce5aae2016-10-02 16:20:05 +0000108 tprints("\"}");
Dmitry V. Levinfd3cdc02015-07-13 20:10:20 +0000109}
110
111static void
Elliott Hughesd35df492017-02-15 15:19:05 -0800112decode_winsize(struct tcb *const tcp, const kernel_ulong_t addr)
Dmitry V. Levinfd3cdc02015-07-13 20:10:20 +0000113{
114 struct winsize ws;
115
Dmitry V. Levinfd3cdc02015-07-13 20:10:20 +0000116 tprints(", ");
117 if (umove_or_printaddr(tcp, addr, &ws))
118 return;
119 tprintf("{ws_row=%d, ws_col=%d, ws_xpixel=%d, ws_ypixel=%d}",
120 ws.ws_row, ws.ws_col, ws.ws_xpixel, ws.ws_ypixel);
121}
122
123#ifdef TIOCGSIZE
124static void
Elliott Hughesd35df492017-02-15 15:19:05 -0800125decode_ttysize(struct tcb *const tcp, const kernel_ulong_t addr)
Dmitry V. Levinfd3cdc02015-07-13 20:10:20 +0000126{
127 struct ttysize ts;
128
Dmitry V. Levinfd3cdc02015-07-13 20:10:20 +0000129 tprints(", ");
130 if (umove_or_printaddr(tcp, addr, &ts))
131 return;
132 tprintf("{ts_lines=%d, ts_cols=%d}",
133 ts.ts_lines, ts.ts_cols);
134}
135#endif
136
137static void
Elliott Hughesd35df492017-02-15 15:19:05 -0800138decode_modem_flags(struct tcb *const tcp, const kernel_ulong_t addr)
Dmitry V. Levinfd3cdc02015-07-13 20:10:20 +0000139{
140 int i;
141
Dmitry V. Levinfd3cdc02015-07-13 20:10:20 +0000142 tprints(", ");
143 if (umove_or_printaddr(tcp, addr, &i))
144 return;
145 tprints("[");
146 printflags(modem_flags, i, "TIOCM_???");
147 tprints("]");
148}
149
150int
Elliott Hughesd35df492017-02-15 15:19:05 -0800151term_ioctl(struct tcb *const tcp, const unsigned int code,
152 const kernel_ulong_t arg)
Dmitry V. Levinfd3cdc02015-07-13 20:10:20 +0000153{
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000154 switch (code) {
Dmitry V. Levinfd3cdc02015-07-13 20:10:20 +0000155 /* struct termios */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000156 case TCGETS:
Dmitry V. Levinfd3cdc02015-07-13 20:10:20 +0000157#ifdef TCGETS2
158 case TCGETS2:
159#endif
160 case TIOCGLCKTRMIOS:
161 if (entering(tcp))
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000162 return 0;
Elliott Hughes28e98bc2018-06-14 16:59:04 -0700163 ATTRIBUTE_FALLTHROUGH;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000164 case TCSETS:
Dmitry V. Levinfd3cdc02015-07-13 20:10:20 +0000165#ifdef TCSETS2
166 case TCSETS2:
167#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000168 case TCSETSW:
Dmitry V. Levinfd3cdc02015-07-13 20:10:20 +0000169#ifdef TCSETSW2
170 case TCSETSW2:
171#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000172 case TCSETSF:
Dmitry V. Levinfd3cdc02015-07-13 20:10:20 +0000173#ifdef TCSETSF2
174 case TCSETSF2:
175#endif
176 case TIOCSLCKTRMIOS:
177 decode_termios(tcp, arg);
178 break;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000179
Dmitry V. Levinfd3cdc02015-07-13 20:10:20 +0000180 /* struct termio */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000181 case TCGETA:
Dmitry V. Levinfd3cdc02015-07-13 20:10:20 +0000182 if (entering(tcp))
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000183 return 0;
Elliott Hughes28e98bc2018-06-14 16:59:04 -0700184 ATTRIBUTE_FALLTHROUGH;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000185 case TCSETA:
186 case TCSETAW:
187 case TCSETAF:
Dmitry V. Levinfd3cdc02015-07-13 20:10:20 +0000188 decode_termio(tcp, arg);
189 break;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000190
Dmitry V. Levinfd3cdc02015-07-13 20:10:20 +0000191 /* struct winsize */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000192 case TIOCGWINSZ:
Dmitry V. Levinfd3cdc02015-07-13 20:10:20 +0000193 if (entering(tcp))
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000194 return 0;
Elliott Hughes28e98bc2018-06-14 16:59:04 -0700195 ATTRIBUTE_FALLTHROUGH;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000196 case TIOCSWINSZ:
Dmitry V. Levinfd3cdc02015-07-13 20:10:20 +0000197 decode_winsize(tcp, arg);
198 break;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000199
Dmitry V. Levinfd3cdc02015-07-13 20:10:20 +0000200 /* struct ttysize */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000201#ifdef TIOCGSIZE
202 case TIOCGSIZE:
Dmitry V. Levinfd3cdc02015-07-13 20:10:20 +0000203 if (entering(tcp))
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000204 return 0;
Elliott Hughes28e98bc2018-06-14 16:59:04 -0700205 ATTRIBUTE_FALLTHROUGH;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000206 case TIOCSSIZE:
Dmitry V. Levinfd3cdc02015-07-13 20:10:20 +0000207 decode_ttysize(tcp, arg);
208 break;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000209#endif
210
211 /* ioctls with a direct decodable arg */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000212 case TCXONC:
Denys Vlasenko60fe8c12011-09-01 10:00:28 +0200213 tprints(", ");
Elliott Hughesd35df492017-02-15 15:19:05 -0800214 printxval64(tcxonc_options, arg, "TC???");
Dmitry V. Levinfd3cdc02015-07-13 20:10:20 +0000215 break;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000216 case TCFLSH:
Denys Vlasenko60fe8c12011-09-01 10:00:28 +0200217 tprints(", ");
Elliott Hughesd35df492017-02-15 15:19:05 -0800218 printxval64(tcflsh_options, arg, "TC???");
Dmitry V. Levinfd3cdc02015-07-13 20:10:20 +0000219 break;
220 case TCSBRK:
221 case TCSBRKP:
Denys Vlasenko6a4ac6c2011-10-22 04:52:18 +0200222 case TIOCSCTTY:
Dmitry V. Levinfd3cdc02015-07-13 20:10:20 +0000223 tprintf(", %d", (int) arg);
224 break;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000225
226 /* ioctls with an indirect parameter displayed as modem flags */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000227 case TIOCMGET:
Dmitry V. Levinfd3cdc02015-07-13 20:10:20 +0000228 if (entering(tcp))
229 return 0;
Elliott Hughes28e98bc2018-06-14 16:59:04 -0700230 ATTRIBUTE_FALLTHROUGH;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000231 case TIOCMBIS:
232 case TIOCMBIC:
233 case TIOCMSET:
Dmitry V. Levinfd3cdc02015-07-13 20:10:20 +0000234 decode_modem_flags(tcp, arg);
235 break;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000236
237 /* ioctls with an indirect parameter displayed in decimal */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000238 case TIOCGPGRP:
Dmitry V. Levinfd3cdc02015-07-13 20:10:20 +0000239 case TIOCGSID:
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000240 case TIOCGETD:
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000241 case TIOCGSOFTCAR:
Wichert Akkerman2e2553a1999-05-09 00:29:58 +0000242 case TIOCGPTN:
Dmitry V. Levinfd3cdc02015-07-13 20:10:20 +0000243 case FIONREAD:
244 case TIOCOUTQ:
245#ifdef TIOCGEXCL
246 case TIOCGEXCL:
Wichert Akkerman2e2553a1999-05-09 00:29:58 +0000247#endif
Dmitry V. Levinfd3cdc02015-07-13 20:10:20 +0000248#ifdef TIOCGDEV
249 case TIOCGDEV:
250#endif
251 if (entering(tcp))
252 return 0;
Elliott Hughes28e98bc2018-06-14 16:59:04 -0700253 ATTRIBUTE_FALLTHROUGH;
Dmitry V. Levinfd3cdc02015-07-13 20:10:20 +0000254 case TIOCSPGRP:
255 case TIOCSETD:
256 case FIONBIO:
257 case FIOASYNC:
258 case TIOCPKT:
259 case TIOCSSOFTCAR:
260 case TIOCSPTLCK:
Denys Vlasenko60fe8c12011-09-01 10:00:28 +0200261 tprints(", ");
Roland McGrathbcd2c952008-07-22 00:21:43 +0000262 printnum_int(tcp, arg, "%d");
Dmitry V. Levinfd3cdc02015-07-13 20:10:20 +0000263 break;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000264
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000265 /* ioctls with an indirect parameter displayed as a char */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000266 case TIOCSTI:
Denys Vlasenko60fe8c12011-09-01 10:00:28 +0200267 tprints(", ");
Elliott Hughesd35df492017-02-15 15:19:05 -0800268 printstrn(tcp, arg, 1);
Dmitry V. Levinfd3cdc02015-07-13 20:10:20 +0000269 break;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000270
271 /* ioctls with no parameters */
272
Dmitry V. Levinfd3cdc02015-07-13 20:10:20 +0000273 case TIOCSBRK:
274 case TIOCCBRK:
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000275 case TIOCCONS:
Dmitry V. Levinfd3cdc02015-07-13 20:10:20 +0000276 case TIOCNOTTY:
277 case TIOCEXCL:
278 case TIOCNXCL:
279 case FIOCLEX:
280 case FIONCLEX:
281#ifdef TIOCVHANGUP
282 case TIOCVHANGUP:
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000283#endif
Dmitry V. Levinfd3cdc02015-07-13 20:10:20 +0000284#ifdef TIOCSSERIAL
285 case TIOCSSERIAL:
286#endif
287 break;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000288
289 /* ioctls which are unknown */
290
291 default:
Dmitry V. Levinfd3cdc02015-07-13 20:10:20 +0000292 return RVAL_DECODED;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000293 }
Dmitry V. Levinfd3cdc02015-07-13 20:10:20 +0000294
Elliott Hughes77c3ff82017-09-08 17:11:00 -0700295 return RVAL_IOCTL_DECODED;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000296}