summaryrefslogtreecommitdiff
path: root/loginutils
diff options
context:
space:
mode:
authorDenis Vlasenko2006-10-23 10:17:34 +0000
committerDenis Vlasenko2006-10-23 10:17:34 +0000
commit4e70bf4359676b1ecaf658c7550d60a15ec1a02a (patch)
tree51504913d74ac02a9b4feba5bdf7716a8cfe4760 /loginutils
parent50e77e1cc12d18716d1ab371ba4b145706e5192d (diff)
downloadbusybox-4e70bf4359676b1ecaf658c7550d60a15ec1a02a.zip
busybox-4e70bf4359676b1ecaf658c7550d60a15ec1a02a.tar.gz
getty: conditionally disable handling of all-caps terminals.
Diffstat (limited to 'loginutils')
-rw-r--r--loginutils/getty.c82
1 files changed, 25 insertions, 57 deletions
diff --git a/loginutils/getty.c b/loginutils/getty.c
index ebca480..9e7cb7a 100644
--- a/loginutils/getty.c
+++ b/loginutils/getty.c
@@ -48,6 +48,9 @@ extern void updwtmp(const char *filename, const struct utmp *ut);
* and for line editing at the same time.
*/
+/* I doubt there are systems which still need this */
+#undef HANDLE_ALLCAPS
+
#define _PATH_LOGIN "/bin/login"
/* If ISSUE is not defined, agetty will never display the contents of the
@@ -133,11 +136,13 @@ static const char opt_string[] = "I:LH:f:hil:mt:wn";
/* Storage for things detected while the login name was read. */
struct chardata {
- int erase; /* erase character */
- int kill; /* kill character */
- int eol; /* end-of-line character */
- int parity; /* what parity did we see */
- int capslock; /* upper case without lower case */
+ unsigned char erase; /* erase character */
+ unsigned char kill; /* kill character */
+ unsigned char eol; /* end-of-line character */
+ unsigned char parity; /* what parity did we see */
+#ifdef HANDLE_ALLCAPS
+ unsigned char capslock; /* upper case without lower case */
+#endif
};
/* Initial values for the above. */
@@ -147,54 +152,10 @@ static const struct chardata init_chardata = {
DEF_KILL, /* default kill character */
13, /* default eol char */
0, /* space parity */
+#ifdef HANDLE_ALLCAPS
0, /* no capslock */
-};
-
-#if 0
-struct Speedtab {
- long speed;
- int code;
-};
-
-static const struct Speedtab speedtab[] = {
- {50, B50},
- {75, B75},
- {110, B110},
- {134, B134},
- {150, B150},
- {200, B200},
- {300, B300},
- {600, B600},
- {1200, B1200},
- {1800, B1800},
- {2400, B2400},
- {4800, B4800},
- {9600, B9600},
-#ifdef B19200
- {19200, B19200},
-#endif
-#ifdef B38400
- {38400, B38400},
-#endif
-#ifdef EXTA
- {19200, EXTA},
-#endif
-#ifdef EXTB
- {38400, EXTB},
#endif
-#ifdef B57600
- {57600, B57600},
-#endif
-#ifdef B115200
- {115200, B115200},
-#endif
-#ifdef B230400
- {230400, B230400},
-#endif
- {0, 0},
};
-#endif
-
#ifdef SYSV_STYLE
#ifdef CONFIG_FEATURE_UTMP
@@ -211,7 +172,7 @@ static char *fakehost = NULL;
#ifdef DEBUGGING
#define debug(s) fprintf(dbf,s); fflush(dbf)
#define DEBUGTERM "/dev/ttyp0"
-FILE *dbf;
+static FILE *dbf;
#else
#define debug(s) /* nothing */
#endif
@@ -415,7 +376,7 @@ static void termio_init(struct termio *tp, int speed, struct options *op)
* Initial termio settings: 8-bit characters, raw-mode, blocking i/o.
* Special characters are set after we have read the login name; all
* reads will be done in raw mode anyway. Errors will be dealt with
- * lateron.
+ * later on.
*/
#ifdef __linux__
/* flush input and output queues, important for modems! */
@@ -474,7 +435,7 @@ static void auto_baud(struct termio *tp)
/*
* Use 7-bit characters, don't block if input queue is empty. Errors will
- * be dealt with lateron.
+ * be dealt with later on.
*/
iflag = tp->c_iflag;
@@ -503,7 +464,7 @@ static void auto_baud(struct termio *tp)
}
}
}
- /* Restore terminal settings. Errors will be dealt with lateron. */
+ /* Restore terminal settings. Errors will be dealt with later on. */
tp->c_iflag = iflag;
tp->c_cc[VMIN] = vmin;
@@ -525,12 +486,13 @@ static void next_speed(struct termio *tp, struct options *op)
/* do_prompt - show login prompt, optionally preceded by /etc/issue contents */
static void do_prompt(struct options *op, struct termio *tp)
{
-#ifdef ISSUE /* optional: show /etc/issue */
+#ifdef ISSUE
print_login_issue(op->issue, op->tty);
#endif
print_login_prompt();
}
+#ifdef HANDLE_ALLCAPS
/* caps_lock - string contains upper case without lower case */
/* returns 1 if true, 0 if false */
static int caps_lock(const char *s)
@@ -540,6 +502,7 @@ static int caps_lock(const char *s)
return 0;
return 1;
}
+#endif
#define logname bb_common_bufsiz1
/* get_logname - get user name, establish parity, speed, erase, kill, eol */
@@ -551,7 +514,7 @@ static char *get_logname(struct options *op, struct chardata *cp, struct termio
char ascval; /* low 7 bits of input character */
int bits; /* # of "1" bits per character */
int mask; /* mask with 1 bit up */
- static const char *const erase[] = { /* backspace-space-backspace */
+ static const char erase[][3] = { /* backspace-space-backspace */
"\010\040\010", /* space parity */
"\010\040\010", /* odd parity */
"\210\240\210", /* even parity */
@@ -601,7 +564,8 @@ static char *get_logname(struct options *op, struct chardata *cp, struct termio
for (bits = 1, mask = 1; mask & 0177; mask <<= 1)
if (mask & ascval)
bits++; /* count "1" bits */
- cp->parity |= ((bits & 1) ? 1 : 2);
+ /* ... |= 2 - even, 1 - odd */
+ cp->parity |= 2 - (bits & 1);
}
/* Do erase, kill and end-of-line processing. */
@@ -645,12 +609,14 @@ static char *get_logname(struct options *op, struct chardata *cp, struct termio
}
/* Handle names with upper case and no lower case. */
+#ifdef HANDLE_ALLCAPS
cp->capslock = caps_lock(logname);
if (cp->capslock) {
for (bp = logname; *bp; bp++)
if (isupper(*bp))
*bp = tolower(*bp); /* map name to lower case */
}
+#endif
return logname;
}
@@ -698,11 +664,13 @@ static void termio_final(struct options *op, struct termio *tp, struct chardata
}
/* Account for upper case without lower case. */
+#ifdef HANDLE_ALLCAPS
if (cp->capslock) {
tp->c_iflag |= IUCLC;
tp->c_lflag |= XCASE;
tp->c_oflag |= OLCUC;
}
+#endif
/* Optionally enable hardware flow control */
#ifdef CRTSCTS