diff options
author | gildea <empty> | 1995-06-08 21:08:14 +0000 |
---|---|---|
committer | gildea <empty> | 1995-06-08 21:08:14 +0000 |
commit | 4c05b4a8267845e6db445270eeee0c04243737d4 (patch) | |
tree | fb8f478258099c5b183bd4cbf79d64e689ff8ff2 /xc/programs | |
parent | 2c446ba71b4a0b4e598f806f366f572b430cffbc (diff) |
Do tty setting correctly on SVR4-like machines. XBUGs #7051, #7085.
Diffstat (limited to 'xc/programs')
-rw-r--r-- | xc/programs/xterm/main.c | 292 |
1 files changed, 216 insertions, 76 deletions
diff --git a/xc/programs/xterm/main.c b/xc/programs/xterm/main.c index 4057fc0a5..e4b34f4f2 100644 --- a/xc/programs/xterm/main.c +++ b/xc/programs/xterm/main.c @@ -1,5 +1,5 @@ #ifndef lint -static char *rid="$XConsortium: main.c,v 1.228 95/04/05 19:58:50 kaleb Exp gildea $"; +static char *rid="$XConsortium: main.c,v 1.229 95/05/24 22:04:05 gildea Exp gildea $"; #endif /* lint */ /* @@ -191,6 +191,7 @@ static Bool IsPts = False; #define HAS_BSD_GROUPS #define USE_SYSV_UTMP #define HAS_UTMP_UT_HOST +#define USE_POSIX_WAIT #include <sys/ptyio.h> #endif /* hpux */ #ifdef sgi @@ -403,6 +404,41 @@ static struct jtchars d_jtc = { #endif /* sony */ #endif /* USE_SYSV_TERMIO */ +/* allow use of system default characters if defined and reasonable */ +#ifndef CEOF +#define CEOF ('D'&037) +#endif +#ifndef CSUSP +#define CSUSP ('Z'&037) +#endif +#ifndef CQUIT +#define CQUIT ('\\'&037) +#endif +#ifndef CEOL +#define CEOL 0 +#endif +#ifndef CSWTCH +#define CSWTCH 0 +#endif +#ifndef CLNEXT +#define CLNEXT ('V'&037) +#endif +#ifndef CWERASE +#define CWERASE ('W'&037) +#endif +#ifndef CRPRNT +#define CRPRNT ('R'&037) +#endif +#ifndef CFLUSH +#define CFLUSH ('O'&037) +#endif +#ifndef CSTOP +#define CSTOP ('S'&037) +#endif +#ifndef CSTART +#define CSTART ('Q'&037) +#endif + static int parse_tty_modes (); /* * SYSV has the termio.c_cc[V] and ltchars; BSD has tchars and ltchars; @@ -888,15 +924,17 @@ char **argv; ** of the various terminal structures (which may change from ** implementation to implementation). */ -#if defined(macII) || defined(ATT) || defined(CRAY) /* { */ d_tio.c_iflag = ICRNL|IXON; d_tio.c_oflag = OPOST|ONLCR|TAB3; +#if defined(macII) || defined(ATT) || defined(CRAY) /* { */ d_tio.c_cflag = B9600|CS8|CREAD|PARENB|HUPCL; -#ifndef sgi /* { */ d_tio.c_lflag = ISIG|ICANON|ECHO|ECHOE|ECHOK; -#else /* }{ */ - d_tio.c_lflag = ISIG|ICANON|ECHO|ECHOE|ECHOK|ECHOKE; -#endif /* } */ +#ifdef ECHOKE + d_tio.c_lflag |= ECHOKE|IEXTEN; +#endif +#ifdef ECHOCTL + d_tio.c_lflag |= ECHOCTL|IEXTEN; +#endif #ifndef USE_TERMIOS /* { */ d_tio.c_line = 0; @@ -914,73 +952,83 @@ char **argv; #ifdef USE_TERMIOS /* { */ d_tio.c_cc[VSUSP] = CSUSP; d_tio.c_cc[VDSUSP] = CDSUSP; - d_tio.c_cc[VREPRINT] = CNUL; - d_tio.c_cc[VDISCARD] = CNUL; - d_tio.c_cc[VWERASE] = CNUL; - d_tio.c_cc[VLNEXT] = CNUL; + d_tio.c_cc[VREPRINT] = CRPRNT; + d_tio.c_cc[VDISCARD] = CFLUSH; + d_tio.c_cc[VWERASE] = CWERASE; + d_tio.c_cc[VLNEXT] = CLNEXT; #endif /* } */ #ifdef TIOCSLTC /* { */ d_ltc.t_suspc = CSUSP; /* t_suspc */ d_ltc.t_dsuspc = CDSUSP; /* t_dsuspc */ - d_ltc.t_rprntc = 0; /* reserved...*/ - d_ltc.t_flushc = 0; - d_ltc.t_werasc = 0; - d_ltc.t_lnextc = 0; + d_ltc.t_rprntc = CRPRNT; + d_ltc.t_flushc = CFLUSH; + d_ltc.t_werasc = CWERASE; + d_ltc.t_lnextc = CLNEXT; #endif /* } TIOCSLTC */ #ifdef TIOCLSET /* { */ d_lmode = 0; #endif /* } TIOCLSET */ #else /* }{ else !macII, ATT, CRAY */ - d_tio.c_iflag = ICRNL|IXON; - d_tio.c_oflag = OPOST|ONLCR|TAB3; #ifdef BAUD_0 /* { */ d_tio.c_cflag = CS8|CREAD|PARENB|HUPCL; #else /* }{ !BAUD_0 */ d_tio.c_cflag = B9600|CS8|CREAD|PARENB|HUPCL; #endif /* } !BAUD_0 */ -#ifndef sgi /* { */ d_tio.c_lflag = ISIG|ICANON|ECHO|ECHOE|ECHOK; +#ifdef ECHOKE + d_tio.c_lflag |= ECHOKE|IEXTEN; +#endif +#ifdef ECHOCTL + d_tio.c_lflag |= ECHOCTL|IEXTEN; +#endif +#ifdef NTTYDISC + d_tio.c_line = NTTYDISC; +#else d_tio.c_line = 0; -#else /* }{ sgi */ - d_tio.c_lflag = ISIG|ICANON|ECHO|ECHOE|ECHOK|ECHOKE; +#endif +#ifdef sgi d_tio.c_cflag &= ~(HUPCL|PARENB); d_tio.c_iflag |= BRKINT|ISTRIP|IGNPAR; - d_tio.c_line = NTTYDISC; -#endif /* } sgi */ -#ifndef sgi /* { */ -#ifndef linux /* { */ - d_tio.c_cc[VINTR] = 0x7f; /* DEL */ - d_tio.c_cc[VERASE] = '#'; /* '#' */ - d_tio.c_cc[VKILL] = '@'; /* '@' */ -#else /* }{ linux */ +#endif d_tio.c_cc[VINTR] = 'C' & 0x3f; /* '^C' */ d_tio.c_cc[VERASE] = 0x7f; /* DEL */ d_tio.c_cc[VKILL] = 'U' & 0x3f; /* '^U' */ -#endif /* } linux */ - d_tio.c_cc[VQUIT] = '\\' & 0x3f; /* '^\' */ - d_tio.c_cc[VEOF] = 'D' & 0x3f; /* '^D' */ - d_tio.c_cc[VEOL] = '@' & 0x3f; /* '^@' */ -#else /* }{ sgi */ - d_tio.c_cc[VINTR] = CINTR; /* DEL */ - d_tio.c_cc[VQUIT] = CQUIT; /* '^\' */ - d_tio.c_cc[VERASE] = CERASE; /* '#' */ - d_tio.c_cc[VKILL] = CKILL; /* '@' */ - d_tio.c_cc[VEOF] = CEOF; /* '^D' */ - d_tio.c_cc[VEOL] = CNUL; /* '^@' */ + d_tio.c_cc[VQUIT] = CQUIT; /* '^\' */ + d_tio.c_cc[VEOF] = CEOF; /* '^D' */ + d_tio.c_cc[VEOL] = CEOL; /* '^@' */ +#ifdef VSWTCH d_tio.c_cc[VSWTCH] = CSWTCH; /* usually '^Z' */ - d_tio.c_cc[VEOL2] = CNUL; +#endif +#ifdef VLNEXT d_tio.c_cc[VLNEXT] = CLNEXT; +#endif +#ifdef VWERASE d_tio.c_cc[VWERASE] = CWERASE; +#endif +#ifdef VREPRINT + d_tio.c_cc[VREPRINT] = CRPRNT; +#endif +#ifdef VRPRNT d_tio.c_cc[VRPRNT] = CRPRNT; +#endif +#ifdef VDISCARD + d_tio.c_cc[VDISCARD] = CFLUSH; +#endif +#ifdef VFLUSHO d_tio.c_cc[VFLUSHO] = CFLUSH; +#endif +#ifdef VSTOP d_tio.c_cc[VSTOP] = CSTOP; +#endif +#ifdef VSTART d_tio.c_cc[VSTART] = CSTART; +#endif +#ifdef VSUSP d_tio.c_cc[VSUSP] = CSUSP; +#endif +#ifdef VDSUSP d_tio.c_cc[VDSUSP] = CDSUSP; -#endif /* } sgi */ -#ifdef VSWTCH /* { */ - d_tio.c_cc[VSWTCH] = '@' & 0x3f; /* '^@' */ -#endif /* } VSWTCH */ +#endif /* now, try to inherit tty settings */ { int i; @@ -994,20 +1042,42 @@ char **argv; d_tio.c_cc[VKILL] = deftio.c_cc[VKILL]; d_tio.c_cc[VEOF] = deftio.c_cc[VEOF]; d_tio.c_cc[VEOL] = deftio.c_cc[VEOL]; -#ifdef VSWTCH /* { */ +#ifdef VSWTCH d_tio.c_cc[VSWTCH] = deftio.c_cc[VSWTCH]; -#endif /* } VSWTCH */ -#ifdef sgi /* { */ +#endif +#ifdef VEOL2 d_tio.c_cc[VEOL2] = deftio.c_cc[VEOL2]; +#endif +#ifdef VLNEXT d_tio.c_cc[VLNEXT] = deftio.c_cc[VLNEXT]; +#endif +#ifdef VWERASE d_tio.c_cc[VWERASE] = deftio.c_cc[VWERASE]; +#endif +#ifdef VREPRINT + d_tio.c_cc[VREPRINT] = deftio.c_cc[VREPRINT]; +#endif +#ifdef VRPRNT d_tio.c_cc[VRPRNT] = deftio.c_cc[VRPRNT]; +#endif +#ifdef VDISCARD + d_tio.c_cc[VDISCARD] = deftio.c_cc[VDISCARD]; +#endif +#ifdef VFLUSHO d_tio.c_cc[VFLUSHO] = deftio.c_cc[VFLUSHO]; +#endif +#ifdef VSTOP d_tio.c_cc[VSTOP] = deftio.c_cc[VSTOP]; +#endif +#ifdef VSTART d_tio.c_cc[VSTART] = deftio.c_cc[VSTART]; +#endif +#ifdef VSUSP d_tio.c_cc[VSUSP] = deftio.c_cc[VSUSP]; +#endif +#ifdef VDSUSP d_tio.c_cc[VDSUSP] = deftio.c_cc[VDSUSP]; -#endif /* } sgi */ +#endif break; } } @@ -1021,11 +1091,7 @@ char **argv; d_ltc.t_lnextc = '\377'; #endif /* } TIOCSLTC */ #ifdef USE_TERMIOS /* { */ -#ifndef linux /* { */ - d_tio.c_cc[VSUSP] = '\000'; -#else /* }{ linux */ - d_tio.c_cc[VSUSP] = 'Z' & 0x3f; -#endif /* } linux */ + d_tio.c_cc[VSUSP] = CSUSP; d_tio.c_cc[VDSUSP] = '\000'; d_tio.c_cc[VREPRINT] = '\377'; d_tio.c_cc[VDISCARD] = '\377'; @@ -1590,6 +1656,12 @@ SIGNAL_T hungtty(i) SIGNAL_RETURN; } +/* + * declared outside USE_HANDSHAKE so HsSysError() callers can use + */ +static int pc_pipe[2]; /* this pipe is used for parent to child transfer */ +static int cp_pipe[2]; /* this pipe is used for child to parent transfer */ + #ifdef USE_HANDSHAKE typedef enum { /* c == child, p == parent */ PTY_BAD, /* c->p: can't open pty slave for some reason */ @@ -1635,9 +1707,6 @@ int error; exit(error); } -static int pc_pipe[2]; /* this pipe is used for parent to child transfer */ -static int cp_pipe[2]; /* this pipe is used for child to parent transfer */ - void first_map_occurred () { handshake_t handshake; @@ -1655,11 +1724,19 @@ void first_map_occurred () /* * temporary hack to get xterm working on att ptys */ +void +HsSysError(pf, error) + int pf; + int error; +{ + fprintf(stderr, "%s: fatal pty error %d (errno=%d) on tty %s\n", + xterm_name, error, errno, ttydev); + exit(error); +} void first_map_occurred () { return; } -#define HsSysError(a,b) #endif /* USE_HANDSHAKE else !USE_HANDSHAKE */ @@ -2201,15 +2278,55 @@ spawn () tio.c_cflag &= ~(CBAUD); tio.c_cflag |= B9600; #endif /* !BAUD_0 */ + tio.c_cflag &= ~CSIZE; + if (screen->input_eight_bits) + tio.c_cflag |= CS8; + else + tio.c_cflag |= CS7; /* enable signals, canonical processing (erase, kill, etc), ** echo */ - tio.c_lflag |= ISIG|ICANON|ECHO; - /* reset EOL to defalult value */ - tio.c_cc[VEOL] = '@' & 0x3f; /* '^@' */ + tio.c_lflag |= ISIG|ICANON|ECHO|ECHOE|ECHOK; +#ifdef ECHOKE + tio.c_lflag |= ECHOKE|IEXTEN; +#endif +#ifdef ECHOCTL + tio.c_lflag |= ECHOCTL|IEXTEN; +#endif + /* reset EOL to default value */ + tio.c_cc[VEOL] = CEOL; /* '^@' */ /* certain shells (ksh & csh) change EOF as well */ - tio.c_cc[VEOF] = 'D' & 0x3f; /* '^D' */ - + tio.c_cc[VEOF] = CEOF; /* '^D' */ +#ifdef VLNEXT + tio.c_cc[VLNEXT] = CLNEXT; +#endif +#ifdef VWERASE + tio.c_cc[VWERASE] = CWERASE; +#endif +#ifdef VREPRINT + tio.c_cc[VREPRINT] = CRPRNT; +#endif +#ifdef VRPRNT + tio.c_cc[VRPRNT] = CRPRNT; +#endif +#ifdef VDISCARD + tio.c_cc[VDISCARD] = CFLUSH; +#endif +#ifdef VFLUSHO + tio.c_cc[VFLUSHO] = CFLUSH; +#endif +#ifdef VSTOP + tio.c_cc[VSTOP] = CSTOP; +#endif +#ifdef VSTART + tio.c_cc[VSTART] = CSTART; +#endif +#ifdef VSUSP + tio.c_cc[VSUSP] = CSUSP; +#endif +#ifdef VDSUSP + tio.c_cc[VDSUSP] = CDSUSP; +#endif #define TMODE(ind,var) if (ttymodelist[ind].set) var = ttymodelist[ind].value; if (override_tty_modes) { /* sysv-specific */ @@ -2220,32 +2337,50 @@ spawn () TMODE (XTTYMODE_eof, tio.c_cc[VEOF]); TMODE (XTTYMODE_eol, tio.c_cc[VEOL]); #ifdef VSWTCH - TMODE (XTTYMODE_swtch, d_tio.c_cc[VSWTCH]); + TMODE (XTTYMODE_swtch, tio.c_cc[VSWTCH]); #endif -#ifdef TIOCSLTC - /* both SYSV and BSD have ltchars */ - TMODE (XTTYMODE_susp, ltc.t_suspc); - TMODE (XTTYMODE_dsusp, ltc.t_dsuspc); - TMODE (XTTYMODE_rprnt, ltc.t_rprntc); - TMODE (XTTYMODE_flush, ltc.t_flushc); - TMODE (XTTYMODE_weras, ltc.t_werasc); - TMODE (XTTYMODE_lnext, ltc.t_lnextc); -#endif -#ifdef sgi +#ifdef VSUSP TMODE (XTTYMODE_susp, tio.c_cc[VSUSP]); +#endif +#ifdef VDSUSP TMODE (XTTYMODE_dsusp, tio.c_cc[VDSUSP]); +#endif +#ifdef VREPRINT + TMODE (XTTYMODE_rprnt, tio.c_cc[VREPRINT]); +#endif +#ifdef VRPRNT TMODE (XTTYMODE_rprnt, tio.c_cc[VRPRNT]); +#endif +#ifdef VDISCARD + TMODE (XTTYMODE_flush, tio.c_cc[VDISCARD]); +#endif +#ifdef VFLUSHO TMODE (XTTYMODE_flush, tio.c_cc[VFLUSHO]); +#endif +#ifdef VWERASE TMODE (XTTYMODE_weras, tio.c_cc[VWERASE]); +#endif +#ifdef VLNEXT TMODE (XTTYMODE_lnext, tio.c_cc[VLNEXT]); +#endif +#ifdef VSTART TMODE (XTTYMODE_start, tio.c_cc[VSTART]); +#endif +#ifdef VSTOP TMODE (XTTYMODE_stop, tio.c_cc[VSTOP]); #endif +#ifdef TIOCSLTC + /* both SYSV and BSD have ltchars */ + TMODE (XTTYMODE_susp, ltc.t_suspc); + TMODE (XTTYMODE_dsusp, ltc.t_dsuspc); + TMODE (XTTYMODE_rprnt, ltc.t_rprntc); + TMODE (XTTYMODE_flush, ltc.t_flushc); + TMODE (XTTYMODE_weras, ltc.t_werasc); + TMODE (XTTYMODE_lnext, ltc.t_lnextc); +#endif } #undef TMODE - if (ioctl (tty, TCSETA, &tio) == -1) - HsSysError(cp_pipe[1], ERROR_TIOCSETP); #ifdef TIOCSLTC if (ioctl (tty, TIOCSLTC, <c) == -1) HsSysError(cp_pipe[1], ERROR_TIOCSETC); @@ -2254,6 +2389,8 @@ spawn () if (ioctl (tty, TIOCLSET, (char *)&lmode) == -1) HsSysError(cp_pipe[1], ERROR_TIOCLSET); #endif /* TIOCLSET */ + if (ioctl (tty, TCSETA, &tio) == -1) + HsSysError(cp_pipe[1], ERROR_TIOCSETP); #else /* USE_SYSV_TERMIO */ sg.sg_flags &= ~(ALLDELAY | XTABS | CBREAK | RAW); sg.sg_flags |= ECHO | CRMOD; @@ -2262,11 +2399,13 @@ spawn () sg.sg_ospeed = B9600; /* reset t_brkc to default value */ tc.t_brkc = -1; -#ifdef sony +#ifdef LPASS8 if (screen->input_eight_bits) lmode |= LPASS8; else lmode &= ~(LPASS8); +#endif +#ifdef sony jmode &= ~KM_KANJI; #endif /* sony */ @@ -2525,7 +2664,8 @@ spawn () XDisplayString (screen->display), sizeof(utmp.ut_host)); #endif - time(&utmp.ut_time); + /* cast needed on Ultrix 4.4 */ + time((Time_t*)&utmp.ut_time); lseek(i, (long)(tslot * sizeof(struct utmp)), 0); write(i, (char *)&utmp, sizeof(struct utmp)); close(i); |