summaryrefslogtreecommitdiffstats
path: root/libexec
diff options
context:
space:
mode:
authoryar <yar@FreeBSD.org>2003-06-10 18:30:41 +0000
committeryar <yar@FreeBSD.org>2003-06-10 18:30:41 +0000
commit957fe1b56ff09b44509d20d61fc796c61fcb85c7 (patch)
treedb199664293b0f1afc4dc9f25795697dabcaca02 /libexec
parente5d76875b99cb9f5bb9a44d36ac897da12f41439 (diff)
downloadFreeBSD-src-957fe1b56ff09b44509d20d61fc796c61fcb85c7.zip
FreeBSD-src-957fe1b56ff09b44509d20d61fc796c61fcb85c7.tar.gz
Read gettytab(5) soon enough to fill in all necessary values.
Re-read gettytab(5) only if needed. This fixes bugs introduced as long ago as in getty/main.c rev.1.15. PR: bin/18181 MFC after: 1 month
Diffstat (limited to 'libexec')
-rw-r--r--libexec/getty/gettytab.h1
-rw-r--r--libexec/getty/main.c55
2 files changed, 40 insertions, 16 deletions
diff --git a/libexec/getty/gettytab.h b/libexec/getty/gettytab.h
index 1b95bf9..e8b4143 100644
--- a/libexec/getty/gettytab.h
+++ b/libexec/getty/gettytab.h
@@ -170,6 +170,7 @@ struct gettyflags {
#define AB gettyflags[19].value
#define DX gettyflags[20].value
#define NP gettyflags[21].value
+#define NPset gettyflags[21].set
#define MB gettyflags[22].value
#define HW gettyflags[23].value
#define NC gettyflags[24].value
diff --git a/libexec/getty/main.c b/libexec/getty/main.c
index 0eaf0a4..a20dd73 100644
--- a/libexec/getty/main.c
+++ b/libexec/getty/main.c
@@ -133,6 +133,7 @@ char partab[] = {
#define puts Gputs
static void dingdong(int);
+static void dogettytab(const char *);
static int getname(void);
static void interrupt(int);
static void oflush(void);
@@ -143,8 +144,8 @@ static void putpad(const char *);
static void puts(const char *);
static void timeoverrun(int);
static char *getline(int);
-static void setttymode(const char *, int);
-static void setdefttymode(const char *);
+static void setttymode(int);
+static void setdefttymode(void);
static int opentty(const char *, int);
jmp_buf timeout;
@@ -204,8 +205,10 @@ main(int argc, char *argv[])
gettable("default", defent);
gendefaults();
tname = "default";
- if (argc > 1)
+ if (argc > 1) {
tname = argv[1];
+ dogettytab(tname);
+ }
/*
* The following is a work around for vhangup interactions
@@ -224,14 +227,12 @@ main(int argc, char *argv[])
chmod(ttyn, 0600);
revoke(ttyn);
- gettable(tname, tabent);
-
/* Init modem sequence has been specified
*/
if (IC) {
if (!opentty(ttyn, O_RDWR|O_NONBLOCK))
exit(1);
- setdefttymode(tname);
+ setdefttymode();
if (getty_chat(IC, CT, DC) > 0) {
syslog(LOG_ERR, "modem init problem on %s", ttyn);
(void)tcsetattr(STDIN_FILENO, TCSANOW, &tmode);
@@ -245,7 +246,7 @@ main(int argc, char *argv[])
if (!opentty(ttyn, O_RDWR|O_NONBLOCK))
exit(1);
- setdefttymode(tname);
+ setdefttymode();
rfds = 1 << 0; /* FD_SET */
to.tv_sec = RT;
to.tv_usec = 0;
@@ -303,13 +304,15 @@ main(int argc, char *argv[])
}
first_sleep = 0;
- setttymode(tname, 0);
+ setttymode(0);
if (AB) {
tname = autobaud();
+ dogettytab(tname);
continue;
}
if (PS) {
tname = portselector();
+ dogettytab(tname);
continue;
}
if (CL && *CL)
@@ -421,8 +424,10 @@ main(int argc, char *argv[])
alarm(0);
signal(SIGALRM, SIG_DFL);
signal(SIGINT, SIG_IGN);
- if (NX && *NX)
+ if (NX && *NX) {
tname = NX;
+ dogettytab(tname);
+ }
}
}
@@ -463,7 +468,7 @@ opentty(const char *tty, int flags)
}
static void
-setdefttymode(const char *tname)
+setdefttymode(void)
{
if (tcgetattr(STDIN_FILENO, &tmode) < 0) {
syslog(LOG_ERR, "tcgetattr %s: %m", ttyn);
@@ -474,18 +479,14 @@ setdefttymode(const char *tname)
tmode.c_lflag = TTYDEF_LFLAG;
tmode.c_cflag = TTYDEF_CFLAG;
omode = tmode;
- setttymode(tname, 1);
+ setttymode(1);
}
static void
-setttymode(const char *tname, int raw)
+setttymode(int raw)
{
int off = 0;
- gettable(tname, tabent);
- if (OPset || EPset || APset)
- APset = OPset = EPset = 1;
- setdefaults();
(void)tcflush(STDIN_FILENO, TCIOFLUSH); /* clear out the crap */
ioctl(STDIN_FILENO, FIONBIO, &off); /* turn off non-blocking mode */
ioctl(STDIN_FILENO, FIOASYNC, &off); /* ditto for async mode */
@@ -793,3 +794,25 @@ putf(const char *cp)
cp++;
}
}
+
+/*
+ * Read a gettytab database entry and perform necessary quirks.
+ */
+static void
+dogettytab(const char *tname)
+{
+
+ /* Read the database entry */
+ gettable(tname, tabent);
+
+ /*
+ * Avoid inheriting the parity values from the default entry
+ * if any of them is set in the current entry.
+ * Mixing different parity settings is unreasonable.
+ */
+ if (OPset || EPset || APset || NPset)
+ OPset = EPset = APset = NPset = 1;
+
+ /* Fill in default values for unset capabilities */
+ setdefaults();
+}
OpenPOWER on IntegriCloud