From 1b73e33c70d8729994778808c4895f024c71e141 Mon Sep 17 00:00:00 2001 From: yar Date: Wed, 18 Jun 2003 13:22:44 +0000 Subject: [PATCH] - Use the initial terminal mode instead of the current mode as the source of defaults for terminal device parameters. - Do duplucate code reduction and simplification enabled by the above. Reviewed by: green MFC after: 1 month --- libexec/getty/init.c | 28 +++++------ libexec/getty/main.c | 109 ++++++++++++++++++++----------------------- 2 files changed, 64 insertions(+), 73 deletions(-) diff --git a/libexec/getty/init.c b/libexec/getty/init.c index 274e418b7b42..c83a83e487c0 100644 --- a/libexec/getty/init.c +++ b/libexec/getty/init.c @@ -59,26 +59,26 @@ struct gettystrs gettystrs[] = { { "cl" }, /* screen clear characters */ { "im" }, /* initial message */ { "lm", loginmsg }, /* login message */ - { "er", &tmode.c_cc[VERASE] }, /* erase character */ - { "kl", &tmode.c_cc[VKILL] }, /* kill character */ - { "et", &tmode.c_cc[VEOF] }, /* eof chatacter (eot) */ + { "er", &omode.c_cc[VERASE] }, /* erase character */ + { "kl", &omode.c_cc[VKILL] }, /* kill character */ + { "et", &omode.c_cc[VEOF] }, /* eof chatacter (eot) */ { "pc", nullstr }, /* pad character */ { "tt" }, /* terminal type */ { "ev" }, /* enviroment */ { "lo", loginprg }, /* login program */ { "hn", hostname }, /* host name */ { "he" }, /* host name edit */ - { "in", &tmode.c_cc[VINTR] }, /* interrupt char */ - { "qu", &tmode.c_cc[VQUIT] }, /* quit char */ - { "xn", &tmode.c_cc[VSTART] }, /* XON (start) char */ - { "xf", &tmode.c_cc[VSTOP] }, /* XOFF (stop) char */ - { "bk", &tmode.c_cc[VEOL] }, /* brk char (alt \n) */ - { "su", &tmode.c_cc[VSUSP] }, /* suspend char */ - { "ds", &tmode.c_cc[VDSUSP] }, /* delayed suspend */ - { "rp", &tmode.c_cc[VREPRINT] },/* reprint char */ - { "fl", &tmode.c_cc[VDISCARD] },/* flush output */ - { "we", &tmode.c_cc[VWERASE] }, /* word erase */ - { "ln", &tmode.c_cc[VLNEXT] }, /* literal next */ + { "in", &omode.c_cc[VINTR] }, /* interrupt char */ + { "qu", &omode.c_cc[VQUIT] }, /* quit char */ + { "xn", &omode.c_cc[VSTART] }, /* XON (start) char */ + { "xf", &omode.c_cc[VSTOP] }, /* XOFF (stop) char */ + { "bk", &omode.c_cc[VEOL] }, /* brk char (alt \n) */ + { "su", &omode.c_cc[VSUSP] }, /* suspend char */ + { "ds", &omode.c_cc[VDSUSP] }, /* delayed suspend */ + { "rp", &omode.c_cc[VREPRINT] },/* reprint char */ + { "fl", &omode.c_cc[VDISCARD] },/* flush output */ + { "we", &omode.c_cc[VWERASE] }, /* word erase */ + { "ln", &omode.c_cc[VLNEXT] }, /* literal next */ { "Lo" }, /* locale for strftime() */ { "pp" }, /* ppp login program */ { "if" }, /* sysv-like 'issue' filename */ diff --git a/libexec/getty/main.c b/libexec/getty/main.c index 3e079c1e3124..4c4f0ea48771 100644 --- a/libexec/getty/main.c +++ b/libexec/getty/main.c @@ -90,7 +90,10 @@ static const char rcsid[] = #define PPP_LCP_HI 0xc0 /* LCP protocol - high byte */ #define PPP_LCP_LOW 0x21 /* LCP protocol - low byte */ -struct termios tmode, omode; +/* original mode; flags've been reset using values from */ +struct termios omode; +/* current mode */ +struct termios tmode; int crmod, digit, lower, upper; @@ -104,6 +107,7 @@ char ttyn[32]; char defent[TABBUFSIZ]; char tabent[TABBUFSIZ]; +const char *tname; char *env[128]; @@ -132,8 +136,9 @@ char partab[] = { #define puts Gputs +static void defttymode(); static void dingdong(int); -static void dogettytab(const char *); +static void dogettytab(void); static int getname(void); static void interrupt(int); static void oflush(void); @@ -145,7 +150,6 @@ static void puts(const char *); static void timeoverrun(int); static char *getline(int); static void setttymode(int); -static void setdefttymode(void); static int opentty(const char *, int); jmp_buf timeout; @@ -180,7 +184,6 @@ int main(int argc, char *argv[]) { extern char **environ; - const char *tname; int first_sleep = 1, first_time = 1; struct rlimit limit; int rval; @@ -215,10 +218,9 @@ main(int argc, char *argv[]) * that the file descriptors are already set up for us. * J. Gettys - MIT Project Athena. */ - if (argc <= 2 || strcmp(argv[2], "-") == 0) { + if (argc <= 2 || strcmp(argv[2], "-") == 0) strcpy(ttyn, ttyname(STDIN_FILENO)); - dogettytab(tname); - } else { + else { strcpy(ttyn, dev); strncat(ttyn, argv[2], sizeof(ttyn)-sizeof(dev)); if (strcmp(argv[0], "+") != 0) { @@ -226,13 +228,25 @@ main(int argc, char *argv[]) chmod(ttyn, 0600); revoke(ttyn); - /* Init modem sequence has been specified + /* + * Do the first scan through gettytab. + * Terminal mode parameters will be wrong until + * defttymode() called, but they're irrelevant for + * the initial setup of the terminal device. */ - if (IC) { + dogettytab(); + + /* + * Init or answer modem sequence has been specified. + */ + if (IC || AC) { if (!opentty(ttyn, O_RDWR|O_NONBLOCK)) exit(1); - dogettytab(tname); - setdefttymode(); + defttymode(); + setttymode(1); + } + + if (IC) { if (getty_chat(IC, CT, DC) > 0) { syslog(LOG_ERR, "modem init problem on %s", ttyn); (void)tcsetattr(STDIN_FILENO, TCSANOW, &tmode); @@ -244,10 +258,6 @@ main(int argc, char *argv[]) int i, rfds; struct timeval to; - if (!opentty(ttyn, O_RDWR|O_NONBLOCK)) - exit(1); - dogettytab(tname); - setdefttymode(); rfds = 1 << 0; /* FD_SET */ to.tv_sec = RT; to.tv_usec = 0; @@ -269,30 +279,11 @@ main(int argc, char *argv[]) } else { /* maybe blocking open */ if (!opentty(ttyn, O_RDWR | (NC ? O_NONBLOCK : 0 ))) exit(1); - dogettytab(tname); } } } - /* Start with default tty settings */ - if (tcgetattr(STDIN_FILENO, &tmode) < 0) { - syslog(LOG_ERR, "tcgetattr %s: %m", ttyn); - exit(1); - } - /* - * Don't rely on the driver too much, and initialize crucial - * things according to . Avoid clobbering - * the c_cc[] settings however, the console drivers might wish - * to leave their idea of the preferred VERASE key value - * there. - */ - tmode.c_iflag = TTYDEF_IFLAG; - tmode.c_oflag = TTYDEF_OFLAG; - tmode.c_lflag = TTYDEF_LFLAG; - tmode.c_cflag = TTYDEF_CFLAG; - tmode.c_cflag |= (NC ? CLOCAL : 0); - omode = tmode; - + defttymode(); for (;;) { /* @@ -309,12 +300,12 @@ main(int argc, char *argv[]) setttymode(0); if (AB) { tname = autobaud(); - dogettytab(tname); + dogettytab(); continue; } if (PS) { tname = portselector(); - dogettytab(tname); + dogettytab(); continue; } if (CL && *CL) @@ -428,7 +419,7 @@ main(int argc, char *argv[]) signal(SIGINT, SIG_IGN); if (NX && *NX) { tname = NX; - dogettytab(tname); + dogettytab(); } } } @@ -470,18 +461,30 @@ opentty(const char *tty, int flags) } static void -setdefttymode(void) +defttymode() { + + /* Start with default tty settings. */ if (tcgetattr(STDIN_FILENO, &tmode) < 0) { syslog(LOG_ERR, "tcgetattr %s: %m", ttyn); exit(1); } + omode = tmode; /* fill c_cc for dogettytab() */ + dogettytab(); + /* + * Don't rely on the driver too much, and initialize crucial + * things according to . Avoid clobbering + * the c_cc[] settings however, the console drivers might wish + * to leave their idea of the preferred VERASE key value + * there. + */ tmode.c_iflag = TTYDEF_IFLAG; - tmode.c_oflag = TTYDEF_OFLAG; - tmode.c_lflag = TTYDEF_LFLAG; - tmode.c_cflag = TTYDEF_CFLAG; - omode = tmode; - setttymode(1); + tmode.c_oflag = TTYDEF_OFLAG; + tmode.c_lflag = TTYDEF_LFLAG; + tmode.c_cflag = TTYDEF_CFLAG; + if (NC) + tmode.c_cflag |= CLOCAL; + omode = tmode; } static void @@ -801,11 +804,10 @@ putf(const char *cp) * Read a gettytab database entry and perform necessary quirks. */ static void -dogettytab(const char *tname) +dogettytab() { - struct termios backupmode; - /* Read the database entry */ + /* Read the database entry. */ gettable(tname, tabent); /* @@ -816,17 +818,6 @@ dogettytab(const char *tname) if (OPset || EPset || APset || NPset) OPset = EPset = APset = NPset = 1; - /* - * Fill in default values for unset capabilities. Since the - * defaults are derived from the actual tty mode, save any - * changes to the tmode and fetch it temporarily for - * setdefaults() to use. - */ - backupmode = tmode; - if (tcgetattr(STDIN_FILENO, &tmode) < 0) { - syslog(LOG_ERR, "tcgetattr %s: %m", ttyn); - exit(1); - } + /* Fill in default values for unset capabilities. */ setdefaults(); - tmode = backupmode; }