1 1.70 christos /* $NetBSD: tty.c,v 1.70 2021/07/14 07:47:23 christos Exp $ */ 2 1.2 lukem 3 1.1 cgd /*- 4 1.1 cgd * Copyright (c) 1992, 1993 5 1.1 cgd * The Regents of the University of California. All rights reserved. 6 1.1 cgd * 7 1.1 cgd * This code is derived from software contributed to Berkeley by 8 1.1 cgd * Christos Zoulas of Cornell University. 9 1.1 cgd * 10 1.1 cgd * Redistribution and use in source and binary forms, with or without 11 1.1 cgd * modification, are permitted provided that the following conditions 12 1.1 cgd * are met: 13 1.1 cgd * 1. Redistributions of source code must retain the above copyright 14 1.1 cgd * notice, this list of conditions and the following disclaimer. 15 1.1 cgd * 2. Redistributions in binary form must reproduce the above copyright 16 1.1 cgd * notice, this list of conditions and the following disclaimer in the 17 1.1 cgd * documentation and/or other materials provided with the distribution. 18 1.18 agc * 3. Neither the name of the University nor the names of its contributors 19 1.1 cgd * may be used to endorse or promote products derived from this software 20 1.1 cgd * without specific prior written permission. 21 1.1 cgd * 22 1.1 cgd * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 23 1.1 cgd * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 24 1.1 cgd * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 25 1.1 cgd * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 26 1.1 cgd * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 27 1.1 cgd * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 28 1.1 cgd * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 29 1.1 cgd * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30 1.1 cgd * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31 1.1 cgd * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32 1.1 cgd * SUCH DAMAGE. 33 1.1 cgd */ 34 1.1 cgd 35 1.16 christos #include "config.h" 36 1.1 cgd #if !defined(lint) && !defined(SCCSID) 37 1.2 lukem #if 0 38 1.1 cgd static char sccsid[] = "@(#)tty.c 8.1 (Berkeley) 6/4/93"; 39 1.2 lukem #else 40 1.70 christos __RCSID("$NetBSD: tty.c,v 1.70 2021/07/14 07:47:23 christos Exp $"); 41 1.2 lukem #endif 42 1.1 cgd #endif /* not lint && not SCCSID */ 43 1.1 cgd 44 1.11 simonb /* 45 1.1 cgd * tty.c: tty interface stuff 46 1.1 cgd */ 47 1.19 christos #include <assert.h> 48 1.28 sketch #include <errno.h> 49 1.46 christos #include <stdlib.h> /* for abort */ 50 1.56 christos #include <string.h> 51 1.57 christos #include <strings.h> /* for ffs */ 52 1.57 christos #include <unistd.h> /* for isatty */ 53 1.52 christos 54 1.32 christos #include "el.h" 55 1.64 christos #include "fcns.h" 56 1.55 christos #include "parse.h" 57 1.1 cgd 58 1.1 cgd typedef struct ttymodes_t { 59 1.14 jdolecek const char *m_name; 60 1.23 lukem unsigned int m_value; 61 1.13 lukem int m_type; 62 1.13 lukem } ttymodes_t; 63 1.1 cgd 64 1.1 cgd typedef struct ttymap_t { 65 1.51 christos wint_t nch, och; /* Internal and termio rep of chars */ 66 1.13 lukem el_action_t bind[3]; /* emacs, vi, and vi-cmd */ 67 1.16 christos } ttymap_t; 68 1.1 cgd 69 1.1 cgd 70 1.63 christos static const ttyperm_t ttyperm = { 71 1.13 lukem { 72 1.13 lukem {"iflag:", ICRNL, (INLCR | IGNCR)}, 73 1.13 lukem {"oflag:", (OPOST | ONLCR), ONLRET}, 74 1.13 lukem {"cflag:", 0, 0}, 75 1.13 lukem {"lflag:", (ISIG | ICANON | ECHO | ECHOE | ECHOCTL | IEXTEN), 76 1.13 lukem (NOFLSH | ECHONL | EXTPROC | FLUSHO)}, 77 1.13 lukem {"chars:", 0, 0}, 78 1.13 lukem }, 79 1.13 lukem { 80 1.13 lukem {"iflag:", (INLCR | ICRNL), IGNCR}, 81 1.13 lukem {"oflag:", (OPOST | ONLCR), ONLRET}, 82 1.13 lukem {"cflag:", 0, 0}, 83 1.13 lukem {"lflag:", ISIG, 84 1.13 lukem (NOFLSH | ICANON | ECHO | ECHOK | ECHONL | EXTPROC | IEXTEN | FLUSHO)}, 85 1.13 lukem {"chars:", (C_SH(C_MIN) | C_SH(C_TIME) | C_SH(C_SWTCH) | C_SH(C_DSWTCH) | 86 1.13 lukem C_SH(C_SUSP) | C_SH(C_DSUSP) | C_SH(C_EOL) | C_SH(C_DISCARD) | 87 1.13 lukem C_SH(C_PGOFF) | C_SH(C_PAGE) | C_SH(C_STATUS)), 0} 88 1.13 lukem }, 89 1.13 lukem { 90 1.13 lukem {"iflag:", 0, IXON | IXOFF | INLCR | ICRNL}, 91 1.13 lukem {"oflag:", 0, 0}, 92 1.13 lukem {"cflag:", 0, 0}, 93 1.13 lukem {"lflag:", 0, ISIG | IEXTEN}, 94 1.13 lukem {"chars:", 0, 0}, 95 1.13 lukem } 96 1.1 cgd }; 97 1.1 cgd 98 1.63 christos static const ttychar_t ttychar = { 99 1.13 lukem { 100 1.13 lukem CINTR, CQUIT, CERASE, CKILL, 101 1.13 lukem CEOF, CEOL, CEOL2, CSWTCH, 102 1.13 lukem CDSWTCH, CERASE2, CSTART, CSTOP, 103 1.13 lukem CWERASE, CSUSP, CDSUSP, CREPRINT, 104 1.13 lukem CDISCARD, CLNEXT, CSTATUS, CPAGE, 105 1.13 lukem CPGOFF, CKILL2, CBRK, CMIN, 106 1.13 lukem CTIME 107 1.13 lukem }, 108 1.13 lukem { 109 1.13 lukem CINTR, CQUIT, CERASE, CKILL, 110 1.13 lukem _POSIX_VDISABLE, _POSIX_VDISABLE, _POSIX_VDISABLE, _POSIX_VDISABLE, 111 1.13 lukem _POSIX_VDISABLE, CERASE2, CSTART, CSTOP, 112 1.13 lukem _POSIX_VDISABLE, CSUSP, _POSIX_VDISABLE, _POSIX_VDISABLE, 113 1.13 lukem CDISCARD, _POSIX_VDISABLE, _POSIX_VDISABLE, _POSIX_VDISABLE, 114 1.13 lukem _POSIX_VDISABLE, _POSIX_VDISABLE, _POSIX_VDISABLE, 1, 115 1.13 lukem 0 116 1.13 lukem }, 117 1.13 lukem { 118 1.13 lukem 0, 0, 0, 0, 119 1.13 lukem 0, 0, 0, 0, 120 1.13 lukem 0, 0, 0, 0, 121 1.13 lukem 0, 0, 0, 0, 122 1.13 lukem 0, 0, 0, 0, 123 1.13 lukem 0, 0, 0, 0, 124 1.13 lukem 0 125 1.13 lukem } 126 1.1 cgd }; 127 1.1 cgd 128 1.63 christos static const ttymap_t tty_map[] = { 129 1.1 cgd #ifdef VERASE 130 1.13 lukem {C_ERASE, VERASE, 131 1.21 mycroft {EM_DELETE_PREV_CHAR, VI_DELETE_PREV_CHAR, ED_PREV_CHAR}}, 132 1.1 cgd #endif /* VERASE */ 133 1.1 cgd #ifdef VERASE2 134 1.13 lukem {C_ERASE2, VERASE2, 135 1.21 mycroft {EM_DELETE_PREV_CHAR, VI_DELETE_PREV_CHAR, ED_PREV_CHAR}}, 136 1.1 cgd #endif /* VERASE2 */ 137 1.1 cgd #ifdef VKILL 138 1.13 lukem {C_KILL, VKILL, 139 1.13 lukem {EM_KILL_LINE, VI_KILL_LINE_PREV, ED_UNASSIGNED}}, 140 1.1 cgd #endif /* VKILL */ 141 1.1 cgd #ifdef VKILL2 142 1.13 lukem {C_KILL2, VKILL2, 143 1.13 lukem {EM_KILL_LINE, VI_KILL_LINE_PREV, ED_UNASSIGNED}}, 144 1.1 cgd #endif /* VKILL2 */ 145 1.1 cgd #ifdef VEOF 146 1.13 lukem {C_EOF, VEOF, 147 1.13 lukem {EM_DELETE_OR_LIST, VI_LIST_OR_EOF, ED_UNASSIGNED}}, 148 1.1 cgd #endif /* VEOF */ 149 1.1 cgd #ifdef VWERASE 150 1.13 lukem {C_WERASE, VWERASE, 151 1.13 lukem {ED_DELETE_PREV_WORD, ED_DELETE_PREV_WORD, ED_PREV_WORD}}, 152 1.1 cgd #endif /* VWERASE */ 153 1.1 cgd #ifdef VREPRINT 154 1.13 lukem {C_REPRINT, VREPRINT, 155 1.13 lukem {ED_REDISPLAY, ED_INSERT, ED_REDISPLAY}}, 156 1.1 cgd #endif /* VREPRINT */ 157 1.1 cgd #ifdef VLNEXT 158 1.13 lukem {C_LNEXT, VLNEXT, 159 1.13 lukem {ED_QUOTED_INSERT, ED_QUOTED_INSERT, ED_UNASSIGNED}}, 160 1.1 cgd #endif /* VLNEXT */ 161 1.51 christos {(wint_t)-1, (wint_t)-1, 162 1.13 lukem {ED_UNASSIGNED, ED_UNASSIGNED, ED_UNASSIGNED}} 163 1.13 lukem }; 164 1.1 cgd 165 1.63 christos static const ttymodes_t ttymodes[] = { 166 1.13 lukem #ifdef IGNBRK 167 1.13 lukem {"ignbrk", IGNBRK, MD_INP}, 168 1.13 lukem #endif /* IGNBRK */ 169 1.13 lukem #ifdef BRKINT 170 1.13 lukem {"brkint", BRKINT, MD_INP}, 171 1.13 lukem #endif /* BRKINT */ 172 1.13 lukem #ifdef IGNPAR 173 1.13 lukem {"ignpar", IGNPAR, MD_INP}, 174 1.13 lukem #endif /* IGNPAR */ 175 1.13 lukem #ifdef PARMRK 176 1.13 lukem {"parmrk", PARMRK, MD_INP}, 177 1.13 lukem #endif /* PARMRK */ 178 1.13 lukem #ifdef INPCK 179 1.13 lukem {"inpck", INPCK, MD_INP}, 180 1.13 lukem #endif /* INPCK */ 181 1.13 lukem #ifdef ISTRIP 182 1.13 lukem {"istrip", ISTRIP, MD_INP}, 183 1.13 lukem #endif /* ISTRIP */ 184 1.13 lukem #ifdef INLCR 185 1.13 lukem {"inlcr", INLCR, MD_INP}, 186 1.13 lukem #endif /* INLCR */ 187 1.13 lukem #ifdef IGNCR 188 1.13 lukem {"igncr", IGNCR, MD_INP}, 189 1.13 lukem #endif /* IGNCR */ 190 1.13 lukem #ifdef ICRNL 191 1.13 lukem {"icrnl", ICRNL, MD_INP}, 192 1.13 lukem #endif /* ICRNL */ 193 1.13 lukem #ifdef IUCLC 194 1.13 lukem {"iuclc", IUCLC, MD_INP}, 195 1.13 lukem #endif /* IUCLC */ 196 1.13 lukem #ifdef IXON 197 1.13 lukem {"ixon", IXON, MD_INP}, 198 1.13 lukem #endif /* IXON */ 199 1.13 lukem #ifdef IXANY 200 1.13 lukem {"ixany", IXANY, MD_INP}, 201 1.13 lukem #endif /* IXANY */ 202 1.13 lukem #ifdef IXOFF 203 1.13 lukem {"ixoff", IXOFF, MD_INP}, 204 1.13 lukem #endif /* IXOFF */ 205 1.13 lukem #ifdef IMAXBEL 206 1.13 lukem {"imaxbel", IMAXBEL, MD_INP}, 207 1.13 lukem #endif /* IMAXBEL */ 208 1.13 lukem 209 1.13 lukem #ifdef OPOST 210 1.13 lukem {"opost", OPOST, MD_OUT}, 211 1.13 lukem #endif /* OPOST */ 212 1.13 lukem #ifdef OLCUC 213 1.13 lukem {"olcuc", OLCUC, MD_OUT}, 214 1.13 lukem #endif /* OLCUC */ 215 1.13 lukem #ifdef ONLCR 216 1.13 lukem {"onlcr", ONLCR, MD_OUT}, 217 1.13 lukem #endif /* ONLCR */ 218 1.13 lukem #ifdef OCRNL 219 1.13 lukem {"ocrnl", OCRNL, MD_OUT}, 220 1.13 lukem #endif /* OCRNL */ 221 1.13 lukem #ifdef ONOCR 222 1.13 lukem {"onocr", ONOCR, MD_OUT}, 223 1.13 lukem #endif /* ONOCR */ 224 1.13 lukem #ifdef ONOEOT 225 1.13 lukem {"onoeot", ONOEOT, MD_OUT}, 226 1.13 lukem #endif /* ONOEOT */ 227 1.13 lukem #ifdef ONLRET 228 1.13 lukem {"onlret", ONLRET, MD_OUT}, 229 1.13 lukem #endif /* ONLRET */ 230 1.13 lukem #ifdef OFILL 231 1.13 lukem {"ofill", OFILL, MD_OUT}, 232 1.13 lukem #endif /* OFILL */ 233 1.13 lukem #ifdef OFDEL 234 1.13 lukem {"ofdel", OFDEL, MD_OUT}, 235 1.13 lukem #endif /* OFDEL */ 236 1.13 lukem #ifdef NLDLY 237 1.13 lukem {"nldly", NLDLY, MD_OUT}, 238 1.13 lukem #endif /* NLDLY */ 239 1.13 lukem #ifdef CRDLY 240 1.13 lukem {"crdly", CRDLY, MD_OUT}, 241 1.13 lukem #endif /* CRDLY */ 242 1.13 lukem #ifdef TABDLY 243 1.13 lukem {"tabdly", TABDLY, MD_OUT}, 244 1.13 lukem #endif /* TABDLY */ 245 1.13 lukem #ifdef XTABS 246 1.13 lukem {"xtabs", XTABS, MD_OUT}, 247 1.13 lukem #endif /* XTABS */ 248 1.13 lukem #ifdef BSDLY 249 1.13 lukem {"bsdly", BSDLY, MD_OUT}, 250 1.13 lukem #endif /* BSDLY */ 251 1.13 lukem #ifdef VTDLY 252 1.13 lukem {"vtdly", VTDLY, MD_OUT}, 253 1.13 lukem #endif /* VTDLY */ 254 1.13 lukem #ifdef FFDLY 255 1.13 lukem {"ffdly", FFDLY, MD_OUT}, 256 1.13 lukem #endif /* FFDLY */ 257 1.13 lukem #ifdef PAGEOUT 258 1.13 lukem {"pageout", PAGEOUT, MD_OUT}, 259 1.13 lukem #endif /* PAGEOUT */ 260 1.13 lukem #ifdef WRAP 261 1.13 lukem {"wrap", WRAP, MD_OUT}, 262 1.13 lukem #endif /* WRAP */ 263 1.13 lukem 264 1.13 lukem #ifdef CIGNORE 265 1.13 lukem {"cignore", CIGNORE, MD_CTL}, 266 1.13 lukem #endif /* CBAUD */ 267 1.13 lukem #ifdef CBAUD 268 1.13 lukem {"cbaud", CBAUD, MD_CTL}, 269 1.13 lukem #endif /* CBAUD */ 270 1.13 lukem #ifdef CSTOPB 271 1.13 lukem {"cstopb", CSTOPB, MD_CTL}, 272 1.13 lukem #endif /* CSTOPB */ 273 1.13 lukem #ifdef CREAD 274 1.13 lukem {"cread", CREAD, MD_CTL}, 275 1.13 lukem #endif /* CREAD */ 276 1.13 lukem #ifdef PARENB 277 1.13 lukem {"parenb", PARENB, MD_CTL}, 278 1.13 lukem #endif /* PARENB */ 279 1.13 lukem #ifdef PARODD 280 1.13 lukem {"parodd", PARODD, MD_CTL}, 281 1.13 lukem #endif /* PARODD */ 282 1.13 lukem #ifdef HUPCL 283 1.13 lukem {"hupcl", HUPCL, MD_CTL}, 284 1.13 lukem #endif /* HUPCL */ 285 1.13 lukem #ifdef CLOCAL 286 1.13 lukem {"clocal", CLOCAL, MD_CTL}, 287 1.13 lukem #endif /* CLOCAL */ 288 1.13 lukem #ifdef LOBLK 289 1.13 lukem {"loblk", LOBLK, MD_CTL}, 290 1.13 lukem #endif /* LOBLK */ 291 1.13 lukem #ifdef CIBAUD 292 1.13 lukem {"cibaud", CIBAUD, MD_CTL}, 293 1.13 lukem #endif /* CIBAUD */ 294 1.13 lukem #ifdef CRTSCTS 295 1.13 lukem #ifdef CCTS_OFLOW 296 1.13 lukem {"ccts_oflow", CCTS_OFLOW, MD_CTL}, 297 1.13 lukem #else 298 1.13 lukem {"crtscts", CRTSCTS, MD_CTL}, 299 1.13 lukem #endif /* CCTS_OFLOW */ 300 1.13 lukem #endif /* CRTSCTS */ 301 1.13 lukem #ifdef CRTS_IFLOW 302 1.13 lukem {"crts_iflow", CRTS_IFLOW, MD_CTL}, 303 1.13 lukem #endif /* CRTS_IFLOW */ 304 1.13 lukem #ifdef CDTRCTS 305 1.13 lukem {"cdtrcts", CDTRCTS, MD_CTL}, 306 1.13 lukem #endif /* CDTRCTS */ 307 1.13 lukem #ifdef MDMBUF 308 1.13 lukem {"mdmbuf", MDMBUF, MD_CTL}, 309 1.13 lukem #endif /* MDMBUF */ 310 1.13 lukem #ifdef RCV1EN 311 1.13 lukem {"rcv1en", RCV1EN, MD_CTL}, 312 1.13 lukem #endif /* RCV1EN */ 313 1.13 lukem #ifdef XMT1EN 314 1.13 lukem {"xmt1en", XMT1EN, MD_CTL}, 315 1.13 lukem #endif /* XMT1EN */ 316 1.13 lukem 317 1.13 lukem #ifdef ISIG 318 1.13 lukem {"isig", ISIG, MD_LIN}, 319 1.13 lukem #endif /* ISIG */ 320 1.13 lukem #ifdef ICANON 321 1.13 lukem {"icanon", ICANON, MD_LIN}, 322 1.13 lukem #endif /* ICANON */ 323 1.13 lukem #ifdef XCASE 324 1.13 lukem {"xcase", XCASE, MD_LIN}, 325 1.13 lukem #endif /* XCASE */ 326 1.13 lukem #ifdef ECHO 327 1.13 lukem {"echo", ECHO, MD_LIN}, 328 1.13 lukem #endif /* ECHO */ 329 1.13 lukem #ifdef ECHOE 330 1.13 lukem {"echoe", ECHOE, MD_LIN}, 331 1.13 lukem #endif /* ECHOE */ 332 1.13 lukem #ifdef ECHOK 333 1.13 lukem {"echok", ECHOK, MD_LIN}, 334 1.13 lukem #endif /* ECHOK */ 335 1.13 lukem #ifdef ECHONL 336 1.13 lukem {"echonl", ECHONL, MD_LIN}, 337 1.13 lukem #endif /* ECHONL */ 338 1.13 lukem #ifdef NOFLSH 339 1.13 lukem {"noflsh", NOFLSH, MD_LIN}, 340 1.13 lukem #endif /* NOFLSH */ 341 1.13 lukem #ifdef TOSTOP 342 1.13 lukem {"tostop", TOSTOP, MD_LIN}, 343 1.13 lukem #endif /* TOSTOP */ 344 1.13 lukem #ifdef ECHOCTL 345 1.13 lukem {"echoctl", ECHOCTL, MD_LIN}, 346 1.13 lukem #endif /* ECHOCTL */ 347 1.13 lukem #ifdef ECHOPRT 348 1.13 lukem {"echoprt", ECHOPRT, MD_LIN}, 349 1.13 lukem #endif /* ECHOPRT */ 350 1.13 lukem #ifdef ECHOKE 351 1.13 lukem {"echoke", ECHOKE, MD_LIN}, 352 1.13 lukem #endif /* ECHOKE */ 353 1.13 lukem #ifdef DEFECHO 354 1.13 lukem {"defecho", DEFECHO, MD_LIN}, 355 1.13 lukem #endif /* DEFECHO */ 356 1.13 lukem #ifdef FLUSHO 357 1.13 lukem {"flusho", FLUSHO, MD_LIN}, 358 1.13 lukem #endif /* FLUSHO */ 359 1.13 lukem #ifdef PENDIN 360 1.13 lukem {"pendin", PENDIN, MD_LIN}, 361 1.13 lukem #endif /* PENDIN */ 362 1.13 lukem #ifdef IEXTEN 363 1.13 lukem {"iexten", IEXTEN, MD_LIN}, 364 1.13 lukem #endif /* IEXTEN */ 365 1.13 lukem #ifdef NOKERNINFO 366 1.13 lukem {"nokerninfo", NOKERNINFO, MD_LIN}, 367 1.13 lukem #endif /* NOKERNINFO */ 368 1.13 lukem #ifdef ALTWERASE 369 1.13 lukem {"altwerase", ALTWERASE, MD_LIN}, 370 1.13 lukem #endif /* ALTWERASE */ 371 1.13 lukem #ifdef EXTPROC 372 1.13 lukem {"extproc", EXTPROC, MD_LIN}, 373 1.13 lukem #endif /* EXTPROC */ 374 1.13 lukem 375 1.13 lukem #if defined(VINTR) 376 1.13 lukem {"intr", C_SH(C_INTR), MD_CHAR}, 377 1.13 lukem #endif /* VINTR */ 378 1.13 lukem #if defined(VQUIT) 379 1.13 lukem {"quit", C_SH(C_QUIT), MD_CHAR}, 380 1.13 lukem #endif /* VQUIT */ 381 1.13 lukem #if defined(VERASE) 382 1.13 lukem {"erase", C_SH(C_ERASE), MD_CHAR}, 383 1.13 lukem #endif /* VERASE */ 384 1.13 lukem #if defined(VKILL) 385 1.13 lukem {"kill", C_SH(C_KILL), MD_CHAR}, 386 1.13 lukem #endif /* VKILL */ 387 1.13 lukem #if defined(VEOF) 388 1.13 lukem {"eof", C_SH(C_EOF), MD_CHAR}, 389 1.13 lukem #endif /* VEOF */ 390 1.13 lukem #if defined(VEOL) 391 1.13 lukem {"eol", C_SH(C_EOL), MD_CHAR}, 392 1.13 lukem #endif /* VEOL */ 393 1.13 lukem #if defined(VEOL2) 394 1.13 lukem {"eol2", C_SH(C_EOL2), MD_CHAR}, 395 1.13 lukem #endif /* VEOL2 */ 396 1.13 lukem #if defined(VSWTCH) 397 1.13 lukem {"swtch", C_SH(C_SWTCH), MD_CHAR}, 398 1.13 lukem #endif /* VSWTCH */ 399 1.13 lukem #if defined(VDSWTCH) 400 1.13 lukem {"dswtch", C_SH(C_DSWTCH), MD_CHAR}, 401 1.13 lukem #endif /* VDSWTCH */ 402 1.13 lukem #if defined(VERASE2) 403 1.13 lukem {"erase2", C_SH(C_ERASE2), MD_CHAR}, 404 1.13 lukem #endif /* VERASE2 */ 405 1.13 lukem #if defined(VSTART) 406 1.13 lukem {"start", C_SH(C_START), MD_CHAR}, 407 1.13 lukem #endif /* VSTART */ 408 1.13 lukem #if defined(VSTOP) 409 1.13 lukem {"stop", C_SH(C_STOP), MD_CHAR}, 410 1.13 lukem #endif /* VSTOP */ 411 1.13 lukem #if defined(VWERASE) 412 1.13 lukem {"werase", C_SH(C_WERASE), MD_CHAR}, 413 1.13 lukem #endif /* VWERASE */ 414 1.13 lukem #if defined(VSUSP) 415 1.13 lukem {"susp", C_SH(C_SUSP), MD_CHAR}, 416 1.13 lukem #endif /* VSUSP */ 417 1.13 lukem #if defined(VDSUSP) 418 1.13 lukem {"dsusp", C_SH(C_DSUSP), MD_CHAR}, 419 1.13 lukem #endif /* VDSUSP */ 420 1.13 lukem #if defined(VREPRINT) 421 1.13 lukem {"reprint", C_SH(C_REPRINT), MD_CHAR}, 422 1.13 lukem #endif /* VREPRINT */ 423 1.13 lukem #if defined(VDISCARD) 424 1.13 lukem {"discard", C_SH(C_DISCARD), MD_CHAR}, 425 1.13 lukem #endif /* VDISCARD */ 426 1.13 lukem #if defined(VLNEXT) 427 1.13 lukem {"lnext", C_SH(C_LNEXT), MD_CHAR}, 428 1.13 lukem #endif /* VLNEXT */ 429 1.13 lukem #if defined(VSTATUS) 430 1.13 lukem {"status", C_SH(C_STATUS), MD_CHAR}, 431 1.13 lukem #endif /* VSTATUS */ 432 1.13 lukem #if defined(VPAGE) 433 1.13 lukem {"page", C_SH(C_PAGE), MD_CHAR}, 434 1.13 lukem #endif /* VPAGE */ 435 1.13 lukem #if defined(VPGOFF) 436 1.13 lukem {"pgoff", C_SH(C_PGOFF), MD_CHAR}, 437 1.13 lukem #endif /* VPGOFF */ 438 1.13 lukem #if defined(VKILL2) 439 1.13 lukem {"kill2", C_SH(C_KILL2), MD_CHAR}, 440 1.13 lukem #endif /* VKILL2 */ 441 1.13 lukem #if defined(VBRK) 442 1.13 lukem {"brk", C_SH(C_BRK), MD_CHAR}, 443 1.13 lukem #endif /* VBRK */ 444 1.13 lukem #if defined(VMIN) 445 1.13 lukem {"min", C_SH(C_MIN), MD_CHAR}, 446 1.13 lukem #endif /* VMIN */ 447 1.13 lukem #if defined(VTIME) 448 1.13 lukem {"time", C_SH(C_TIME), MD_CHAR}, 449 1.13 lukem #endif /* VTIME */ 450 1.13 lukem {NULL, 0, -1}, 451 1.1 cgd }; 452 1.1 cgd 453 1.1 cgd 454 1.1 cgd 455 1.13 lukem #define tty__gettabs(td) ((((td)->c_oflag & TAB3) == TAB3) ? 0 : 1) 456 1.13 lukem #define tty__geteightbit(td) (((td)->c_cflag & CSIZE) == CS8) 457 1.13 lukem #define tty__cooked_mode(td) ((td)->c_lflag & ICANON) 458 1.13 lukem 459 1.63 christos static int tty_getty(EditLine *, struct termios *); 460 1.63 christos static int tty_setty(EditLine *, int, const struct termios *); 461 1.63 christos static int tty__getcharindex(int); 462 1.63 christos static void tty__getchar(struct termios *, unsigned char *); 463 1.63 christos static void tty__setchar(struct termios *, unsigned char *); 464 1.63 christos static speed_t tty__getspeed(struct termios *); 465 1.63 christos static int tty_setup(EditLine *); 466 1.63 christos static void tty_setup_flags(EditLine *, struct termios *, int); 467 1.1 cgd 468 1.13 lukem #define t_qu t_ts 469 1.1 cgd 470 1.26 christos /* tty_getty(): 471 1.26 christos * Wrapper for tcgetattr to handle EINTR 472 1.26 christos */ 473 1.63 christos static int 474 1.26 christos tty_getty(EditLine *el, struct termios *t) 475 1.26 christos { 476 1.26 christos int rv; 477 1.26 christos while ((rv = tcgetattr(el->el_infd, t)) == -1 && errno == EINTR) 478 1.26 christos continue; 479 1.26 christos return rv; 480 1.26 christos } 481 1.26 christos 482 1.26 christos /* tty_setty(): 483 1.26 christos * Wrapper for tcsetattr to handle EINTR 484 1.26 christos */ 485 1.63 christos static int 486 1.26 christos tty_setty(EditLine *el, int action, const struct termios *t) 487 1.26 christos { 488 1.26 christos int rv; 489 1.26 christos while ((rv = tcsetattr(el->el_infd, action, t)) == -1 && errno == EINTR) 490 1.26 christos continue; 491 1.26 christos return rv; 492 1.26 christos } 493 1.1 cgd 494 1.1 cgd /* tty_setup(): 495 1.1 cgd * Get the tty parameters and initialize the editing state 496 1.1 cgd */ 497 1.63 christos static int 498 1.13 lukem tty_setup(EditLine *el) 499 1.1 cgd { 500 1.66 christos int rst = (el->el_flags & NO_RESET) == 0; 501 1.12 sommerfe 502 1.13 lukem if (el->el_flags & EDIT_DISABLED) 503 1.38 christos return 0; 504 1.13 lukem 505 1.59 christos if (el->el_tty.t_initialized) 506 1.59 christos return -1; 507 1.59 christos 508 1.34 christos if (!isatty(el->el_outfd)) { 509 1.34 christos #ifdef DEBUG_TTY 510 1.42 christos (void) fprintf(el->el_errfile, "%s: isatty: %s\n", __func__, 511 1.42 christos strerror(errno)); 512 1.34 christos #endif /* DEBUG_TTY */ 513 1.38 christos return -1; 514 1.34 christos } 515 1.42 christos if (tty_getty(el, &el->el_tty.t_or) == -1) { 516 1.1 cgd #ifdef DEBUG_TTY 517 1.42 christos (void) fprintf(el->el_errfile, "%s: tty_getty: %s\n", __func__, 518 1.42 christos strerror(errno)); 519 1.1 cgd #endif /* DEBUG_TTY */ 520 1.38 christos return -1; 521 1.13 lukem } 522 1.42 christos el->el_tty.t_ts = el->el_tty.t_ex = el->el_tty.t_ed = el->el_tty.t_or; 523 1.13 lukem 524 1.13 lukem el->el_tty.t_speed = tty__getspeed(&el->el_tty.t_ex); 525 1.13 lukem el->el_tty.t_tabs = tty__gettabs(&el->el_tty.t_ex); 526 1.13 lukem el->el_tty.t_eight = tty__geteightbit(&el->el_tty.t_ex); 527 1.13 lukem 528 1.43 christos tty_setup_flags(el, &el->el_tty.t_ex, EX_IO); 529 1.13 lukem 530 1.13 lukem /* 531 1.13 lukem * Reset the tty chars to reasonable defaults 532 1.13 lukem * If they are disabled, then enable them. 533 1.13 lukem */ 534 1.13 lukem if (rst) { 535 1.13 lukem if (tty__cooked_mode(&el->el_tty.t_ts)) { 536 1.13 lukem tty__getchar(&el->el_tty.t_ts, el->el_tty.t_c[TS_IO]); 537 1.13 lukem /* 538 1.13 lukem * Don't affect CMIN and CTIME for the editor mode 539 1.13 lukem */ 540 1.13 lukem for (rst = 0; rst < C_NCC - 2; rst++) 541 1.13 lukem if (el->el_tty.t_c[TS_IO][rst] != 542 1.13 lukem el->el_tty.t_vdisable 543 1.13 lukem && el->el_tty.t_c[ED_IO][rst] != 544 1.13 lukem el->el_tty.t_vdisable) 545 1.13 lukem el->el_tty.t_c[ED_IO][rst] = 546 1.13 lukem el->el_tty.t_c[TS_IO][rst]; 547 1.13 lukem for (rst = 0; rst < C_NCC; rst++) 548 1.13 lukem if (el->el_tty.t_c[TS_IO][rst] != 549 1.13 lukem el->el_tty.t_vdisable) 550 1.13 lukem el->el_tty.t_c[EX_IO][rst] = 551 1.13 lukem el->el_tty.t_c[TS_IO][rst]; 552 1.13 lukem } 553 1.13 lukem tty__setchar(&el->el_tty.t_ex, el->el_tty.t_c[EX_IO]); 554 1.26 christos if (tty_setty(el, TCSADRAIN, &el->el_tty.t_ex) == -1) { 555 1.1 cgd #ifdef DEBUG_TTY 556 1.42 christos (void) fprintf(el->el_errfile, "%s: tty_setty: %s\n", 557 1.42 christos __func__, strerror(errno)); 558 1.1 cgd #endif /* DEBUG_TTY */ 559 1.38 christos return -1; 560 1.13 lukem } 561 1.25 christos } 562 1.13 lukem 563 1.43 christos tty_setup_flags(el, &el->el_tty.t_ed, ED_IO); 564 1.13 lukem 565 1.13 lukem tty__setchar(&el->el_tty.t_ed, el->el_tty.t_c[ED_IO]); 566 1.13 lukem tty_bind_char(el, 1); 567 1.58 christos el->el_tty.t_initialized = 1; 568 1.38 christos return 0; 569 1.1 cgd } 570 1.1 cgd 571 1.65 christos libedit_private int 572 1.13 lukem tty_init(EditLine *el) 573 1.1 cgd { 574 1.13 lukem 575 1.13 lukem el->el_tty.t_mode = EX_IO; 576 1.13 lukem el->el_tty.t_vdisable = _POSIX_VDISABLE; 577 1.59 christos el->el_tty.t_initialized = 0; 578 1.13 lukem (void) memcpy(el->el_tty.t_t, ttyperm, sizeof(ttyperm_t)); 579 1.13 lukem (void) memcpy(el->el_tty.t_c, ttychar, sizeof(ttychar_t)); 580 1.38 christos return tty_setup(el); 581 1.13 lukem } 582 1.1 cgd 583 1.1 cgd 584 1.1 cgd /* tty_end(): 585 1.1 cgd * Restore the tty to its original settings 586 1.1 cgd */ 587 1.65 christos libedit_private void 588 1.1 cgd /*ARGSUSED*/ 589 1.67 christos tty_end(EditLine *el, int how) 590 1.1 cgd { 591 1.48 christos if (el->el_flags & EDIT_DISABLED) 592 1.49 gson return; 593 1.48 christos 594 1.59 christos if (!el->el_tty.t_initialized) 595 1.58 christos return; 596 1.58 christos 597 1.67 christos if (tty_setty(el, how, &el->el_tty.t_or) == -1) 598 1.67 christos { 599 1.42 christos #ifdef DEBUG_TTY 600 1.42 christos (void) fprintf(el->el_errfile, 601 1.42 christos "%s: tty_setty: %s\n", __func__, strerror(errno)); 602 1.42 christos #endif /* DEBUG_TTY */ 603 1.42 christos } 604 1.1 cgd } 605 1.1 cgd 606 1.1 cgd 607 1.1 cgd /* tty__getspeed(): 608 1.1 cgd * Get the tty speed 609 1.1 cgd */ 610 1.63 christos static speed_t 611 1.13 lukem tty__getspeed(struct termios *td) 612 1.1 cgd { 613 1.13 lukem speed_t spd; 614 1.1 cgd 615 1.13 lukem if ((spd = cfgetispeed(td)) == 0) 616 1.13 lukem spd = cfgetospeed(td); 617 1.38 christos return spd; 618 1.13 lukem } 619 1.1 cgd 620 1.19 christos /* tty__getspeed(): 621 1.19 christos * Return the index of the asked char in the c_cc array 622 1.19 christos */ 623 1.63 christos static int 624 1.19 christos tty__getcharindex(int i) 625 1.19 christos { 626 1.19 christos switch (i) { 627 1.19 christos #ifdef VINTR 628 1.19 christos case C_INTR: 629 1.19 christos return VINTR; 630 1.19 christos #endif /* VINTR */ 631 1.19 christos #ifdef VQUIT 632 1.19 christos case C_QUIT: 633 1.19 christos return VQUIT; 634 1.19 christos #endif /* VQUIT */ 635 1.19 christos #ifdef VERASE 636 1.19 christos case C_ERASE: 637 1.19 christos return VERASE; 638 1.19 christos #endif /* VERASE */ 639 1.19 christos #ifdef VKILL 640 1.19 christos case C_KILL: 641 1.19 christos return VKILL; 642 1.19 christos #endif /* VKILL */ 643 1.19 christos #ifdef VEOF 644 1.19 christos case C_EOF: 645 1.19 christos return VEOF; 646 1.19 christos #endif /* VEOF */ 647 1.19 christos #ifdef VEOL 648 1.19 christos case C_EOL: 649 1.19 christos return VEOL; 650 1.19 christos #endif /* VEOL */ 651 1.19 christos #ifdef VEOL2 652 1.19 christos case C_EOL2: 653 1.19 christos return VEOL2; 654 1.19 christos #endif /* VEOL2 */ 655 1.19 christos #ifdef VSWTCH 656 1.19 christos case C_SWTCH: 657 1.19 christos return VSWTCH; 658 1.19 christos #endif /* VSWTCH */ 659 1.19 christos #ifdef VDSWTCH 660 1.19 christos case C_DSWTCH: 661 1.19 christos return VDSWTCH; 662 1.19 christos #endif /* VDSWTCH */ 663 1.19 christos #ifdef VERASE2 664 1.19 christos case C_ERASE2: 665 1.19 christos return VERASE2; 666 1.19 christos #endif /* VERASE2 */ 667 1.19 christos #ifdef VSTART 668 1.19 christos case C_START: 669 1.19 christos return VSTART; 670 1.19 christos #endif /* VSTART */ 671 1.19 christos #ifdef VSTOP 672 1.19 christos case C_STOP: 673 1.19 christos return VSTOP; 674 1.19 christos #endif /* VSTOP */ 675 1.19 christos #ifdef VWERASE 676 1.19 christos case C_WERASE: 677 1.19 christos return VWERASE; 678 1.19 christos #endif /* VWERASE */ 679 1.19 christos #ifdef VSUSP 680 1.19 christos case C_SUSP: 681 1.19 christos return VSUSP; 682 1.19 christos #endif /* VSUSP */ 683 1.19 christos #ifdef VDSUSP 684 1.19 christos case C_DSUSP: 685 1.19 christos return VDSUSP; 686 1.19 christos #endif /* VDSUSP */ 687 1.19 christos #ifdef VREPRINT 688 1.19 christos case C_REPRINT: 689 1.19 christos return VREPRINT; 690 1.19 christos #endif /* VREPRINT */ 691 1.19 christos #ifdef VDISCARD 692 1.19 christos case C_DISCARD: 693 1.19 christos return VDISCARD; 694 1.19 christos #endif /* VDISCARD */ 695 1.19 christos #ifdef VLNEXT 696 1.19 christos case C_LNEXT: 697 1.19 christos return VLNEXT; 698 1.19 christos #endif /* VLNEXT */ 699 1.19 christos #ifdef VSTATUS 700 1.19 christos case C_STATUS: 701 1.19 christos return VSTATUS; 702 1.19 christos #endif /* VSTATUS */ 703 1.19 christos #ifdef VPAGE 704 1.19 christos case C_PAGE: 705 1.19 christos return VPAGE; 706 1.19 christos #endif /* VPAGE */ 707 1.19 christos #ifdef VPGOFF 708 1.19 christos case C_PGOFF: 709 1.19 christos return VPGOFF; 710 1.19 christos #endif /* VPGOFF */ 711 1.19 christos #ifdef VKILL2 712 1.19 christos case C_KILL2: 713 1.19 christos return VKILL2; 714 1.19 christos #endif /* KILL2 */ 715 1.19 christos #ifdef VMIN 716 1.19 christos case C_MIN: 717 1.19 christos return VMIN; 718 1.19 christos #endif /* VMIN */ 719 1.19 christos #ifdef VTIME 720 1.19 christos case C_TIME: 721 1.19 christos return VTIME; 722 1.19 christos #endif /* VTIME */ 723 1.19 christos default: 724 1.19 christos return -1; 725 1.19 christos } 726 1.19 christos } 727 1.1 cgd 728 1.1 cgd /* tty__getchar(): 729 1.1 cgd * Get the tty characters 730 1.1 cgd */ 731 1.63 christos static void 732 1.13 lukem tty__getchar(struct termios *td, unsigned char *s) 733 1.11 simonb { 734 1.13 lukem 735 1.13 lukem #ifdef VINTR 736 1.13 lukem s[C_INTR] = td->c_cc[VINTR]; 737 1.13 lukem #endif /* VINTR */ 738 1.13 lukem #ifdef VQUIT 739 1.13 lukem s[C_QUIT] = td->c_cc[VQUIT]; 740 1.13 lukem #endif /* VQUIT */ 741 1.13 lukem #ifdef VERASE 742 1.13 lukem s[C_ERASE] = td->c_cc[VERASE]; 743 1.13 lukem #endif /* VERASE */ 744 1.13 lukem #ifdef VKILL 745 1.13 lukem s[C_KILL] = td->c_cc[VKILL]; 746 1.13 lukem #endif /* VKILL */ 747 1.13 lukem #ifdef VEOF 748 1.13 lukem s[C_EOF] = td->c_cc[VEOF]; 749 1.13 lukem #endif /* VEOF */ 750 1.13 lukem #ifdef VEOL 751 1.13 lukem s[C_EOL] = td->c_cc[VEOL]; 752 1.13 lukem #endif /* VEOL */ 753 1.13 lukem #ifdef VEOL2 754 1.13 lukem s[C_EOL2] = td->c_cc[VEOL2]; 755 1.13 lukem #endif /* VEOL2 */ 756 1.13 lukem #ifdef VSWTCH 757 1.13 lukem s[C_SWTCH] = td->c_cc[VSWTCH]; 758 1.13 lukem #endif /* VSWTCH */ 759 1.13 lukem #ifdef VDSWTCH 760 1.13 lukem s[C_DSWTCH] = td->c_cc[VDSWTCH]; 761 1.13 lukem #endif /* VDSWTCH */ 762 1.13 lukem #ifdef VERASE2 763 1.13 lukem s[C_ERASE2] = td->c_cc[VERASE2]; 764 1.13 lukem #endif /* VERASE2 */ 765 1.13 lukem #ifdef VSTART 766 1.13 lukem s[C_START] = td->c_cc[VSTART]; 767 1.13 lukem #endif /* VSTART */ 768 1.13 lukem #ifdef VSTOP 769 1.13 lukem s[C_STOP] = td->c_cc[VSTOP]; 770 1.13 lukem #endif /* VSTOP */ 771 1.13 lukem #ifdef VWERASE 772 1.13 lukem s[C_WERASE] = td->c_cc[VWERASE]; 773 1.13 lukem #endif /* VWERASE */ 774 1.13 lukem #ifdef VSUSP 775 1.13 lukem s[C_SUSP] = td->c_cc[VSUSP]; 776 1.13 lukem #endif /* VSUSP */ 777 1.13 lukem #ifdef VDSUSP 778 1.13 lukem s[C_DSUSP] = td->c_cc[VDSUSP]; 779 1.13 lukem #endif /* VDSUSP */ 780 1.13 lukem #ifdef VREPRINT 781 1.13 lukem s[C_REPRINT] = td->c_cc[VREPRINT]; 782 1.13 lukem #endif /* VREPRINT */ 783 1.13 lukem #ifdef VDISCARD 784 1.13 lukem s[C_DISCARD] = td->c_cc[VDISCARD]; 785 1.13 lukem #endif /* VDISCARD */ 786 1.13 lukem #ifdef VLNEXT 787 1.13 lukem s[C_LNEXT] = td->c_cc[VLNEXT]; 788 1.13 lukem #endif /* VLNEXT */ 789 1.13 lukem #ifdef VSTATUS 790 1.13 lukem s[C_STATUS] = td->c_cc[VSTATUS]; 791 1.13 lukem #endif /* VSTATUS */ 792 1.13 lukem #ifdef VPAGE 793 1.13 lukem s[C_PAGE] = td->c_cc[VPAGE]; 794 1.13 lukem #endif /* VPAGE */ 795 1.13 lukem #ifdef VPGOFF 796 1.13 lukem s[C_PGOFF] = td->c_cc[VPGOFF]; 797 1.13 lukem #endif /* VPGOFF */ 798 1.13 lukem #ifdef VKILL2 799 1.13 lukem s[C_KILL2] = td->c_cc[VKILL2]; 800 1.13 lukem #endif /* KILL2 */ 801 1.13 lukem #ifdef VMIN 802 1.13 lukem s[C_MIN] = td->c_cc[VMIN]; 803 1.13 lukem #endif /* VMIN */ 804 1.13 lukem #ifdef VTIME 805 1.13 lukem s[C_TIME] = td->c_cc[VTIME]; 806 1.13 lukem #endif /* VTIME */ 807 1.13 lukem } /* tty__getchar */ 808 1.1 cgd 809 1.1 cgd 810 1.1 cgd /* tty__setchar(): 811 1.1 cgd * Set the tty characters 812 1.1 cgd */ 813 1.63 christos static void 814 1.13 lukem tty__setchar(struct termios *td, unsigned char *s) 815 1.11 simonb { 816 1.13 lukem 817 1.13 lukem #ifdef VINTR 818 1.13 lukem td->c_cc[VINTR] = s[C_INTR]; 819 1.13 lukem #endif /* VINTR */ 820 1.13 lukem #ifdef VQUIT 821 1.13 lukem td->c_cc[VQUIT] = s[C_QUIT]; 822 1.13 lukem #endif /* VQUIT */ 823 1.13 lukem #ifdef VERASE 824 1.13 lukem td->c_cc[VERASE] = s[C_ERASE]; 825 1.13 lukem #endif /* VERASE */ 826 1.13 lukem #ifdef VKILL 827 1.13 lukem td->c_cc[VKILL] = s[C_KILL]; 828 1.13 lukem #endif /* VKILL */ 829 1.13 lukem #ifdef VEOF 830 1.13 lukem td->c_cc[VEOF] = s[C_EOF]; 831 1.13 lukem #endif /* VEOF */ 832 1.13 lukem #ifdef VEOL 833 1.13 lukem td->c_cc[VEOL] = s[C_EOL]; 834 1.13 lukem #endif /* VEOL */ 835 1.13 lukem #ifdef VEOL2 836 1.13 lukem td->c_cc[VEOL2] = s[C_EOL2]; 837 1.13 lukem #endif /* VEOL2 */ 838 1.13 lukem #ifdef VSWTCH 839 1.13 lukem td->c_cc[VSWTCH] = s[C_SWTCH]; 840 1.13 lukem #endif /* VSWTCH */ 841 1.13 lukem #ifdef VDSWTCH 842 1.13 lukem td->c_cc[VDSWTCH] = s[C_DSWTCH]; 843 1.13 lukem #endif /* VDSWTCH */ 844 1.13 lukem #ifdef VERASE2 845 1.13 lukem td->c_cc[VERASE2] = s[C_ERASE2]; 846 1.13 lukem #endif /* VERASE2 */ 847 1.13 lukem #ifdef VSTART 848 1.13 lukem td->c_cc[VSTART] = s[C_START]; 849 1.13 lukem #endif /* VSTART */ 850 1.13 lukem #ifdef VSTOP 851 1.13 lukem td->c_cc[VSTOP] = s[C_STOP]; 852 1.13 lukem #endif /* VSTOP */ 853 1.13 lukem #ifdef VWERASE 854 1.13 lukem td->c_cc[VWERASE] = s[C_WERASE]; 855 1.13 lukem #endif /* VWERASE */ 856 1.13 lukem #ifdef VSUSP 857 1.13 lukem td->c_cc[VSUSP] = s[C_SUSP]; 858 1.13 lukem #endif /* VSUSP */ 859 1.13 lukem #ifdef VDSUSP 860 1.13 lukem td->c_cc[VDSUSP] = s[C_DSUSP]; 861 1.13 lukem #endif /* VDSUSP */ 862 1.13 lukem #ifdef VREPRINT 863 1.13 lukem td->c_cc[VREPRINT] = s[C_REPRINT]; 864 1.13 lukem #endif /* VREPRINT */ 865 1.13 lukem #ifdef VDISCARD 866 1.13 lukem td->c_cc[VDISCARD] = s[C_DISCARD]; 867 1.13 lukem #endif /* VDISCARD */ 868 1.13 lukem #ifdef VLNEXT 869 1.13 lukem td->c_cc[VLNEXT] = s[C_LNEXT]; 870 1.13 lukem #endif /* VLNEXT */ 871 1.13 lukem #ifdef VSTATUS 872 1.13 lukem td->c_cc[VSTATUS] = s[C_STATUS]; 873 1.13 lukem #endif /* VSTATUS */ 874 1.13 lukem #ifdef VPAGE 875 1.13 lukem td->c_cc[VPAGE] = s[C_PAGE]; 876 1.13 lukem #endif /* VPAGE */ 877 1.13 lukem #ifdef VPGOFF 878 1.13 lukem td->c_cc[VPGOFF] = s[C_PGOFF]; 879 1.13 lukem #endif /* VPGOFF */ 880 1.13 lukem #ifdef VKILL2 881 1.13 lukem td->c_cc[VKILL2] = s[C_KILL2]; 882 1.13 lukem #endif /* VKILL2 */ 883 1.13 lukem #ifdef VMIN 884 1.13 lukem td->c_cc[VMIN] = s[C_MIN]; 885 1.13 lukem #endif /* VMIN */ 886 1.13 lukem #ifdef VTIME 887 1.13 lukem td->c_cc[VTIME] = s[C_TIME]; 888 1.13 lukem #endif /* VTIME */ 889 1.13 lukem } /* tty__setchar */ 890 1.1 cgd 891 1.1 cgd 892 1.1 cgd /* tty_bind_char(): 893 1.1 cgd * Rebind the editline functions 894 1.1 cgd */ 895 1.65 christos libedit_private void 896 1.13 lukem tty_bind_char(EditLine *el, int force) 897 1.1 cgd { 898 1.13 lukem 899 1.13 lukem unsigned char *t_n = el->el_tty.t_c[ED_IO]; 900 1.13 lukem unsigned char *t_o = el->el_tty.t_ed.c_cc; 901 1.62 christos wchar_t new[2], old[2]; 902 1.14 jdolecek const ttymap_t *tp; 903 1.14 jdolecek el_action_t *map, *alt; 904 1.14 jdolecek const el_action_t *dmap, *dalt; 905 1.13 lukem new[1] = old[1] = '\0'; 906 1.13 lukem 907 1.13 lukem map = el->el_map.key; 908 1.13 lukem alt = el->el_map.alt; 909 1.13 lukem if (el->el_map.type == MAP_VI) { 910 1.13 lukem dmap = el->el_map.vii; 911 1.13 lukem dalt = el->el_map.vic; 912 1.13 lukem } else { 913 1.13 lukem dmap = el->el_map.emacs; 914 1.13 lukem dalt = NULL; 915 1.13 lukem } 916 1.13 lukem 917 1.51 christos for (tp = tty_map; tp->nch != (wint_t)-1; tp++) { 918 1.62 christos new[0] = (wchar_t)t_n[tp->nch]; 919 1.62 christos old[0] = (wchar_t)t_o[tp->och]; 920 1.13 lukem if (new[0] == old[0] && !force) 921 1.13 lukem continue; 922 1.13 lukem /* Put the old default binding back, and set the new binding */ 923 1.37 christos keymacro_clear(el, map, old); 924 1.60 christos map[(unsigned char)old[0]] = dmap[(unsigned char)old[0]]; 925 1.37 christos keymacro_clear(el, map, new); 926 1.13 lukem /* MAP_VI == 1, MAP_EMACS == 0... */ 927 1.60 christos map[(unsigned char)new[0]] = tp->bind[el->el_map.type]; 928 1.13 lukem if (dalt) { 929 1.37 christos keymacro_clear(el, alt, old); 930 1.60 christos alt[(unsigned char)old[0]] = 931 1.60 christos dalt[(unsigned char)old[0]]; 932 1.37 christos keymacro_clear(el, alt, new); 933 1.60 christos alt[(unsigned char)new[0]] = 934 1.60 christos tp->bind[el->el_map.type + 1]; 935 1.13 lukem } 936 1.1 cgd } 937 1.1 cgd } 938 1.1 cgd 939 1.13 lukem 940 1.63 christos static tcflag_t * 941 1.44 christos tty__get_flag(struct termios *t, int kind) { 942 1.44 christos switch (kind) { 943 1.44 christos case MD_INP: 944 1.44 christos return &t->c_iflag; 945 1.44 christos case MD_OUT: 946 1.44 christos return &t->c_oflag; 947 1.44 christos case MD_CTL: 948 1.44 christos return &t->c_cflag; 949 1.44 christos case MD_LIN: 950 1.44 christos return &t->c_lflag; 951 1.44 christos default: 952 1.44 christos abort(); 953 1.44 christos /*NOTREACHED*/ 954 1.44 christos } 955 1.44 christos } 956 1.44 christos 957 1.44 christos 958 1.63 christos static tcflag_t 959 1.44 christos tty_update_flag(EditLine *el, tcflag_t f, int mode, int kind) 960 1.44 christos { 961 1.44 christos f &= ~el->el_tty.t_t[mode][kind].t_clrmask; 962 1.44 christos f |= el->el_tty.t_t[mode][kind].t_setmask; 963 1.44 christos return f; 964 1.44 christos } 965 1.44 christos 966 1.44 christos 967 1.63 christos static void 968 1.44 christos tty_update_flags(EditLine *el, int kind) 969 1.44 christos { 970 1.44 christos tcflag_t *tt, *ed, *ex; 971 1.44 christos tt = tty__get_flag(&el->el_tty.t_ts, kind); 972 1.44 christos ed = tty__get_flag(&el->el_tty.t_ed, kind); 973 1.44 christos ex = tty__get_flag(&el->el_tty.t_ex, kind); 974 1.44 christos 975 1.44 christos if (*tt != *ex && (kind != MD_CTL || *tt != *ed)) { 976 1.44 christos *ed = tty_update_flag(el, *tt, ED_IO, kind); 977 1.44 christos *ex = tty_update_flag(el, *tt, EX_IO, kind); 978 1.44 christos } 979 1.44 christos } 980 1.44 christos 981 1.44 christos 982 1.63 christos static void 983 1.44 christos tty_update_char(EditLine *el, int mode, int c) { 984 1.44 christos if (!((el->el_tty.t_t[mode][MD_CHAR].t_setmask & C_SH(c))) 985 1.44 christos && (el->el_tty.t_c[TS_IO][c] != el->el_tty.t_c[EX_IO][c])) 986 1.44 christos el->el_tty.t_c[mode][c] = el->el_tty.t_c[TS_IO][c]; 987 1.44 christos if (el->el_tty.t_t[mode][MD_CHAR].t_clrmask & C_SH(c)) 988 1.44 christos el->el_tty.t_c[mode][c] = el->el_tty.t_vdisable; 989 1.44 christos } 990 1.44 christos 991 1.44 christos 992 1.1 cgd /* tty_rawmode(): 993 1.57 christos * Set terminal into 1 character at a time mode. 994 1.1 cgd */ 995 1.65 christos libedit_private int 996 1.13 lukem tty_rawmode(EditLine *el) 997 1.1 cgd { 998 1.1 cgd 999 1.13 lukem if (el->el_tty.t_mode == ED_IO || el->el_tty.t_mode == QU_IO) 1000 1.38 christos return 0; 1001 1.13 lukem 1002 1.13 lukem if (el->el_flags & EDIT_DISABLED) 1003 1.38 christos return 0; 1004 1.12 sommerfe 1005 1.13 lukem if (tty_getty(el, &el->el_tty.t_ts) == -1) { 1006 1.1 cgd #ifdef DEBUG_TTY 1007 1.42 christos (void) fprintf(el->el_errfile, "%s: tty_getty: %s\n", __func__, 1008 1.13 lukem strerror(errno)); 1009 1.1 cgd #endif /* DEBUG_TTY */ 1010 1.38 christos return -1; 1011 1.1 cgd } 1012 1.13 lukem /* 1013 1.13 lukem * We always keep up with the eight bit setting and the speed of the 1014 1.32 christos * tty. But we only believe changes that are made to cooked mode! 1015 1.13 lukem */ 1016 1.13 lukem el->el_tty.t_eight = tty__geteightbit(&el->el_tty.t_ts); 1017 1.13 lukem el->el_tty.t_speed = tty__getspeed(&el->el_tty.t_ts); 1018 1.13 lukem 1019 1.13 lukem if (tty__getspeed(&el->el_tty.t_ex) != el->el_tty.t_speed || 1020 1.13 lukem tty__getspeed(&el->el_tty.t_ed) != el->el_tty.t_speed) { 1021 1.13 lukem (void) cfsetispeed(&el->el_tty.t_ex, el->el_tty.t_speed); 1022 1.13 lukem (void) cfsetospeed(&el->el_tty.t_ex, el->el_tty.t_speed); 1023 1.13 lukem (void) cfsetispeed(&el->el_tty.t_ed, el->el_tty.t_speed); 1024 1.13 lukem (void) cfsetospeed(&el->el_tty.t_ed, el->el_tty.t_speed); 1025 1.1 cgd } 1026 1.13 lukem if (tty__cooked_mode(&el->el_tty.t_ts)) { 1027 1.44 christos int i; 1028 1.44 christos 1029 1.44 christos for (i = MD_INP; i <= MD_LIN; i++) 1030 1.44 christos tty_update_flags(el, i); 1031 1.44 christos 1032 1.13 lukem if (tty__gettabs(&el->el_tty.t_ex) == 0) 1033 1.13 lukem el->el_tty.t_tabs = 0; 1034 1.13 lukem else 1035 1.13 lukem el->el_tty.t_tabs = EL_CAN_TAB ? 1 : 0; 1036 1.1 cgd 1037 1.44 christos tty__getchar(&el->el_tty.t_ts, el->el_tty.t_c[TS_IO]); 1038 1.44 christos /* 1039 1.44 christos * Check if the user made any changes. 1040 1.44 christos * If he did, then propagate the changes to the 1041 1.44 christos * edit and execute data structures. 1042 1.44 christos */ 1043 1.44 christos for (i = 0; i < C_NCC; i++) 1044 1.44 christos if (el->el_tty.t_c[TS_IO][i] != 1045 1.44 christos el->el_tty.t_c[EX_IO][i]) 1046 1.44 christos break; 1047 1.1 cgd 1048 1.44 christos if (i != C_NCC) { 1049 1.13 lukem /* 1050 1.65 christos * Propagate changes only to the unlibedit_private 1051 1.44 christos * chars that have been modified just now. 1052 1.44 christos */ 1053 1.44 christos for (i = 0; i < C_NCC; i++) 1054 1.44 christos tty_update_char(el, ED_IO, i); 1055 1.44 christos 1056 1.44 christos tty_bind_char(el, 0); 1057 1.44 christos tty__setchar(&el->el_tty.t_ed, el->el_tty.t_c[ED_IO]); 1058 1.44 christos 1059 1.13 lukem for (i = 0; i < C_NCC; i++) 1060 1.44 christos tty_update_char(el, EX_IO, i); 1061 1.44 christos 1062 1.44 christos tty__setchar(&el->el_tty.t_ex, el->el_tty.t_c[EX_IO]); 1063 1.1 cgd } 1064 1.1 cgd } 1065 1.26 christos if (tty_setty(el, TCSADRAIN, &el->el_tty.t_ed) == -1) { 1066 1.1 cgd #ifdef DEBUG_TTY 1067 1.42 christos (void) fprintf(el->el_errfile, "%s: tty_setty: %s\n", __func__, 1068 1.13 lukem strerror(errno)); 1069 1.1 cgd #endif /* DEBUG_TTY */ 1070 1.38 christos return -1; 1071 1.13 lukem } 1072 1.13 lukem el->el_tty.t_mode = ED_IO; 1073 1.38 christos return 0; 1074 1.13 lukem } 1075 1.1 cgd 1076 1.1 cgd 1077 1.1 cgd /* tty_cookedmode(): 1078 1.1 cgd * Set the tty back to normal mode 1079 1.1 cgd */ 1080 1.65 christos libedit_private int 1081 1.13 lukem tty_cookedmode(EditLine *el) 1082 1.1 cgd { /* set tty in normal setup */ 1083 1.1 cgd 1084 1.13 lukem if (el->el_tty.t_mode == EX_IO) 1085 1.38 christos return 0; 1086 1.13 lukem 1087 1.13 lukem if (el->el_flags & EDIT_DISABLED) 1088 1.38 christos return 0; 1089 1.13 lukem 1090 1.26 christos if (tty_setty(el, TCSADRAIN, &el->el_tty.t_ex) == -1) { 1091 1.1 cgd #ifdef DEBUG_TTY 1092 1.42 christos (void) fprintf(el->el_errfile, "%s: tty_setty: %s\n", __func__, 1093 1.13 lukem strerror(errno)); 1094 1.1 cgd #endif /* DEBUG_TTY */ 1095 1.38 christos return -1; 1096 1.13 lukem } 1097 1.13 lukem el->el_tty.t_mode = EX_IO; 1098 1.38 christos return 0; 1099 1.13 lukem } 1100 1.1 cgd 1101 1.1 cgd 1102 1.1 cgd /* tty_quotemode(): 1103 1.1 cgd * Turn on quote mode 1104 1.1 cgd */ 1105 1.65 christos libedit_private int 1106 1.13 lukem tty_quotemode(EditLine *el) 1107 1.1 cgd { 1108 1.13 lukem if (el->el_tty.t_mode == QU_IO) 1109 1.38 christos return 0; 1110 1.1 cgd 1111 1.13 lukem el->el_tty.t_qu = el->el_tty.t_ed; 1112 1.1 cgd 1113 1.43 christos tty_setup_flags(el, &el->el_tty.t_qu, QU_IO); 1114 1.1 cgd 1115 1.26 christos if (tty_setty(el, TCSADRAIN, &el->el_tty.t_qu) == -1) { 1116 1.1 cgd #ifdef DEBUG_TTY 1117 1.42 christos (void) fprintf(el->el_errfile, "%s: tty_setty: %s\n", __func__, 1118 1.13 lukem strerror(errno)); 1119 1.1 cgd #endif /* DEBUG_TTY */ 1120 1.38 christos return -1; 1121 1.13 lukem } 1122 1.13 lukem el->el_tty.t_mode = QU_IO; 1123 1.38 christos return 0; 1124 1.13 lukem } 1125 1.1 cgd 1126 1.1 cgd 1127 1.1 cgd /* tty_noquotemode(): 1128 1.1 cgd * Turn off quote mode 1129 1.1 cgd */ 1130 1.65 christos libedit_private int 1131 1.13 lukem tty_noquotemode(EditLine *el) 1132 1.1 cgd { 1133 1.13 lukem 1134 1.13 lukem if (el->el_tty.t_mode != QU_IO) 1135 1.38 christos return 0; 1136 1.26 christos if (tty_setty(el, TCSADRAIN, &el->el_tty.t_ed) == -1) { 1137 1.1 cgd #ifdef DEBUG_TTY 1138 1.42 christos (void) fprintf(el->el_errfile, "%s: tty_setty: %s\n", __func__, 1139 1.13 lukem strerror(errno)); 1140 1.1 cgd #endif /* DEBUG_TTY */ 1141 1.38 christos return -1; 1142 1.13 lukem } 1143 1.13 lukem el->el_tty.t_mode = ED_IO; 1144 1.38 christos return 0; 1145 1.1 cgd } 1146 1.1 cgd 1147 1.13 lukem 1148 1.1 cgd /* tty_stty(): 1149 1.1 cgd * Stty builtin 1150 1.1 cgd */ 1151 1.65 christos libedit_private int 1152 1.1 cgd /*ARGSUSED*/ 1153 1.62 christos tty_stty(EditLine *el, int argc __attribute__((__unused__)), 1154 1.62 christos const wchar_t **argv) 1155 1.1 cgd { 1156 1.14 jdolecek const ttymodes_t *m; 1157 1.16 christos char x; 1158 1.13 lukem int aflag = 0; 1159 1.62 christos const wchar_t *s, *d; 1160 1.32 christos char name[EL_BUFSIZ]; 1161 1.19 christos struct termios *tios = &el->el_tty.t_ex; 1162 1.13 lukem int z = EX_IO; 1163 1.13 lukem 1164 1.13 lukem if (argv == NULL) 1165 1.38 christos return -1; 1166 1.69 christos strlcpy(name, ct_encode_string(*argv++, &el->el_scratch), sizeof(name)); 1167 1.13 lukem 1168 1.13 lukem while (argv && *argv && argv[0][0] == '-' && argv[0][2] == '\0') 1169 1.13 lukem switch (argv[0][1]) { 1170 1.13 lukem case 'a': 1171 1.13 lukem aflag++; 1172 1.13 lukem argv++; 1173 1.13 lukem break; 1174 1.13 lukem case 'd': 1175 1.13 lukem argv++; 1176 1.19 christos tios = &el->el_tty.t_ed; 1177 1.13 lukem z = ED_IO; 1178 1.13 lukem break; 1179 1.13 lukem case 'x': 1180 1.13 lukem argv++; 1181 1.19 christos tios = &el->el_tty.t_ex; 1182 1.13 lukem z = EX_IO; 1183 1.13 lukem break; 1184 1.13 lukem case 'q': 1185 1.13 lukem argv++; 1186 1.19 christos tios = &el->el_tty.t_ts; 1187 1.13 lukem z = QU_IO; 1188 1.13 lukem break; 1189 1.13 lukem default: 1190 1.13 lukem (void) fprintf(el->el_errfile, 1191 1.51 christos "%s: Unknown switch `%lc'.\n", 1192 1.51 christos name, (wint_t)argv[0][1]); 1193 1.38 christos return -1; 1194 1.13 lukem } 1195 1.1 cgd 1196 1.13 lukem if (!argv || !*argv) { 1197 1.13 lukem int i = -1; 1198 1.29 christos size_t len = 0, st = 0, cu; 1199 1.13 lukem for (m = ttymodes; m->m_name; m++) { 1200 1.13 lukem if (m->m_type != i) { 1201 1.13 lukem (void) fprintf(el->el_outfile, "%s%s", 1202 1.13 lukem i != -1 ? "\n" : "", 1203 1.13 lukem el->el_tty.t_t[z][m->m_type].t_name); 1204 1.13 lukem i = m->m_type; 1205 1.13 lukem st = len = 1206 1.13 lukem strlen(el->el_tty.t_t[z][m->m_type].t_name); 1207 1.13 lukem } 1208 1.24 christos if (i != -1) { 1209 1.24 christos x = (el->el_tty.t_t[z][i].t_setmask & m->m_value) 1210 1.24 christos ? '+' : '\0'; 1211 1.40 christos 1212 1.40 christos if (el->el_tty.t_t[z][i].t_clrmask & m->m_value) 1213 1.40 christos x = '-'; 1214 1.24 christos } else { 1215 1.24 christos x = '\0'; 1216 1.24 christos } 1217 1.13 lukem 1218 1.13 lukem if (x != '\0' || aflag) { 1219 1.13 lukem 1220 1.13 lukem cu = strlen(m->m_name) + (x != '\0') + 1; 1221 1.13 lukem 1222 1.42 christos if (len + cu >= 1223 1.42 christos (size_t)el->el_terminal.t_size.h) { 1224 1.13 lukem (void) fprintf(el->el_outfile, "\n%*s", 1225 1.29 christos (int)st, ""); 1226 1.13 lukem len = st + cu; 1227 1.13 lukem } else 1228 1.13 lukem len += cu; 1229 1.13 lukem 1230 1.13 lukem if (x != '\0') 1231 1.13 lukem (void) fprintf(el->el_outfile, "%c%s ", 1232 1.13 lukem x, m->m_name); 1233 1.13 lukem else 1234 1.13 lukem (void) fprintf(el->el_outfile, "%s ", 1235 1.13 lukem m->m_name); 1236 1.13 lukem } 1237 1.1 cgd } 1238 1.13 lukem (void) fprintf(el->el_outfile, "\n"); 1239 1.38 christos return 0; 1240 1.1 cgd } 1241 1.13 lukem while (argv && (s = *argv++)) { 1242 1.62 christos const wchar_t *p; 1243 1.13 lukem switch (*s) { 1244 1.13 lukem case '+': 1245 1.13 lukem case '-': 1246 1.40 christos x = (char)*s++; 1247 1.13 lukem break; 1248 1.13 lukem default: 1249 1.13 lukem x = '\0'; 1250 1.13 lukem break; 1251 1.13 lukem } 1252 1.13 lukem d = s; 1253 1.61 christos p = wcschr(s, L'='); 1254 1.13 lukem for (m = ttymodes; m->m_name; m++) 1255 1.42 christos if ((p ? strncmp(m->m_name, ct_encode_string(d, 1256 1.42 christos &el->el_scratch), (size_t)(p - d)) : 1257 1.42 christos strcmp(m->m_name, ct_encode_string(d, 1258 1.42 christos &el->el_scratch))) == 0 && 1259 1.19 christos (p == NULL || m->m_type == MD_CHAR)) 1260 1.13 lukem break; 1261 1.13 lukem 1262 1.13 lukem if (!m->m_name) { 1263 1.13 lukem (void) fprintf(el->el_errfile, 1264 1.60 christos "%s: Invalid argument `%ls'.\n", name, d); 1265 1.38 christos return -1; 1266 1.19 christos } 1267 1.19 christos if (p) { 1268 1.19 christos int c = ffs((int)m->m_value); 1269 1.32 christos int v = *++p ? parse__escape(&p) : 1270 1.19 christos el->el_tty.t_vdisable; 1271 1.31 christos assert(c != 0); 1272 1.31 christos c--; 1273 1.19 christos c = tty__getcharindex(c); 1274 1.19 christos assert(c != -1); 1275 1.40 christos tios->c_cc[c] = (cc_t)v; 1276 1.19 christos continue; 1277 1.13 lukem } 1278 1.13 lukem switch (x) { 1279 1.13 lukem case '+': 1280 1.13 lukem el->el_tty.t_t[z][m->m_type].t_setmask |= m->m_value; 1281 1.13 lukem el->el_tty.t_t[z][m->m_type].t_clrmask &= ~m->m_value; 1282 1.13 lukem break; 1283 1.13 lukem case '-': 1284 1.13 lukem el->el_tty.t_t[z][m->m_type].t_setmask &= ~m->m_value; 1285 1.13 lukem el->el_tty.t_t[z][m->m_type].t_clrmask |= m->m_value; 1286 1.13 lukem break; 1287 1.13 lukem default: 1288 1.13 lukem el->el_tty.t_t[z][m->m_type].t_setmask &= ~m->m_value; 1289 1.13 lukem el->el_tty.t_t[z][m->m_type].t_clrmask &= ~m->m_value; 1290 1.13 lukem break; 1291 1.13 lukem } 1292 1.1 cgd } 1293 1.27 christos 1294 1.45 christos tty_setup_flags(el, tios, z); 1295 1.27 christos if (el->el_tty.t_mode == z) { 1296 1.27 christos if (tty_setty(el, TCSADRAIN, tios) == -1) { 1297 1.27 christos #ifdef DEBUG_TTY 1298 1.42 christos (void) fprintf(el->el_errfile, "%s: tty_setty: %s\n", 1299 1.42 christos __func__, strerror(errno)); 1300 1.27 christos #endif /* DEBUG_TTY */ 1301 1.38 christos return -1; 1302 1.27 christos } 1303 1.27 christos } 1304 1.27 christos 1305 1.38 christos return 0; 1306 1.13 lukem } 1307 1.1 cgd 1308 1.1 cgd 1309 1.1 cgd #ifdef notyet 1310 1.1 cgd /* tty_printchar(): 1311 1.1 cgd * DEbugging routine to print the tty characters 1312 1.1 cgd */ 1313 1.63 christos static void 1314 1.13 lukem tty_printchar(EditLine *el, unsigned char *s) 1315 1.1 cgd { 1316 1.13 lukem ttyperm_t *m; 1317 1.13 lukem int i; 1318 1.1 cgd 1319 1.13 lukem for (i = 0; i < C_NCC; i++) { 1320 1.13 lukem for (m = el->el_tty.t_t; m->m_name; m++) 1321 1.13 lukem if (m->m_type == MD_CHAR && C_SH(i) == m->m_value) 1322 1.13 lukem break; 1323 1.13 lukem if (m->m_name) 1324 1.13 lukem (void) fprintf(el->el_errfile, "%s ^%c ", 1325 1.13 lukem m->m_name, s[i] + 'A' - 1); 1326 1.13 lukem if (i % 5 == 0) 1327 1.13 lukem (void) fprintf(el->el_errfile, "\n"); 1328 1.13 lukem } 1329 1.13 lukem (void) fprintf(el->el_errfile, "\n"); 1330 1.1 cgd } 1331 1.1 cgd #endif /* notyet */ 1332 1.43 christos 1333 1.43 christos 1334 1.63 christos static void 1335 1.43 christos tty_setup_flags(EditLine *el, struct termios *tios, int mode) 1336 1.43 christos { 1337 1.44 christos int kind; 1338 1.44 christos for (kind = MD_INP; kind <= MD_LIN; kind++) { 1339 1.44 christos tcflag_t *f = tty__get_flag(tios, kind); 1340 1.44 christos *f = tty_update_flag(el, *f, mode, kind); 1341 1.44 christos } 1342 1.43 christos } 1343 1.68 christos 1344 1.68 christos libedit_private int 1345 1.68 christos tty_get_signal_character(EditLine *el, int sig) 1346 1.68 christos { 1347 1.68 christos #ifdef ECHOCTL 1348 1.68 christos tcflag_t *ed = tty__get_flag(&el->el_tty.t_ed, MD_INP); 1349 1.68 christos if ((*ed & ECHOCTL) == 0) 1350 1.68 christos return -1; 1351 1.68 christos #endif 1352 1.68 christos switch (sig) { 1353 1.70 christos #if defined(SIGINT) && defined(VINTR) 1354 1.68 christos case SIGINT: 1355 1.68 christos return el->el_tty.t_c[ED_IO][VINTR]; 1356 1.68 christos #endif 1357 1.70 christos #if defined(SIGQUIT) && defined(VQUIT) 1358 1.68 christos case SIGQUIT: 1359 1.68 christos return el->el_tty.t_c[ED_IO][VQUIT]; 1360 1.68 christos #endif 1361 1.70 christos #if defined(SIGINFO) && defined(VSTATUS) 1362 1.68 christos case SIGINFO: 1363 1.68 christos return el->el_tty.t_c[ED_IO][VSTATUS]; 1364 1.68 christos #endif 1365 1.70 christos #if defined(SIGTSTP) && defined(VSUSP) 1366 1.68 christos case SIGTSTP: 1367 1.68 christos return el->el_tty.t_c[ED_IO][VSUSP]; 1368 1.68 christos #endif 1369 1.68 christos default: 1370 1.68 christos return -1; 1371 1.68 christos } 1372 1.68 christos } 1373