41 42#include "ed.h" 43#include "ed.term.h" 44 45int didsetty = 0; 46ttyperm_t ttylist = { 47 { 48#if defined(POSIX) || defined(TERMIO) 49 { "iflag:", ICRNL, (INLCR|IGNCR) }, 50 { "oflag:", (OPOST|ONLCR), ONLRET }, 51 { "cflag:", 0, 0 }, 52 { "lflag:", (ISIG|ICANON|ECHO|ECHOE|ECHOCTL|IEXTEN), 53 (NOFLSH|ECHONL|EXTPROC|FLUSHO|IDEFAULT) }, 54#else /* GSTTY */ 55 { "nrmal:", (ECHO|CRMOD|ANYP), (CBREAK|RAW|LCASE|VTDELAY|ALLDELAY) }, 56 { "local:", (LCRTBS|LCRTERA|LCRTKIL), (LPRTERA|LFLUSHO) }, 57#endif /* POSIX || TERMIO */ 58 { "chars:", 0, 0 }, 59 }, 60 { 61#if defined(POSIX) || defined(TERMIO) 62 { "iflag:", (INLCR|ICRNL), IGNCR }, 63 { "oflag:", (OPOST|ONLCR), ONLRET }, 64 { "cflag:", 0, 0 }, 65 { "lflag:", ISIG, 66 (NOFLSH|ICANON|ECHO|ECHOK|ECHONL|EXTPROC|IEXTEN|FLUSHO| 67 IDEFAULT) }, 68#else /* GSTTY */ 69 { "nrmal:", (CBREAK|CRMOD|ANYP), (RAW|ECHO|LCASE|VTDELAY|ALLDELAY) }, 70 { "local:", (LCRTBS|LCRTERA|LCRTKIL), (LPRTERA|LFLUSHO) }, 71#endif /* POSIX || TERMIO */ 72 { "chars:", (C_SH(C_MIN)|C_SH(C_TIME)|C_SH(C_SWTCH)|C_SH(C_DSWTCH)| 73 C_SH(C_WERASE)|C_SH(C_REPRINT)|C_SH(C_SUSP)|C_SH(C_DSUSP)| 74 C_SH(C_EOF)|C_SH(C_EOL)|C_SH(C_DISCARD)|C_SH(C_PGOFF)| 75 C_SH(C_KILL2)|C_SH(C_PAGE)|C_SH(C_STATUS)|C_SH(C_LNEXT)), 76 0 } 77 }, 78 { 79#if defined(POSIX) || defined(TERMIO) 80 { "iflag:", 0, IXON | IXOFF }, 81 { "oflag:", 0, 0 }, 82 { "cflag:", 0, 0 }, 83 { "lflag:", 0, ISIG | IEXTEN }, 84#else /* GSTTY */ 85 { "nrmal:", RAW, CBREAK }, 86 { "local:", 0, 0 }, 87#endif /* POSIX || TERMIO */ 88 { "chars:", 0, 0 }, 89 } 90}; 91 92static struct tcshmodes { 93 char *m_name; 94#ifdef SOLARIS2 95 unsigned long m_value; 96#else /* !SOLARIS2 */ 97 int m_value; 98#endif /* SOLARIS2 */ 99 int m_type; 100} modelist[] = { 101#if defined(POSIX) || defined(TERMIO) 102 103# ifdef IGNBRK 104 { "ignbrk", IGNBRK, M_INPUT }, 105# endif /* IGNBRK */ 106# ifdef BRKINT 107 { "brkint", BRKINT, M_INPUT }, 108# endif /* BRKINT */ 109# ifdef IGNPAR 110 { "ignpar", IGNPAR, M_INPUT }, 111# endif /* IGNPAR */ 112# ifdef PARMRK 113 { "parmrk", PARMRK, M_INPUT }, 114# endif /* PARMRK */ 115# ifdef INPCK 116 { "inpck", INPCK, M_INPUT }, 117# endif /* INPCK */ 118# ifdef ISTRIP 119 { "istrip", ISTRIP, M_INPUT }, 120# endif /* ISTRIP */ 121# ifdef INLCR 122 { "inlcr", INLCR, M_INPUT }, 123# endif /* INLCR */ 124# ifdef IGNCR 125 { "igncr", IGNCR, M_INPUT }, 126# endif /* IGNCR */ 127# ifdef ICRNL 128 { "icrnl", ICRNL, M_INPUT }, 129# endif /* ICRNL */ 130# ifdef IUCLC 131 { "iuclc", IUCLC, M_INPUT }, 132# endif /* IUCLC */ 133# ifdef IXON 134 { "ixon", IXON, M_INPUT }, 135# endif /* IXON */ 136# ifdef IXANY 137 { "ixany", IXANY, M_INPUT }, 138# endif /* IXANY */ 139# ifdef IXOFF 140 { "ixoff", IXOFF, M_INPUT }, 141# endif /* IXOFF */ 142# ifdef IMAXBEL 143 { "imaxbel",IMAXBEL,M_INPUT }, 144# endif /* IMAXBEL */ 145# ifdef IDELETE 146 { "idelete",IDELETE,M_INPUT }, 147# endif /* IDELETE */ 148 149# ifdef OPOST 150 { "opost", OPOST, M_OUTPUT }, 151# endif /* OPOST */ 152# ifdef OLCUC 153 { "olcuc", OLCUC, M_OUTPUT }, 154# endif /* OLCUC */ 155# ifdef ONLCR 156 { "onlcr", ONLCR, M_OUTPUT }, 157# endif /* ONLCR */ 158# ifdef OCRNL 159 { "ocrnl", OCRNL, M_OUTPUT }, 160# endif /* OCRNL */ 161# ifdef ONOCR 162 { "onocr", ONOCR, M_OUTPUT }, 163# endif /* ONOCR */ 164# ifdef ONOEOT 165 { "onoeot", ONOEOT, M_OUTPUT }, 166# endif /* ONOEOT */ 167# ifdef ONLRET 168 { "onlret", ONLRET, M_OUTPUT }, 169# endif /* ONLRET */ 170# ifdef OFILL 171 { "ofill", OFILL, M_OUTPUT }, 172# endif /* OFILL */ 173# ifdef OFDEL 174 { "ofdel", OFDEL, M_OUTPUT }, 175# endif /* OFDEL */ 176# ifdef NLDLY 177 { "nldly", NLDLY, M_OUTPUT }, 178# endif /* NLDLY */ 179# ifdef CRDLY 180 { "crdly", CRDLY, M_OUTPUT }, 181# endif /* CRDLY */ 182# ifdef TABDLY 183 { "tabdly", TABDLY, M_OUTPUT }, 184# endif /* TABDLY */ 185# ifdef XTABS 186 { "xtabs", XTABS, M_OUTPUT }, 187# endif /* XTABS */ 188# ifdef BSDLY 189 { "bsdly", BSDLY, M_OUTPUT }, 190# endif /* BSDLY */ 191# ifdef VTDLY 192 { "vtdly", VTDLY, M_OUTPUT }, 193# endif /* VTDLY */ 194# ifdef FFDLY 195 { "ffdly", FFDLY, M_OUTPUT }, 196# endif /* FFDLY */ 197# ifdef PAGEOUT 198 { "pageout",PAGEOUT,M_OUTPUT }, 199# endif /* PAGEOUT */ 200# ifdef WRAP 201 { "wrap", WRAP, M_OUTPUT }, 202# endif /* WRAP */ 203 204# ifdef CIGNORE 205 { "cignore",CIGNORE,M_CONTROL }, 206# endif /* CBAUD */ 207# ifdef CBAUD 208 { "cbaud", CBAUD, M_CONTROL }, 209# endif /* CBAUD */ 210# ifdef CSTOPB 211 { "cstopb", CSTOPB, M_CONTROL }, 212# endif /* CSTOPB */ 213# ifdef CREAD 214 { "cread", CREAD, M_CONTROL }, 215# endif /* CREAD */ 216# ifdef PARENB 217 { "parenb", PARENB, M_CONTROL }, 218# endif /* PARENB */ 219# ifdef PARODD 220 { "parodd", PARODD, M_CONTROL }, 221# endif /* PARODD */ 222# ifdef HUPCL 223 { "hupcl", HUPCL, M_CONTROL }, 224# endif /* HUPCL */ 225# ifdef CLOCAL 226 { "clocal", CLOCAL, M_CONTROL }, 227# endif /* CLOCAL */ 228# ifdef LOBLK 229 { "loblk", LOBLK, M_CONTROL }, 230# endif /* LOBLK */ 231# ifdef CIBAUD 232 { "cibaud", CIBAUD, M_CONTROL }, 233# endif /* CIBAUD */ 234# ifdef CRTSCTS 235# ifdef CCTS_OFLOW 236 { "ccts_oflow",CCTS_OFLOW,M_CONTROL }, 237# else 238 { "crtscts",CRTSCTS,M_CONTROL }, 239# endif /* CCTS_OFLOW */ 240# endif /* CRTSCTS */ 241# ifdef CRTS_IFLOW 242 { "crts_iflow",CRTS_IFLOW,M_CONTROL }, 243# endif /* CRTS_IFLOW */ 244# ifdef MDMBUF 245 { "mdmbuf", MDMBUF, M_CONTROL }, 246# endif /* MDMBUF */ 247# ifdef RCV1EN 248 { "rcv1en", RCV1EN, M_CONTROL }, 249# endif /* RCV1EN */ 250# ifdef XMT1EN 251 { "xmt1en", XMT1EN, M_CONTROL }, 252# endif /* XMT1EN */ 253 254# ifdef ISIG 255 { "isig", ISIG, M_LINED }, 256# endif /* ISIG */ 257# ifdef ICANON 258 { "icanon", ICANON, M_LINED }, 259# endif /* ICANON */ 260# ifdef XCASE 261 { "xcase", XCASE, M_LINED }, 262# endif /* XCASE */ 263# ifdef ECHO 264 { "echo", ECHO, M_LINED }, 265# endif /* ECHO */ 266# ifdef ECHOE 267 { "echoe", ECHOE, M_LINED }, 268# endif /* ECHOE */ 269# ifdef ECHOK 270 { "echok", ECHOK, M_LINED }, 271# endif /* ECHOK */ 272# ifdef ECHONL 273 { "echonl", ECHONL, M_LINED }, 274# endif /* ECHONL */ 275# ifdef NOFLSH 276 { "noflsh", NOFLSH, M_LINED }, 277# endif /* NOFLSH */ 278# ifdef TOSTOP 279 { "tostop", TOSTOP, M_LINED }, 280# endif /* TOSTOP */ 281# ifdef ECHOCTL 282 { "echoctl",ECHOCTL,M_LINED }, 283# endif /* ECHOCTL */ 284# ifdef ECHOPRT 285 { "echoprt",ECHOPRT,M_LINED }, 286# endif /* ECHOPRT */ 287# ifdef ECHOKE 288 { "echoke", ECHOKE, M_LINED }, 289# endif /* ECHOKE */ 290# ifdef DEFECHO 291 { "defecho",DEFECHO,M_LINED }, 292# endif /* DEFECHO */ 293# ifdef FLUSHO 294 { "flusho", FLUSHO, M_LINED }, 295# endif /* FLUSHO */ 296# ifdef PENDIN 297 { "pendin", PENDIN, M_LINED }, 298# endif /* PENDIN */ 299# ifdef IEXTEN 300 { "iexten", IEXTEN, M_LINED }, 301# endif /* IEXTEN */ 302# ifdef NOKERNINFO 303 { "nokerninfo",NOKERNINFO,M_LINED }, 304# endif /* NOKERNINFO */ 305# ifdef ALTWERASE 306 { "altwerase",ALTWERASE,M_LINED }, 307# endif /* ALTWERASE */ 308# ifdef EXTPROC 309 { "extproc",EXTPROC,M_LINED }, 310# endif /* EXTPROC */ 311# ifdef IDEFAULT 312 { "idefault",IDEFAULT,M_LINED }, 313# endif /* IDEFAULT */ 314 315#else /* GSTTY */ 316 317# ifdef TANDEM 318 { "tandem", TANDEM, M_CONTROL }, 319# endif /* TANDEM */ 320# ifdef CBREAK 321 { "cbreak", CBREAK, M_CONTROL }, 322# endif /* CBREAK */ 323# ifdef LCASE 324 { "lcase", LCASE, M_CONTROL }, 325# endif /* LCASE */ 326# ifdef ECHO 327 { "echo", ECHO, M_CONTROL }, 328# endif /* ECHO */ 329# ifdef CRMOD 330 { "crmod", CRMOD, M_CONTROL }, 331# endif /* CRMOD */ 332# ifdef RAW 333 { "raw", RAW, M_CONTROL }, 334# endif /* RAW */ 335# ifdef ODDP 336 { "oddp", ODDP, M_CONTROL }, 337# endif /* ODDP */ 338# ifdef EVENP 339 { "evenp", EVENP, M_CONTROL }, 340# endif /* EVENP */ 341# ifdef ANYP 342 { "anyp", ANYP, M_CONTROL }, 343# endif /* ANYP */ 344# ifdef NLDELAY 345 { "nldelay",NLDELAY,M_CONTROL }, 346# endif /* NLDELAY */ 347# ifdef TBDELAY 348 { "tbdelay",TBDELAY,M_CONTROL }, 349# endif /* TBDELAY */ 350# ifdef XTABS 351 { "xtabs", XTABS, M_CONTROL }, 352# endif /* XTABS */ 353# ifdef CRDELAY 354 { "crdelay",CRDELAY,M_CONTROL }, 355# endif /* CRDELAY */ 356# ifdef VTDELAY 357 { "vtdelay",VTDELAY,M_CONTROL }, 358# endif /* VTDELAY */ 359# ifdef BSDELAY 360 { "bsdelay",BSDELAY,M_CONTROL }, 361# endif /* BSDELAY */ 362# ifdef CRTBS 363 { "crtbs", CRTBS, M_CONTROL }, 364# endif /* CRTBS */ 365# ifdef PRTERA 366 { "prtera", PRTERA, M_CONTROL }, 367# endif /* PRTERA */ 368# ifdef CRTERA 369 { "crtera", CRTERA, M_CONTROL }, 370# endif /* CRTERA */ 371# ifdef TILDE 372 { "tilde", TILDE, M_CONTROL }, 373# endif /* TILDE */ 374# ifdef MDMBUF 375 { "mdmbuf", MDMBUF, M_CONTROL }, 376# endif /* MDMBUF */ 377# ifdef LITOUT 378 { "litout", LITOUT, M_CONTROL }, 379# endif /* LITOUT */ 380# ifdef TOSTOP 381 { "tostop", TOSTOP, M_CONTROL }, 382# endif /* TOSTOP */ 383# ifdef FLUSHO 384 { "flusho", FLUSHO, M_CONTROL }, 385# endif /* FLUSHO */ 386# ifdef NOHANG 387 { "nohang", NOHANG, M_CONTROL }, 388# endif /* NOHANG */ 389# ifdef L001000 390 { "l001000",L001000,M_CONTROL }, 391# endif /* L001000 */ 392# ifdef CRTKIL 393 { "crtkil", CRTKIL, M_CONTROL }, 394# endif /* CRTKIL */ 395# ifdef PASS8 396 { "pass8", PASS8, M_CONTROL }, 397# endif /* PASS8 */ 398# ifdef CTLECH 399 { "ctlech", CTLECH, M_CONTROL }, 400# endif /* CTLECH */ 401# ifdef PENDIN 402 { "pendin", PENDIN, M_CONTROL }, 403# endif /* PENDIN */ 404# ifdef DECCTQ 405 { "decctq", DECCTQ, M_CONTROL }, 406# endif /* DECCTQ */ 407# ifdef NOFLSH 408 { "noflsh", NOFLSH, M_CONTROL }, 409# endif /* NOFLSH */ 410 411# ifdef LCRTBS 412 { "lcrtbs", LCRTBS, M_LOCAL }, 413# endif /* LCRTBS */ 414# ifdef LPRTERA 415 { "lprtera",LPRTERA,M_LOCAL }, 416# endif /* LPRTERA */ 417# ifdef LCRTERA 418 { "lcrtera",LCRTERA,M_LOCAL }, 419# endif /* LCRTERA */ 420# ifdef LTILDE 421 { "ltilde", LTILDE, M_LOCAL }, 422# endif /* LTILDE */ 423# ifdef LMDMBUF 424 { "lmdmbuf",LMDMBUF,M_LOCAL }, 425# endif /* LMDMBUF */ 426# ifdef LLITOUT 427 { "llitout",LLITOUT,M_LOCAL }, 428# endif /* LLITOUT */ 429# ifdef LTOSTOP 430 { "ltostop",LTOSTOP,M_LOCAL }, 431# endif /* LTOSTOP */ 432# ifdef LFLUSHO 433 { "lflusho",LFLUSHO,M_LOCAL }, 434# endif /* LFLUSHO */ 435# ifdef LNOHANG 436 { "lnohang",LNOHANG,M_LOCAL }, 437# endif /* LNOHANG */ 438# ifdef LCRTKIL 439 { "lcrtkil",LCRTKIL,M_LOCAL }, 440# endif /* LCRTKIL */ 441# ifdef LPASS8 442 { "lpass8", LPASS8, M_LOCAL }, 443# endif /* LPASS8 */ 444# ifdef LCTLECH 445 { "lctlech",LCTLECH,M_LOCAL }, 446# endif /* LCTLECH */ 447# ifdef LPENDIN 448 { "lpendin",LPENDIN,M_LOCAL }, 449# endif /* LPENDIN */ 450# ifdef LDECCTQ 451 { "ldecctq",LDECCTQ,M_LOCAL }, 452# endif /* LDECCTQ */ 453# ifdef LNOFLSH 454 { "lnoflsh",LNOFLSH,M_LOCAL }, 455# endif /* LNOFLSH */ 456 457#endif /* POSIX || TERMIO */ 458# if defined(VINTR) || defined(TIOCGETC) 459 { "intr", C_SH(C_INTR), M_CHAR }, 460# endif /* VINTR */ 461# if defined(VQUIT) || defined(TIOCGETC) 462 { "quit", C_SH(C_QUIT), M_CHAR }, 463# endif /* VQUIT */ 464# if defined(VERASE) || defined(TIOCGETP) 465 { "erase", C_SH(C_ERASE), M_CHAR }, 466# endif /* VERASE */ 467# if defined(VKILL) || defined(TIOCGETP) 468 { "kill", C_SH(C_KILL), M_CHAR }, 469# endif /* VKILL */ 470# if defined(VEOF) || defined(TIOCGETC) 471 { "eof", C_SH(C_EOF), M_CHAR }, 472# endif /* VEOF */ 473# if defined(VEOL) 474 { "eol", C_SH(C_EOL), M_CHAR }, 475# endif /* VEOL */ 476# if defined(VEOL2) 477 { "eol2", C_SH(C_EOL2), M_CHAR }, 478# endif /* VEOL2 */ 479# if defined(VSWTCH) 480 { "swtch", C_SH(C_SWTCH), M_CHAR }, 481# endif /* VSWTCH */ 482# if defined(VDSWTCH) 483 { "dswtch", C_SH(C_DSWTCH), M_CHAR }, 484# endif /* VDSWTCH */ 485# if defined(VERASE2) 486 { "erase2", C_SH(C_ERASE2), M_CHAR }, 487# endif /* VERASE2 */ 488# if defined(VSTART) || defined(TIOCGETC) 489 { "start", C_SH(C_START), M_CHAR }, 490# endif /* VSTART */ 491# if defined(VSTOP) || defined(TIOCGETC) 492 { "stop", C_SH(C_STOP), M_CHAR }, 493# endif /* VSTOP */ 494# if defined(VWERASE) || defined(TIOCGLTC) 495 { "werase", C_SH(C_WERASE), M_CHAR }, 496# endif /* VWERASE */ 497# if defined(VSUSP) || defined(TIOCGLTC) 498 { "susp", C_SH(C_SUSP), M_CHAR }, 499# endif /* VSUSP */ 500# if defined(VDSUSP) || defined(TIOCGLTC) 501 { "dsusp", C_SH(C_DSUSP), M_CHAR }, 502# endif /* VDSUSP */ 503# if defined(VREPRINT) || defined(TIOCGLTC) 504 { "reprint", C_SH(C_REPRINT),M_CHAR }, 505# endif /* WREPRINT */ 506# if defined(VDISCARD) || defined(TIOCGLTC) 507 { "discard", C_SH(C_DISCARD),M_CHAR }, 508# endif /* VDISCARD */ 509# if defined(VLNEXT) || defined(TIOCGLTC) 510 { "lnext", C_SH(C_LNEXT), M_CHAR }, 511# endif /* VLNEXT */ 512# if defined(VSTATUS) || defined(TIOCGPAGE) 513 { "status", C_SH(C_STATUS), M_CHAR }, 514# endif /* VSTATUS */ 515# if defined(VPAGE) || defined(TIOCGPAGE) 516 { "page", C_SH(C_PAGE), M_CHAR }, 517# endif /* VPAGE */ 518# if defined(VPGOFF) || defined(TIOCGPAGE) 519 { "pgoff", C_SH(C_PGOFF), M_CHAR }, 520# endif /* VPGOFF */ 521# if defined(VKILL2) 522 { "kill2", C_SH(C_KILL2), M_CHAR }, 523# endif /* VKILL2 */ 524# if defined(VBRK) || defined(TIOCGETC) 525 { "brk", C_SH(C_BRK), M_CHAR }, 526# endif /* VBRK */ 527# if defined(VMIN) 528 { "min", C_SH(C_MIN), M_CHAR }, 529# endif /* VMIN */ 530# if defined(VTIME) 531 { "time", C_SH(C_TIME), M_CHAR }, 532# endif /* VTIME */ 533 { NULL, 0, -1 }, 534}; 535 536/* 537 * If EAGAIN and/or EWOULDBLOCK are defined, we can't just return -1 in all 538 * situations where ioctl() does. 539 * 540 * On AIX 4.1.5 (and presumably some other versions and OSes), as you 541 * perform the manual test suite in the README, if you 'bg' vi immediately 542 * after suspending it, all is well, but if you wait a few seconds, 543 * usually ioctl() will return -1, which previously caused tty_setty() to 544 * return -1, causing Rawmode() to return -1, causing Inputl() to return 545 * 0, causing bgetc() to return -1, causing readc() to set doneinp to 1, 546 * causing process() to break out of the main loop, causing tcsh to exit 547 * prematurely. 548 * 549 * If ioctl()'s errno is EAGAIN/EWOULDBLOCK ("Resource temporarily 550 * unavailable"), apparently the tty is being messed with by the OS and we 551 * need to try again. In my testing, ioctl() was never called more than 552 * twice in a row. 553 * 554 * -- Dan Harkless <dan@wave.eng.uci.edu> 555 * 556 * So, I retry all ioctl's in case others happen to fail too (christos) 557 */ 558 559#if defined(EAGAIN) && defined(EWOULDBLOCK) && (EWOULDBLOCK != EAGAIN) 560# define OKERROR(e) (((e) == EAGAIN) || ((e) == EWOULDBLOCK) || ((e) == EINTR)) 561#elif defined(EGAIN) 562# define OKERROR(e) (((e) == EAGAIN) || ((e) == EINTR)) 563#elif defined(EWOULDBLOCK) 564# define OKERROR(e) (((e) == EWOULDBLOCK) || ((e) == EINTR)) 565#else 566# define OKERROR(e) ((e) == EINTR) 567#endif 568
| 41 42#include "ed.h" 43#include "ed.term.h" 44 45int didsetty = 0; 46ttyperm_t ttylist = { 47 { 48#if defined(POSIX) || defined(TERMIO) 49 { "iflag:", ICRNL, (INLCR|IGNCR) }, 50 { "oflag:", (OPOST|ONLCR), ONLRET }, 51 { "cflag:", 0, 0 }, 52 { "lflag:", (ISIG|ICANON|ECHO|ECHOE|ECHOCTL|IEXTEN), 53 (NOFLSH|ECHONL|EXTPROC|FLUSHO|IDEFAULT) }, 54#else /* GSTTY */ 55 { "nrmal:", (ECHO|CRMOD|ANYP), (CBREAK|RAW|LCASE|VTDELAY|ALLDELAY) }, 56 { "local:", (LCRTBS|LCRTERA|LCRTKIL), (LPRTERA|LFLUSHO) }, 57#endif /* POSIX || TERMIO */ 58 { "chars:", 0, 0 }, 59 }, 60 { 61#if defined(POSIX) || defined(TERMIO) 62 { "iflag:", (INLCR|ICRNL), IGNCR }, 63 { "oflag:", (OPOST|ONLCR), ONLRET }, 64 { "cflag:", 0, 0 }, 65 { "lflag:", ISIG, 66 (NOFLSH|ICANON|ECHO|ECHOK|ECHONL|EXTPROC|IEXTEN|FLUSHO| 67 IDEFAULT) }, 68#else /* GSTTY */ 69 { "nrmal:", (CBREAK|CRMOD|ANYP), (RAW|ECHO|LCASE|VTDELAY|ALLDELAY) }, 70 { "local:", (LCRTBS|LCRTERA|LCRTKIL), (LPRTERA|LFLUSHO) }, 71#endif /* POSIX || TERMIO */ 72 { "chars:", (C_SH(C_MIN)|C_SH(C_TIME)|C_SH(C_SWTCH)|C_SH(C_DSWTCH)| 73 C_SH(C_WERASE)|C_SH(C_REPRINT)|C_SH(C_SUSP)|C_SH(C_DSUSP)| 74 C_SH(C_EOF)|C_SH(C_EOL)|C_SH(C_DISCARD)|C_SH(C_PGOFF)| 75 C_SH(C_KILL2)|C_SH(C_PAGE)|C_SH(C_STATUS)|C_SH(C_LNEXT)), 76 0 } 77 }, 78 { 79#if defined(POSIX) || defined(TERMIO) 80 { "iflag:", 0, IXON | IXOFF }, 81 { "oflag:", 0, 0 }, 82 { "cflag:", 0, 0 }, 83 { "lflag:", 0, ISIG | IEXTEN }, 84#else /* GSTTY */ 85 { "nrmal:", RAW, CBREAK }, 86 { "local:", 0, 0 }, 87#endif /* POSIX || TERMIO */ 88 { "chars:", 0, 0 }, 89 } 90}; 91 92static struct tcshmodes { 93 char *m_name; 94#ifdef SOLARIS2 95 unsigned long m_value; 96#else /* !SOLARIS2 */ 97 int m_value; 98#endif /* SOLARIS2 */ 99 int m_type; 100} modelist[] = { 101#if defined(POSIX) || defined(TERMIO) 102 103# ifdef IGNBRK 104 { "ignbrk", IGNBRK, M_INPUT }, 105# endif /* IGNBRK */ 106# ifdef BRKINT 107 { "brkint", BRKINT, M_INPUT }, 108# endif /* BRKINT */ 109# ifdef IGNPAR 110 { "ignpar", IGNPAR, M_INPUT }, 111# endif /* IGNPAR */ 112# ifdef PARMRK 113 { "parmrk", PARMRK, M_INPUT }, 114# endif /* PARMRK */ 115# ifdef INPCK 116 { "inpck", INPCK, M_INPUT }, 117# endif /* INPCK */ 118# ifdef ISTRIP 119 { "istrip", ISTRIP, M_INPUT }, 120# endif /* ISTRIP */ 121# ifdef INLCR 122 { "inlcr", INLCR, M_INPUT }, 123# endif /* INLCR */ 124# ifdef IGNCR 125 { "igncr", IGNCR, M_INPUT }, 126# endif /* IGNCR */ 127# ifdef ICRNL 128 { "icrnl", ICRNL, M_INPUT }, 129# endif /* ICRNL */ 130# ifdef IUCLC 131 { "iuclc", IUCLC, M_INPUT }, 132# endif /* IUCLC */ 133# ifdef IXON 134 { "ixon", IXON, M_INPUT }, 135# endif /* IXON */ 136# ifdef IXANY 137 { "ixany", IXANY, M_INPUT }, 138# endif /* IXANY */ 139# ifdef IXOFF 140 { "ixoff", IXOFF, M_INPUT }, 141# endif /* IXOFF */ 142# ifdef IMAXBEL 143 { "imaxbel",IMAXBEL,M_INPUT }, 144# endif /* IMAXBEL */ 145# ifdef IDELETE 146 { "idelete",IDELETE,M_INPUT }, 147# endif /* IDELETE */ 148 149# ifdef OPOST 150 { "opost", OPOST, M_OUTPUT }, 151# endif /* OPOST */ 152# ifdef OLCUC 153 { "olcuc", OLCUC, M_OUTPUT }, 154# endif /* OLCUC */ 155# ifdef ONLCR 156 { "onlcr", ONLCR, M_OUTPUT }, 157# endif /* ONLCR */ 158# ifdef OCRNL 159 { "ocrnl", OCRNL, M_OUTPUT }, 160# endif /* OCRNL */ 161# ifdef ONOCR 162 { "onocr", ONOCR, M_OUTPUT }, 163# endif /* ONOCR */ 164# ifdef ONOEOT 165 { "onoeot", ONOEOT, M_OUTPUT }, 166# endif /* ONOEOT */ 167# ifdef ONLRET 168 { "onlret", ONLRET, M_OUTPUT }, 169# endif /* ONLRET */ 170# ifdef OFILL 171 { "ofill", OFILL, M_OUTPUT }, 172# endif /* OFILL */ 173# ifdef OFDEL 174 { "ofdel", OFDEL, M_OUTPUT }, 175# endif /* OFDEL */ 176# ifdef NLDLY 177 { "nldly", NLDLY, M_OUTPUT }, 178# endif /* NLDLY */ 179# ifdef CRDLY 180 { "crdly", CRDLY, M_OUTPUT }, 181# endif /* CRDLY */ 182# ifdef TABDLY 183 { "tabdly", TABDLY, M_OUTPUT }, 184# endif /* TABDLY */ 185# ifdef XTABS 186 { "xtabs", XTABS, M_OUTPUT }, 187# endif /* XTABS */ 188# ifdef BSDLY 189 { "bsdly", BSDLY, M_OUTPUT }, 190# endif /* BSDLY */ 191# ifdef VTDLY 192 { "vtdly", VTDLY, M_OUTPUT }, 193# endif /* VTDLY */ 194# ifdef FFDLY 195 { "ffdly", FFDLY, M_OUTPUT }, 196# endif /* FFDLY */ 197# ifdef PAGEOUT 198 { "pageout",PAGEOUT,M_OUTPUT }, 199# endif /* PAGEOUT */ 200# ifdef WRAP 201 { "wrap", WRAP, M_OUTPUT }, 202# endif /* WRAP */ 203 204# ifdef CIGNORE 205 { "cignore",CIGNORE,M_CONTROL }, 206# endif /* CBAUD */ 207# ifdef CBAUD 208 { "cbaud", CBAUD, M_CONTROL }, 209# endif /* CBAUD */ 210# ifdef CSTOPB 211 { "cstopb", CSTOPB, M_CONTROL }, 212# endif /* CSTOPB */ 213# ifdef CREAD 214 { "cread", CREAD, M_CONTROL }, 215# endif /* CREAD */ 216# ifdef PARENB 217 { "parenb", PARENB, M_CONTROL }, 218# endif /* PARENB */ 219# ifdef PARODD 220 { "parodd", PARODD, M_CONTROL }, 221# endif /* PARODD */ 222# ifdef HUPCL 223 { "hupcl", HUPCL, M_CONTROL }, 224# endif /* HUPCL */ 225# ifdef CLOCAL 226 { "clocal", CLOCAL, M_CONTROL }, 227# endif /* CLOCAL */ 228# ifdef LOBLK 229 { "loblk", LOBLK, M_CONTROL }, 230# endif /* LOBLK */ 231# ifdef CIBAUD 232 { "cibaud", CIBAUD, M_CONTROL }, 233# endif /* CIBAUD */ 234# ifdef CRTSCTS 235# ifdef CCTS_OFLOW 236 { "ccts_oflow",CCTS_OFLOW,M_CONTROL }, 237# else 238 { "crtscts",CRTSCTS,M_CONTROL }, 239# endif /* CCTS_OFLOW */ 240# endif /* CRTSCTS */ 241# ifdef CRTS_IFLOW 242 { "crts_iflow",CRTS_IFLOW,M_CONTROL }, 243# endif /* CRTS_IFLOW */ 244# ifdef MDMBUF 245 { "mdmbuf", MDMBUF, M_CONTROL }, 246# endif /* MDMBUF */ 247# ifdef RCV1EN 248 { "rcv1en", RCV1EN, M_CONTROL }, 249# endif /* RCV1EN */ 250# ifdef XMT1EN 251 { "xmt1en", XMT1EN, M_CONTROL }, 252# endif /* XMT1EN */ 253 254# ifdef ISIG 255 { "isig", ISIG, M_LINED }, 256# endif /* ISIG */ 257# ifdef ICANON 258 { "icanon", ICANON, M_LINED }, 259# endif /* ICANON */ 260# ifdef XCASE 261 { "xcase", XCASE, M_LINED }, 262# endif /* XCASE */ 263# ifdef ECHO 264 { "echo", ECHO, M_LINED }, 265# endif /* ECHO */ 266# ifdef ECHOE 267 { "echoe", ECHOE, M_LINED }, 268# endif /* ECHOE */ 269# ifdef ECHOK 270 { "echok", ECHOK, M_LINED }, 271# endif /* ECHOK */ 272# ifdef ECHONL 273 { "echonl", ECHONL, M_LINED }, 274# endif /* ECHONL */ 275# ifdef NOFLSH 276 { "noflsh", NOFLSH, M_LINED }, 277# endif /* NOFLSH */ 278# ifdef TOSTOP 279 { "tostop", TOSTOP, M_LINED }, 280# endif /* TOSTOP */ 281# ifdef ECHOCTL 282 { "echoctl",ECHOCTL,M_LINED }, 283# endif /* ECHOCTL */ 284# ifdef ECHOPRT 285 { "echoprt",ECHOPRT,M_LINED }, 286# endif /* ECHOPRT */ 287# ifdef ECHOKE 288 { "echoke", ECHOKE, M_LINED }, 289# endif /* ECHOKE */ 290# ifdef DEFECHO 291 { "defecho",DEFECHO,M_LINED }, 292# endif /* DEFECHO */ 293# ifdef FLUSHO 294 { "flusho", FLUSHO, M_LINED }, 295# endif /* FLUSHO */ 296# ifdef PENDIN 297 { "pendin", PENDIN, M_LINED }, 298# endif /* PENDIN */ 299# ifdef IEXTEN 300 { "iexten", IEXTEN, M_LINED }, 301# endif /* IEXTEN */ 302# ifdef NOKERNINFO 303 { "nokerninfo",NOKERNINFO,M_LINED }, 304# endif /* NOKERNINFO */ 305# ifdef ALTWERASE 306 { "altwerase",ALTWERASE,M_LINED }, 307# endif /* ALTWERASE */ 308# ifdef EXTPROC 309 { "extproc",EXTPROC,M_LINED }, 310# endif /* EXTPROC */ 311# ifdef IDEFAULT 312 { "idefault",IDEFAULT,M_LINED }, 313# endif /* IDEFAULT */ 314 315#else /* GSTTY */ 316 317# ifdef TANDEM 318 { "tandem", TANDEM, M_CONTROL }, 319# endif /* TANDEM */ 320# ifdef CBREAK 321 { "cbreak", CBREAK, M_CONTROL }, 322# endif /* CBREAK */ 323# ifdef LCASE 324 { "lcase", LCASE, M_CONTROL }, 325# endif /* LCASE */ 326# ifdef ECHO 327 { "echo", ECHO, M_CONTROL }, 328# endif /* ECHO */ 329# ifdef CRMOD 330 { "crmod", CRMOD, M_CONTROL }, 331# endif /* CRMOD */ 332# ifdef RAW 333 { "raw", RAW, M_CONTROL }, 334# endif /* RAW */ 335# ifdef ODDP 336 { "oddp", ODDP, M_CONTROL }, 337# endif /* ODDP */ 338# ifdef EVENP 339 { "evenp", EVENP, M_CONTROL }, 340# endif /* EVENP */ 341# ifdef ANYP 342 { "anyp", ANYP, M_CONTROL }, 343# endif /* ANYP */ 344# ifdef NLDELAY 345 { "nldelay",NLDELAY,M_CONTROL }, 346# endif /* NLDELAY */ 347# ifdef TBDELAY 348 { "tbdelay",TBDELAY,M_CONTROL }, 349# endif /* TBDELAY */ 350# ifdef XTABS 351 { "xtabs", XTABS, M_CONTROL }, 352# endif /* XTABS */ 353# ifdef CRDELAY 354 { "crdelay",CRDELAY,M_CONTROL }, 355# endif /* CRDELAY */ 356# ifdef VTDELAY 357 { "vtdelay",VTDELAY,M_CONTROL }, 358# endif /* VTDELAY */ 359# ifdef BSDELAY 360 { "bsdelay",BSDELAY,M_CONTROL }, 361# endif /* BSDELAY */ 362# ifdef CRTBS 363 { "crtbs", CRTBS, M_CONTROL }, 364# endif /* CRTBS */ 365# ifdef PRTERA 366 { "prtera", PRTERA, M_CONTROL }, 367# endif /* PRTERA */ 368# ifdef CRTERA 369 { "crtera", CRTERA, M_CONTROL }, 370# endif /* CRTERA */ 371# ifdef TILDE 372 { "tilde", TILDE, M_CONTROL }, 373# endif /* TILDE */ 374# ifdef MDMBUF 375 { "mdmbuf", MDMBUF, M_CONTROL }, 376# endif /* MDMBUF */ 377# ifdef LITOUT 378 { "litout", LITOUT, M_CONTROL }, 379# endif /* LITOUT */ 380# ifdef TOSTOP 381 { "tostop", TOSTOP, M_CONTROL }, 382# endif /* TOSTOP */ 383# ifdef FLUSHO 384 { "flusho", FLUSHO, M_CONTROL }, 385# endif /* FLUSHO */ 386# ifdef NOHANG 387 { "nohang", NOHANG, M_CONTROL }, 388# endif /* NOHANG */ 389# ifdef L001000 390 { "l001000",L001000,M_CONTROL }, 391# endif /* L001000 */ 392# ifdef CRTKIL 393 { "crtkil", CRTKIL, M_CONTROL }, 394# endif /* CRTKIL */ 395# ifdef PASS8 396 { "pass8", PASS8, M_CONTROL }, 397# endif /* PASS8 */ 398# ifdef CTLECH 399 { "ctlech", CTLECH, M_CONTROL }, 400# endif /* CTLECH */ 401# ifdef PENDIN 402 { "pendin", PENDIN, M_CONTROL }, 403# endif /* PENDIN */ 404# ifdef DECCTQ 405 { "decctq", DECCTQ, M_CONTROL }, 406# endif /* DECCTQ */ 407# ifdef NOFLSH 408 { "noflsh", NOFLSH, M_CONTROL }, 409# endif /* NOFLSH */ 410 411# ifdef LCRTBS 412 { "lcrtbs", LCRTBS, M_LOCAL }, 413# endif /* LCRTBS */ 414# ifdef LPRTERA 415 { "lprtera",LPRTERA,M_LOCAL }, 416# endif /* LPRTERA */ 417# ifdef LCRTERA 418 { "lcrtera",LCRTERA,M_LOCAL }, 419# endif /* LCRTERA */ 420# ifdef LTILDE 421 { "ltilde", LTILDE, M_LOCAL }, 422# endif /* LTILDE */ 423# ifdef LMDMBUF 424 { "lmdmbuf",LMDMBUF,M_LOCAL }, 425# endif /* LMDMBUF */ 426# ifdef LLITOUT 427 { "llitout",LLITOUT,M_LOCAL }, 428# endif /* LLITOUT */ 429# ifdef LTOSTOP 430 { "ltostop",LTOSTOP,M_LOCAL }, 431# endif /* LTOSTOP */ 432# ifdef LFLUSHO 433 { "lflusho",LFLUSHO,M_LOCAL }, 434# endif /* LFLUSHO */ 435# ifdef LNOHANG 436 { "lnohang",LNOHANG,M_LOCAL }, 437# endif /* LNOHANG */ 438# ifdef LCRTKIL 439 { "lcrtkil",LCRTKIL,M_LOCAL }, 440# endif /* LCRTKIL */ 441# ifdef LPASS8 442 { "lpass8", LPASS8, M_LOCAL }, 443# endif /* LPASS8 */ 444# ifdef LCTLECH 445 { "lctlech",LCTLECH,M_LOCAL }, 446# endif /* LCTLECH */ 447# ifdef LPENDIN 448 { "lpendin",LPENDIN,M_LOCAL }, 449# endif /* LPENDIN */ 450# ifdef LDECCTQ 451 { "ldecctq",LDECCTQ,M_LOCAL }, 452# endif /* LDECCTQ */ 453# ifdef LNOFLSH 454 { "lnoflsh",LNOFLSH,M_LOCAL }, 455# endif /* LNOFLSH */ 456 457#endif /* POSIX || TERMIO */ 458# if defined(VINTR) || defined(TIOCGETC) 459 { "intr", C_SH(C_INTR), M_CHAR }, 460# endif /* VINTR */ 461# if defined(VQUIT) || defined(TIOCGETC) 462 { "quit", C_SH(C_QUIT), M_CHAR }, 463# endif /* VQUIT */ 464# if defined(VERASE) || defined(TIOCGETP) 465 { "erase", C_SH(C_ERASE), M_CHAR }, 466# endif /* VERASE */ 467# if defined(VKILL) || defined(TIOCGETP) 468 { "kill", C_SH(C_KILL), M_CHAR }, 469# endif /* VKILL */ 470# if defined(VEOF) || defined(TIOCGETC) 471 { "eof", C_SH(C_EOF), M_CHAR }, 472# endif /* VEOF */ 473# if defined(VEOL) 474 { "eol", C_SH(C_EOL), M_CHAR }, 475# endif /* VEOL */ 476# if defined(VEOL2) 477 { "eol2", C_SH(C_EOL2), M_CHAR }, 478# endif /* VEOL2 */ 479# if defined(VSWTCH) 480 { "swtch", C_SH(C_SWTCH), M_CHAR }, 481# endif /* VSWTCH */ 482# if defined(VDSWTCH) 483 { "dswtch", C_SH(C_DSWTCH), M_CHAR }, 484# endif /* VDSWTCH */ 485# if defined(VERASE2) 486 { "erase2", C_SH(C_ERASE2), M_CHAR }, 487# endif /* VERASE2 */ 488# if defined(VSTART) || defined(TIOCGETC) 489 { "start", C_SH(C_START), M_CHAR }, 490# endif /* VSTART */ 491# if defined(VSTOP) || defined(TIOCGETC) 492 { "stop", C_SH(C_STOP), M_CHAR }, 493# endif /* VSTOP */ 494# if defined(VWERASE) || defined(TIOCGLTC) 495 { "werase", C_SH(C_WERASE), M_CHAR }, 496# endif /* VWERASE */ 497# if defined(VSUSP) || defined(TIOCGLTC) 498 { "susp", C_SH(C_SUSP), M_CHAR }, 499# endif /* VSUSP */ 500# if defined(VDSUSP) || defined(TIOCGLTC) 501 { "dsusp", C_SH(C_DSUSP), M_CHAR }, 502# endif /* VDSUSP */ 503# if defined(VREPRINT) || defined(TIOCGLTC) 504 { "reprint", C_SH(C_REPRINT),M_CHAR }, 505# endif /* WREPRINT */ 506# if defined(VDISCARD) || defined(TIOCGLTC) 507 { "discard", C_SH(C_DISCARD),M_CHAR }, 508# endif /* VDISCARD */ 509# if defined(VLNEXT) || defined(TIOCGLTC) 510 { "lnext", C_SH(C_LNEXT), M_CHAR }, 511# endif /* VLNEXT */ 512# if defined(VSTATUS) || defined(TIOCGPAGE) 513 { "status", C_SH(C_STATUS), M_CHAR }, 514# endif /* VSTATUS */ 515# if defined(VPAGE) || defined(TIOCGPAGE) 516 { "page", C_SH(C_PAGE), M_CHAR }, 517# endif /* VPAGE */ 518# if defined(VPGOFF) || defined(TIOCGPAGE) 519 { "pgoff", C_SH(C_PGOFF), M_CHAR }, 520# endif /* VPGOFF */ 521# if defined(VKILL2) 522 { "kill2", C_SH(C_KILL2), M_CHAR }, 523# endif /* VKILL2 */ 524# if defined(VBRK) || defined(TIOCGETC) 525 { "brk", C_SH(C_BRK), M_CHAR }, 526# endif /* VBRK */ 527# if defined(VMIN) 528 { "min", C_SH(C_MIN), M_CHAR }, 529# endif /* VMIN */ 530# if defined(VTIME) 531 { "time", C_SH(C_TIME), M_CHAR }, 532# endif /* VTIME */ 533 { NULL, 0, -1 }, 534}; 535 536/* 537 * If EAGAIN and/or EWOULDBLOCK are defined, we can't just return -1 in all 538 * situations where ioctl() does. 539 * 540 * On AIX 4.1.5 (and presumably some other versions and OSes), as you 541 * perform the manual test suite in the README, if you 'bg' vi immediately 542 * after suspending it, all is well, but if you wait a few seconds, 543 * usually ioctl() will return -1, which previously caused tty_setty() to 544 * return -1, causing Rawmode() to return -1, causing Inputl() to return 545 * 0, causing bgetc() to return -1, causing readc() to set doneinp to 1, 546 * causing process() to break out of the main loop, causing tcsh to exit 547 * prematurely. 548 * 549 * If ioctl()'s errno is EAGAIN/EWOULDBLOCK ("Resource temporarily 550 * unavailable"), apparently the tty is being messed with by the OS and we 551 * need to try again. In my testing, ioctl() was never called more than 552 * twice in a row. 553 * 554 * -- Dan Harkless <dan@wave.eng.uci.edu> 555 * 556 * So, I retry all ioctl's in case others happen to fail too (christos) 557 */ 558 559#if defined(EAGAIN) && defined(EWOULDBLOCK) && (EWOULDBLOCK != EAGAIN) 560# define OKERROR(e) (((e) == EAGAIN) || ((e) == EWOULDBLOCK) || ((e) == EINTR)) 561#elif defined(EGAIN) 562# define OKERROR(e) (((e) == EAGAIN) || ((e) == EINTR)) 563#elif defined(EWOULDBLOCK) 564# define OKERROR(e) (((e) == EWOULDBLOCK) || ((e) == EINTR)) 565#else 566# define OKERROR(e) ((e) == EINTR) 567#endif 568
|