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 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