agetty: move vc initialization to ttyutils.h

... to make the code usable for sulogin.

Signed-off-by: Karel Zak <kzak@redhat.com>
This commit is contained in:
Karel Zak 2012-03-12 14:39:32 +01:00
parent 7c6bc22b5c
commit 879a7ab470
2 changed files with 78 additions and 61 deletions

73
include/ttyutils.h Normal file
View File

@ -0,0 +1,73 @@
#include <termios.h>
#define UL_TTY_KEEPCFLAGS (1 << 1)
#define UL_TTY_UTF8 (1 << 2)
static inline void reset_virtual_console(struct termios *tp, int flags)
{
/* Use defaults of <sys/ttydefaults.h> for base settings */
tp->c_iflag |= TTYDEF_IFLAG;
tp->c_oflag |= TTYDEF_OFLAG;
tp->c_lflag |= TTYDEF_LFLAG;
if ((flags & UL_TTY_KEEPCFLAGS) == 0) {
#ifdef CBAUD
tp->c_lflag &= ~CBAUD;
#endif
tp->c_cflag |= (B38400 | TTYDEF_CFLAG);
}
/* Sane setting, allow eight bit characters, no carriage return delay
* the same result as `stty sane cr0 pass8'
*/
tp->c_iflag |= (BRKINT | ICRNL | IMAXBEL);
tp->c_iflag &= ~(IGNBRK | INLCR | IGNCR | IXOFF | IUCLC | IXANY | ISTRIP);
tp->c_oflag |= (OPOST | ONLCR | NL0 | CR0 | TAB0 | BS0 | VT0 | FF0);
tp->c_oflag &= ~(OLCUC | OCRNL | ONOCR | ONLRET | OFILL | \
NLDLY|CRDLY|TABDLY|BSDLY|VTDLY|FFDLY);
tp->c_lflag |= (ISIG | ICANON | IEXTEN | ECHO|ECHOE|ECHOK|ECHOKE);
tp->c_lflag &= ~(ECHONL|ECHOCTL|ECHOPRT | NOFLSH | TOSTOP);
if ((flags & UL_TTY_KEEPCFLAGS) == 0) {
tp->c_cflag |= (CREAD | CS8 | HUPCL);
tp->c_cflag &= ~(PARODD | PARENB);
}
#ifdef OFDEL
tp->c_oflag &= ~OFDEL;
#endif
#ifdef XCASE
tp->c_lflag &= ~XCASE;
#endif
#ifdef IUTF8
if (flags & UL_TTY_UTF8)
tp->c_iflag |= IUTF8; /* Set UTF-8 input flag */
else
tp->c_iflag &= ~IUTF8;
#endif
/* VTIME and VMIN can overlap with VEOF and VEOL since they are
* only used for non-canonical mode. We just set the at the
* beginning, so nothing bad should happen.
*/
tp->c_cc[VTIME] = 0;
tp->c_cc[VMIN] = 1;
tp->c_cc[VINTR] = CINTR;
tp->c_cc[VQUIT] = CQUIT;
tp->c_cc[VERASE] = CERASE; /* ASCII DEL (0177) */
tp->c_cc[VKILL] = CKILL;
tp->c_cc[VEOF] = CEOF;
#ifdef VSWTC
tp->c_cc[VSWTC] = _POSIX_VDISABLE;
#elif defined(VSWTCH)
tp->c_cc[VSWTCH] = _POSIX_VDISABLE;
#endif
tp->c_cc[VSTART] = CSTART;
tp->c_cc[VSTOP] = CSTOP;
tp->c_cc[VSUSP] = CSUSP;
tp->c_cc[VEOL] = _POSIX_VDISABLE;
tp->c_cc[VREPRINT] = CREPRINT;
tp->c_cc[VDISCARD] = CDISCARD;
tp->c_cc[VWERASE] = CWERASE;
tp->c_cc[VLNEXT] = CLNEXT;
tp->c_cc[VEOL2] = _POSIX_VDISABLE;
}

View File

@ -38,6 +38,7 @@
#include "pathnames.h"
#include "c.h"
#include "widechar.h"
#include "ttyutils.h"
#ifdef __linux__
# include <sys/kd.h>
@ -1144,70 +1145,13 @@ static void termio_init(struct options *op, struct termios *tp)
/* Reset virtual console on stdin to its defaults */
static void reset_vc(const struct options *op, struct termios *tp)
{
/* Use defaults of <sys/ttydefaults.h> for base settings */
tp->c_iflag |= TTYDEF_IFLAG;
tp->c_oflag |= TTYDEF_OFLAG;
tp->c_lflag |= TTYDEF_LFLAG;
int fl = 0;
if ((op->flags & F_KEEPCFLAGS) == 0) {
#ifdef CBAUD
tp->c_lflag &= ~CBAUD;
#endif
tp->c_cflag |= (B38400 | TTYDEF_CFLAG);
}
fl |= (op->flags & F_KEEPCFLAGS) == 0 ? 0 : UL_TTY_KEEPCFLAGS;
fl |= (op->flags & F_UTF8) == 0 ? 0 : UL_TTY_UTF8;
/* Sane setting, allow eight bit characters, no carriage return delay
* the same result as `stty sane cr0 pass8'
*/
tp->c_iflag |= (BRKINT | ICRNL | IMAXBEL);
tp->c_iflag &= ~(IGNBRK | INLCR | IGNCR | IXOFF | IUCLC | IXANY | ISTRIP);
tp->c_oflag |= (OPOST | ONLCR | NL0 | CR0 | TAB0 | BS0 | VT0 | FF0);
tp->c_oflag &= ~(OLCUC | OCRNL | ONOCR | ONLRET | OFILL | \
NLDLY|CRDLY|TABDLY|BSDLY|VTDLY|FFDLY);
tp->c_lflag |= (ISIG | ICANON | IEXTEN | ECHO|ECHOE|ECHOK|ECHOKE);
tp->c_lflag &= ~(ECHONL|ECHOCTL|ECHOPRT | NOFLSH | TOSTOP);
reset_virtual_console(tp, fl);
if ((op->flags & F_KEEPCFLAGS) == 0) {
tp->c_cflag |= (CREAD | CS8 | HUPCL);
tp->c_cflag &= ~(PARODD | PARENB);
}
#ifdef OFDEL
tp->c_oflag &= ~OFDEL;
#endif
#ifdef XCASE
tp->c_lflag &= ~XCASE;
#endif
#ifdef IUTF8
if (op->flags & F_UTF8)
tp->c_iflag |= IUTF8; /* Set UTF-8 input flag */
else
tp->c_iflag &= ~IUTF8;
#endif
/* VTIME and VMIN can overlap with VEOF and VEOL since they are
* only used for non-canonical mode. We just set the at the
* beginning, so nothing bad should happen.
*/
tp->c_cc[VTIME] = 0;
tp->c_cc[VMIN] = 1;
tp->c_cc[VINTR] = CINTR;
tp->c_cc[VQUIT] = CQUIT;
tp->c_cc[VERASE] = CERASE; /* ASCII DEL (0177) */
tp->c_cc[VKILL] = CKILL;
tp->c_cc[VEOF] = CEOF;
#ifdef VSWTC
tp->c_cc[VSWTC] = _POSIX_VDISABLE;
#elif defined(VSWTCH)
tp->c_cc[VSWTCH] = _POSIX_VDISABLE;
#endif
tp->c_cc[VSTART] = CSTART;
tp->c_cc[VSTOP] = CSTOP;
tp->c_cc[VSUSP] = CSUSP;
tp->c_cc[VEOL] = _POSIX_VDISABLE;
tp->c_cc[VREPRINT] = CREPRINT;
tp->c_cc[VDISCARD] = CDISCARD;
tp->c_cc[VWERASE] = CWERASE;
tp->c_cc[VLNEXT] = CLNEXT;
tp->c_cc[VEOL2] = _POSIX_VDISABLE;
if (tcsetattr(STDIN_FILENO, TCSADRAIN, tp))
log_warn("tcsetattr problem: %m");
}