• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs@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  *	$Id$
28  */
29 
30 #include "defs.h"
31 
32 #ifdef LINUX
33 /*
34  * The C library's definition of struct termios might differ from
35  * the kernel one, and we need to use the kernel layout.
36  */
37 #include <linux/termios.h>
38 #else
39 
40 #ifdef HAVE_TERMIO_H
41 #include <termio.h>
42 #endif /* HAVE_TERMIO_H */
43 
44 #include <termios.h>
45 #endif
46 
47 #ifdef HAVE_SYS_FILIO_H
48 #include <sys/filio.h>
49 #endif
50 
51 static const struct xlat tcxonc_options[] = {
52 	{ TCOOFF,	"TCOOFF"	},
53 	{ TCOON,	"TCOON"		},
54 	{ TCIOFF,	"TCIOFF"	},
55 	{ TCION,	"TCION"		},
56 	{ 0,		NULL		},
57 };
58 
59 #ifdef TCLFLSH
60 static const struct xlat tcflsh_options[] = {
61 	{ TCIFLUSH,	"TCIFLUSH"	},
62 	{ TCOFLUSH,	"TCOFLUSH"	},
63 	{ TCIOFLUSH,	"TCIOFLUSH"	},
64 	{ 0,		NULL		},
65 };
66 #endif
67 
68 static const struct xlat baud_options[] = {
69 	{ B0,		"B0"		},
70 	{ B50,		"B50"		},
71 	{ B75,		"B75"		},
72 	{ B110,		"B110"		},
73 	{ B134,		"B134"		},
74 	{ B150,		"B150"		},
75 	{ B200,		"B200"		},
76 	{ B300,		"B300"		},
77 	{ B600,		"B600"		},
78 	{ B1200,	"B1200"		},
79 	{ B1800,	"B1800"		},
80 	{ B2400,	"B2400"		},
81 	{ B4800,	"B4800"		},
82 	{ B9600,	"B9600"		},
83 #ifdef B19200
84 	{ B19200,	"B19200"	},
85 #endif
86 #ifdef B38400
87 	{ B38400,	"B38400"	},
88 #endif
89 #ifdef B57600
90 	{ B57600,	"B57600"	},
91 #endif
92 #ifdef B115200
93 	{ B115200,	"B115200"	},
94 #endif
95 #ifdef B230400
96 	{ B230400,	"B230400"	},
97 #endif
98 #ifdef B460800
99 	{ B460800,	"B460800"	},
100 #endif
101 #ifdef B500000
102 	{ B500000,	"B500000"	},
103 #endif
104 #ifdef B576000
105 	{ B576000,	"B576000"	},
106 #endif
107 #ifdef B921600
108 	{ B921600,	"B921600"	},
109 #endif
110 #ifdef B1000000
111 	{ B1000000,	"B1000000"	},
112 #endif
113 #ifdef B1152000
114 	{ B1152000,	"B1152000"	},
115 #endif
116 #ifdef B1500000
117 	{ B1500000,	"B1500000"	},
118 #endif
119 #ifdef B2000000
120 	{ B2000000,	"B2000000"	},
121 #endif
122 #ifdef B2500000
123 	{ B2500000,	"B2500000"	},
124 #endif
125 #ifdef B3000000
126 	{ B3000000,	"B3000000"	},
127 #endif
128 #ifdef B3500000
129 	{ B3500000,	"B3500000"	},
130 #endif
131 #ifdef B4000000
132 	{ B4000000,	"B4000000"	},
133 #endif
134 #ifdef EXTA
135 	{ EXTA,		"EXTA"		},
136 #endif
137 #ifdef EXTB
138 	{ EXTB,		"EXTB"		},
139 #endif
140 	{ 0,		NULL		},
141 };
142 
143 static const struct xlat modem_flags[] = {
144 #ifdef TIOCM_LE
145 	{ TIOCM_LE,	"TIOCM_LE",	},
146 #endif
147 #ifdef TIOCM_DTR
148 	{ TIOCM_DTR,	"TIOCM_DTR",	},
149 #endif
150 #ifdef TIOCM_RTS
151 	{ TIOCM_RTS,	"TIOCM_RTS",	},
152 #endif
153 #ifdef TIOCM_ST
154 	{ TIOCM_ST,	"TIOCM_ST",	},
155 #endif
156 #ifdef TIOCM_SR
157 	{ TIOCM_SR,	"TIOCM_SR",	},
158 #endif
159 #ifdef TIOCM_CTS
160 	{ TIOCM_CTS,	"TIOCM_CTS",	},
161 #endif
162 #ifdef TIOCM_CAR
163 	{ TIOCM_CAR,	"TIOCM_CAR",	},
164 #endif
165 #ifdef TIOCM_CD
166 	{ TIOCM_CD,	"TIOCM_CD",	},
167 #endif
168 #ifdef TIOCM_RNG
169 	{ TIOCM_RNG,	"TIOCM_RNG",	},
170 #endif
171 #ifdef TIOCM_RI
172 	{ TIOCM_RI,	"TIOCM_RI",	},
173 #endif
174 #ifdef TIOCM_DSR
175 	{ TIOCM_DSR,	"TIOCM_DSR",	},
176 #endif
177 	{ 0,		NULL,		},
178 };
179 
180 
term_ioctl(struct tcb * tcp,long code,long arg)181 int term_ioctl(struct tcb *tcp, long code, long arg)
182 {
183 	struct termios tios;
184 #ifndef FREEBSD
185 	struct termio tio;
186 #else
187 	#define TCGETS	TIOCGETA
188 	#define TCSETS	TIOCSETA
189 	#define TCSETSW	TIOCSETAW
190 	#define TCSETSF	TIOCSETAF
191 #endif
192 	struct winsize ws;
193 #ifdef TIOCGSIZE
194 	struct  ttysize ts;
195 #endif
196 	int i;
197 
198 	if (entering(tcp))
199 		return 0;
200 
201 	switch (code) {
202 
203 	/* ioctls with termios or termio args */
204 
205 #ifdef TCGETS
206 	case TCGETS:
207 		if (syserror(tcp))
208 			return 0;
209 	case TCSETS:
210 	case TCSETSW:
211 	case TCSETSF:
212 		if (!verbose(tcp) || umove(tcp, arg, &tios) < 0)
213 			return 0;
214 		if (abbrev(tcp)) {
215 			tprintf(", {");
216 #ifndef FREEBSD
217 			printxval(baud_options, tios.c_cflag & CBAUD, "B???");
218 #else
219 			printxval(baud_options, tios.c_ispeed, "B???");
220 			if (tios.c_ispeed != tios.c_ospeed) {
221 				tprintf(" (in)");
222 				printxval(baud_options, tios.c_ospeed, "B???");
223 				tprintf(" (out)");
224 			}
225 #endif
226 			tprintf(" %sopost %sisig %sicanon %secho ...}",
227 				(tios.c_oflag & OPOST) ? "" : "-",
228 				(tios.c_lflag & ISIG) ? "" : "-",
229 				(tios.c_lflag & ICANON) ? "" : "-",
230 				(tios.c_lflag & ECHO) ? "" : "-");
231 			return 1;
232 		}
233 		tprintf(", {c_iflags=%#lx, c_oflags=%#lx, ",
234 			(long) tios.c_iflag, (long) tios.c_oflag);
235 		tprintf("c_cflags=%#lx, c_lflags=%#lx, ",
236 			(long) tios.c_cflag, (long) tios.c_lflag);
237 #if !defined(SVR4) && !defined(FREEBSD)
238 		tprintf("c_line=%u, ", tios.c_line);
239 #endif
240 		if (!(tios.c_lflag & ICANON))
241 			tprintf("c_cc[VMIN]=%d, c_cc[VTIME]=%d, ",
242 				tios.c_cc[VMIN], tios.c_cc[VTIME]);
243 		tprintf("c_cc=\"");
244 		for (i = 0; i < NCCS; i++)
245 			tprintf("\\x%02x", tios.c_cc[i]);
246 		tprintf("\"}");
247 		return 1;
248 #endif /* TCGETS */
249 
250 #ifdef TCGETA
251 	case TCGETA:
252 		if (syserror(tcp))
253 			return 0;
254 	case TCSETA:
255 	case TCSETAW:
256 	case TCSETAF:
257 		if (!verbose(tcp) || umove(tcp, arg, &tio) < 0)
258 			return 0;
259 		if (abbrev(tcp)) {
260 			tprintf(", {");
261 			printxval(baud_options, tio.c_cflag & CBAUD, "B???");
262 			tprintf(" %sopost %sisig %sicanon %secho ...}",
263 				(tio.c_oflag & OPOST) ? "" : "-",
264 				(tio.c_lflag & ISIG) ? "" : "-",
265 				(tio.c_lflag & ICANON) ? "" : "-",
266 				(tio.c_lflag & ECHO) ? "" : "-");
267 			return 1;
268 		}
269 		tprintf(", {c_iflags=%#lx, c_oflags=%#lx, ",
270 			(long) tio.c_iflag, (long) tio.c_oflag);
271 		tprintf("c_cflags=%#lx, c_lflags=%#lx, ",
272 			(long) tio.c_cflag, (long) tio.c_lflag);
273 		tprintf("c_line=%u, ", tio.c_line);
274 #ifdef _VMIN
275 		if (!(tio.c_lflag & ICANON))
276 			tprintf("c_cc[_VMIN]=%d, c_cc[_VTIME]=%d, ",
277 				tio.c_cc[_VMIN], tio.c_cc[_VTIME]);
278 #else /* !_VMIN */
279 		if (!(tio.c_lflag & ICANON))
280 			tprintf("c_cc[VMIN]=%d, c_cc[VTIME]=%d, ",
281 				tio.c_cc[VMIN], tio.c_cc[VTIME]);
282 #endif /* !_VMIN */
283 		tprintf("c_cc=\"");
284 		for (i = 0; i < NCC; i++)
285 			tprintf("\\x%02x", tio.c_cc[i]);
286 		tprintf("\"}");
287 		return 1;
288 #endif /* TCGETA */
289 
290 	/* ioctls with winsize or ttysize args */
291 
292 #ifdef TIOCGWINSZ
293 	case TIOCGWINSZ:
294 		if (syserror(tcp))
295 			return 0;
296 	case TIOCSWINSZ:
297 		if (!verbose(tcp) || umove(tcp, arg, &ws) < 0)
298 			return 0;
299 		tprintf(", {ws_row=%d, ws_col=%d, ws_xpixel=%d, ws_ypixel=%d}",
300 			ws.ws_row, ws.ws_col, ws.ws_xpixel, ws.ws_ypixel);
301 		return 1;
302 #endif /* TIOCGWINSZ */
303 
304 #ifdef TIOCGSIZE
305 	case TIOCGSIZE:
306 		if (syserror(tcp))
307 			return 0;
308 	case TIOCSSIZE:
309 		if (!verbose(tcp) || umove(tcp, arg, &ts) < 0)
310 			return 0;
311 		tprintf(", {ts_lines=%d, ts_cols=%d}",
312 			ts.ts_lines, ts.ts_cols);
313 		return 1;
314 #endif
315 
316 	/* ioctls with a direct decodable arg */
317 #ifdef TCXONC
318 	case TCXONC:
319 		tprintf(", ");
320 		printxval(tcxonc_options, arg, "TC???");
321 		return 1;
322 #endif
323 #ifdef TCLFLSH
324 	case TCFLSH:
325 		tprintf(", ");
326 		printxval(tcflsh_options, arg, "TC???");
327 		return 1;
328 #endif
329 
330 	/* ioctls with an indirect parameter displayed as modem flags */
331 
332 #ifdef TIOCMGET
333 	case TIOCMGET:
334 	case TIOCMBIS:
335 	case TIOCMBIC:
336 	case TIOCMSET:
337 		if (umove(tcp, arg, &i) < 0)
338 			return 0;
339 		tprintf(", [");
340 		printflags(modem_flags, i, "TIOCM_???");
341 		tprintf("]");
342 		return 1;
343 #endif /* TIOCMGET */
344 
345 	/* ioctls with an indirect parameter displayed in decimal */
346 
347 	case TIOCSPGRP:
348 	case TIOCGPGRP:
349 #ifdef TIOCGETPGRP
350 	case TIOCGETPGRP:
351 #endif
352 #ifdef TIOCSETPGRP
353 	case TIOCSETPGRP:
354 #endif
355 #ifdef FIONREAD
356 	case FIONREAD:
357 #endif
358 	case TIOCOUTQ:
359 #ifdef FIONBIO
360 	case FIONBIO:
361 #endif
362 #ifdef FIOASYNC
363 	case FIOASYNC:
364 #endif
365 #ifdef FIOGETOWN
366 	case FIOGETOWN:
367 #endif
368 #ifdef FIOSETOWN
369 	case FIOSETOWN:
370 #endif
371 #ifdef TIOCGETD
372 	case TIOCGETD:
373 #endif
374 #ifdef TIOCSETD
375 	case TIOCSETD:
376 #endif
377 #ifdef TIOCPKT
378 	case TIOCPKT:
379 #endif
380 #ifdef TIOCREMOTE
381 	case TIOCREMOTE:
382 #endif
383 #ifdef TIOCUCNTL
384 	case TIOCUCNTL:
385 #endif
386 #ifdef TIOCTCNTL
387 	case TIOCTCNTL:
388 #endif
389 #ifdef TIOCSIGNAL
390 	case TIOCSIGNAL:
391 #endif
392 #ifdef TIOCSSOFTCAR
393 	case TIOCSSOFTCAR:
394 #endif
395 #ifdef TIOCGSOFTCAR
396 	case TIOCGSOFTCAR:
397 #endif
398 #ifdef TIOCISPACE
399 	case TIOCISPACE:
400 #endif
401 #ifdef TIOCISIZE
402 	case TIOCISIZE:
403 #endif
404 #ifdef TIOCSINTR
405 	case TIOCSINTR:
406 #endif
407 #ifdef TIOCSPTLCK
408 	case TIOCSPTLCK:
409 #endif
410 #ifdef TIOCGPTN
411 	case TIOCGPTN:
412 #endif
413 		tprintf(", ");
414 		printnum_int(tcp, arg, "%d");
415 		return 1;
416 
417 	/* ioctls with an indirect parameter displayed as a char */
418 
419 #ifdef TIOCSTI
420 	case TIOCSTI:
421 #endif
422 		tprintf(", ");
423 		printstr(tcp, arg, 1);
424 		return 1;
425 
426 	/* ioctls with no parameters */
427 
428 #ifdef TIOCSCTTY
429 	case TIOCSCTTY:
430 #endif
431 #ifdef TIOCNOTTY
432 	case TIOCNOTTY:
433 #endif
434 #ifdef FIOCLEX
435 	case FIOCLEX:
436 #endif
437 #ifdef FIONCLEX
438 	case FIONCLEX:
439 #endif
440 #ifdef TIOCCONS
441 	case TIOCCONS:
442 #endif
443 		return 1;
444 
445 	/* ioctls which are unknown */
446 
447 	default:
448 		return 0;
449 	}
450 }
451