init,loginutils: termios portability fixes

Signed-off-by: Jeremie Koenig <jk@jk.fr.eu.org>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Jeremie Koenig 2010-05-27 15:37:32 +02:00 committed by Denys Vlasenko
parent 1d7266d3b5
commit f812eace18
4 changed files with 31 additions and 17 deletions

View File

@ -14,11 +14,19 @@
#include <paths.h> #include <paths.h>
#include <sys/reboot.h> #include <sys/reboot.h>
#include <sys/resource.h> #include <sys/resource.h>
#ifdef __linux__
#include <linux/vt.h> #include <linux/vt.h>
#endif
#if ENABLE_FEATURE_UTMP #if ENABLE_FEATURE_UTMP
# include <utmp.h> /* DEAD_PROCESS */ # include <utmp.h> /* DEAD_PROCESS */
#endif #endif
/* Used only for sanitizing purposes in set_sane_term() below. On systems where
* the baud rate is stored in a separate field, we can safely disable them. */
#ifndef CBAUD
# define CBAUD 0
# define CBAUDEX 0
#endif
/* Was a CONFIG_xxx option. A lot of people were building /* Was a CONFIG_xxx option. A lot of people were building
* not fully functional init by switching it on! */ * not fully functional init by switching it on! */
@ -166,7 +174,9 @@ static void message(int where, const char *fmt, ...)
static void console_init(void) static void console_init(void)
{ {
#ifdef VT_OPENQRY
int vtno; int vtno;
#endif
char *s; char *s;
s = getenv("CONSOLE"); s = getenv("CONSOLE");
@ -190,6 +200,7 @@ static void console_init(void)
} }
s = getenv("TERM"); s = getenv("TERM");
#ifdef VT_OPENQRY
if (ioctl(STDIN_FILENO, VT_OPENQRY, &vtno) != 0) { if (ioctl(STDIN_FILENO, VT_OPENQRY, &vtno) != 0) {
/* Not a linux terminal, probably serial console. /* Not a linux terminal, probably serial console.
* Force the TERM setting to vt102 * Force the TERM setting to vt102
@ -198,7 +209,9 @@ static void console_init(void)
putenv((char*)"TERM=vt102"); putenv((char*)"TERM=vt102");
if (!ENABLE_FEATURE_INIT_SYSLOG) if (!ENABLE_FEATURE_INIT_SYSLOG)
log_console = NULL; log_console = NULL;
} else if (!s) } else
#endif
if (!s)
putenv((char*)"TERM=linux"); putenv((char*)"TERM=linux");
} }
@ -220,8 +233,10 @@ static void set_sane_term(void)
tty.c_cc[VSTOP] = 19; /* C-s */ tty.c_cc[VSTOP] = 19; /* C-s */
tty.c_cc[VSUSP] = 26; /* C-z */ tty.c_cc[VSUSP] = 26; /* C-z */
#ifdef __linux__
/* use line discipline 0 */ /* use line discipline 0 */
tty.c_line = 0; tty.c_line = 0;
#endif
/* Make it be sane */ /* Make it be sane */
tty.c_cflag &= CBAUD | CBAUDEX | CSIZE | CSTOPB | PARENB | PARODD; tty.c_cflag &= CBAUD | CBAUDEX | CSIZE | CSTOPB | PARENB | PARODD;

View File

@ -179,7 +179,6 @@ config DELUSER
config GETTY config GETTY
bool "getty" bool "getty"
default y default y
depends on PLATFORM_LINUX
select FEATURE_SYSLOG select FEATURE_SYSLOG
help help
getty lets you log in on a tty, it is normally invoked by init. getty lets you log in on a tty, it is normally invoked by init.
@ -187,7 +186,6 @@ config GETTY
config LOGIN config LOGIN
bool "login" bool "login"
default y default y
depends on PLATFORM_LINUX
select FEATURE_SUID select FEATURE_SUID
select FEATURE_SYSLOG select FEATURE_SYSLOG
help help

View File

@ -282,10 +282,8 @@ static void termios_init(struct termios *tp, int speed, struct options *op)
* reads will be done in raw mode anyway. Errors will be dealt with * reads will be done in raw mode anyway. Errors will be dealt with
* later on. * later on.
*/ */
#ifdef __linux__
/* flush input and output queues, important for modems! */ /* flush input and output queues, important for modems! */
ioctl(0, TCFLSH, TCIOFLUSH); /* tcflush(0, TCIOFLUSH)? - same */ tcflush(0, TCIOFLUSH);
#endif
ispeed = ospeed = speed; ispeed = ospeed = speed;
if (speed == B0) { if (speed == B0) {
/* Speed was specified as "0" on command line. /* Speed was specified as "0" on command line.
@ -299,10 +297,13 @@ static void termios_init(struct termios *tp, int speed, struct options *op)
cfsetispeed(tp, ispeed); cfsetispeed(tp, ispeed);
cfsetospeed(tp, ospeed); cfsetospeed(tp, ospeed);
tp->c_iflag = tp->c_lflag = tp->c_line = 0; tp->c_iflag = tp->c_lflag = 0;
tp->c_oflag = OPOST | ONLCR; tp->c_oflag = OPOST | ONLCR;
tp->c_cc[VMIN] = 1; tp->c_cc[VMIN] = 1;
tp->c_cc[VTIME] = 0; tp->c_cc[VTIME] = 0;
#ifdef __linux__
tp->c_line = 0;
#endif
/* Optionally enable hardware flow control */ /* Optionally enable hardware flow control */
#ifdef CRTSCTS #ifdef CRTSCTS
@ -360,10 +361,8 @@ static void auto_baud(char *buf, unsigned size_buf, struct termios *tp)
for (bp = buf; bp < buf + nread; bp++) { for (bp = buf; bp < buf + nread; bp++) {
if (isdigit(*bp)) { if (isdigit(*bp)) {
speed = bcode(bp); speed = bcode(bp);
if (speed > 0) { if (speed > 0)
tp->c_cflag &= ~CBAUD; cfsetspeed(tp, speed);
tp->c_cflag |= speed;
}
break; break;
} }
} }
@ -417,7 +416,7 @@ static char *get_logname(char *logname, unsigned size_logname,
/* Flush pending input (esp. after parsing or switching the baud rate). */ /* Flush pending input (esp. after parsing or switching the baud rate). */
sleep(1); sleep(1);
ioctl(0, TCFLSH, TCIFLUSH); /* tcflush(0, TCIOFLUSH)? - same */ tcflush(0, TCIOFLUSH);
/* Prompt for and read a login name. */ /* Prompt for and read a login name. */
logname[0] = '\0'; logname[0] = '\0';
@ -526,7 +525,9 @@ static void termios_final(struct options *op, struct termios *tp, struct chardat
tp->c_cc[VQUIT] = DEF_QUIT; /* default quit */ tp->c_cc[VQUIT] = DEF_QUIT; /* default quit */
tp->c_cc[VEOF] = DEF_EOF; /* default EOF character */ tp->c_cc[VEOF] = DEF_EOF; /* default EOF character */
tp->c_cc[VEOL] = DEF_EOL; tp->c_cc[VEOL] = DEF_EOL;
#ifdef VSWTC
tp->c_cc[VSWTC] = DEF_SWITCH; /* default switch character */ tp->c_cc[VSWTC] = DEF_SWITCH; /* default switch character */
#endif
/* Account for special characters seen in input. */ /* Account for special characters seen in input. */
if (cp->eol == CR) { if (cp->eol == CR) {
@ -572,8 +573,8 @@ static void termios_final(struct options *op, struct termios *tp, struct chardat
#endif #endif
/* Finally, make the new settings effective */ /* Finally, make the new settings effective */
/* It's tcsetattr_stdin_TCSANOW() + error check */ if (tcsetattr_stdin_TCSANOW(tp) < 0)
ioctl_or_perror_and_die(0, TCSETS, tp, "%s: TCSETS", op->tty); bb_perror_msg_and_die("%s: tcsetattr", op->tty);
} }
int getty_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; int getty_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
@ -650,8 +651,8 @@ int getty_main(int argc UNUSED_PARAM, char **argv)
* by patching the SunOS kernel variable "zsadtrlow" to a larger value; * by patching the SunOS kernel variable "zsadtrlow" to a larger value;
* 5 seconds seems to be a good value. * 5 seconds seems to be a good value.
*/ */
/* tcgetattr() + error check */ if (tcgetattr(0, &termios) < 0)
ioctl_or_perror_and_die(0, TCGETS, &termios, "%s: TCGETS", options.tty); bb_perror_msg_and_die("%s: tcgetattr", options.tty);
pid = getpid(); pid = getpid();
#ifdef __linux__ #ifdef __linux__

View File

@ -264,7 +264,7 @@ int login_main(int argc UNUSED_PARAM, char **argv)
while (1) { while (1) {
/* flush away any type-ahead (as getty does) */ /* flush away any type-ahead (as getty does) */
ioctl(0, TCFLSH, TCIFLUSH); tcflush(0, TCIFLUSH);
if (!username[0]) if (!username[0])
get_username_or_die(username, sizeof(username)); get_username_or_die(username, sizeof(username));