]> granicus.if.org Git - strace/blob - term.c
ioctl: print unrecognized ioctl codes in _IOC(dir,type,nr,size) format
[strace] / term.c
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
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 }