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
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,const unsigned int code,long arg)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