From: Lennart Poettering Date: Thu, 11 Jul 2024 08:37:32 +0000 (+0200) Subject: terminal-util: don't export terminal_reset_ioctl()/terminal_reset_ansi_seq() anymore X-Git-Tag: v257-rc1~873^2~26 X-Git-Url: http://git-history.diyao.me/?a=commitdiff_plain;h=e2216800c5d69096973b792c6dcbf92a08392aab;p=systemd%2F.git terminal-util: don't export terminal_reset_ioctl()/terminal_reset_ansi_seq() anymore We only use them in terminal-util.c, hence make them static (and move them before their first using function). --- diff --git a/src/basic/terminal-util.c b/src/basic/terminal-util.c index 9720ac3c37..f171265164 100644 --- a/src/basic/terminal-util.c +++ b/src/basic/terminal-util.c @@ -247,78 +247,6 @@ int ask_string(char **ret, const char *text, ...) { return 0; } -int terminal_reset_ioctl(int fd, bool switch_to_text) { - struct termios termios; - int r; - - /* Set terminal to some sane defaults */ - - assert(fd >= 0); - - if (!isatty_safe(fd)) - return log_debug_errno(errno, "Asked to reset a terminal that actually isn't a terminal: %m"); - - /* We leave locked terminal attributes untouched, so that Plymouth may set whatever it wants to set, - * and we don't interfere with that. */ - - /* Disable exclusive mode, just in case */ - if (ioctl(fd, TIOCNXCL) < 0) - log_debug_errno(errno, "TIOCNXCL ioctl failed on TTY, ignoring: %m"); - - /* Switch to text mode */ - if (switch_to_text) - if (ioctl(fd, KDSETMODE, KD_TEXT) < 0) - log_debug_errno(errno, "KDSETMODE ioctl for switching to text mode failed on TTY, ignoring: %m"); - - - /* Set default keyboard mode */ - r = vt_reset_keyboard(fd); - if (r < 0) - log_debug_errno(r, "Failed to reset VT keyboard, ignoring: %m"); - - if (tcgetattr(fd, &termios) < 0) { - r = log_debug_errno(errno, "Failed to get terminal parameters: %m"); - goto finish; - } - - /* We only reset the stuff that matters to the software. How - * hardware is set up we don't touch assuming that somebody - * else will do that for us */ - - termios.c_iflag &= ~(IGNBRK | BRKINT | ISTRIP | INLCR | IGNCR | IUCLC); - termios.c_iflag |= ICRNL | IMAXBEL | IUTF8; - termios.c_oflag |= ONLCR | OPOST; - termios.c_cflag |= CREAD; - termios.c_lflag = ISIG | ICANON | IEXTEN | ECHO | ECHOE | ECHOK | ECHOCTL | ECHOKE; - - termios.c_cc[VINTR] = 03; /* ^C */ - termios.c_cc[VQUIT] = 034; /* ^\ */ - termios.c_cc[VERASE] = 0177; - termios.c_cc[VKILL] = 025; /* ^X */ - termios.c_cc[VEOF] = 04; /* ^D */ - termios.c_cc[VSTART] = 021; /* ^Q */ - termios.c_cc[VSTOP] = 023; /* ^S */ - termios.c_cc[VSUSP] = 032; /* ^Z */ - termios.c_cc[VLNEXT] = 026; /* ^V */ - termios.c_cc[VWERASE] = 027; /* ^W */ - termios.c_cc[VREPRINT] = 022; /* ^R */ - termios.c_cc[VEOL] = 0; - termios.c_cc[VEOL2] = 0; - - termios.c_cc[VTIME] = 0; - termios.c_cc[VMIN] = 1; - - r = RET_NERRNO(tcsetattr(fd, TCSANOW, &termios)); - if (r < 0) - log_debug_errno(r, "Failed to set terminal parameters: %m"); - -finish: - /* Just in case, flush all crap out */ - (void) tcflush(fd, TCIOFLUSH); - - return r; -} - int open_terminal(const char *name, int mode) { _cleanup_close_ int fd = -EBADF; unsigned c = 0; @@ -570,6 +498,104 @@ int vt_disallocate(const char *name) { return 0; } +static int terminal_reset_ioctl(int fd, bool switch_to_text) { + struct termios termios; + int r; + + /* Set terminal to some sane defaults */ + + assert(fd >= 0); + + /* We leave locked terminal attributes untouched, so that Plymouth may set whatever it wants to set, + * and we don't interfere with that. */ + + /* Disable exclusive mode, just in case */ + if (ioctl(fd, TIOCNXCL) < 0) + log_debug_errno(errno, "TIOCNXCL ioctl failed on TTY, ignoring: %m"); + + /* Switch to text mode */ + if (switch_to_text) + if (ioctl(fd, KDSETMODE, KD_TEXT) < 0) + log_debug_errno(errno, "KDSETMODE ioctl for switching to text mode failed on TTY, ignoring: %m"); + + /* Set default keyboard mode */ + r = vt_reset_keyboard(fd); + if (r < 0) + log_debug_errno(r, "Failed to reset VT keyboard, ignoring: %m"); + + if (tcgetattr(fd, &termios) < 0) { + r = log_debug_errno(errno, "Failed to get terminal parameters: %m"); + goto finish; + } + + /* We only reset the stuff that matters to the software. How + * hardware is set up we don't touch assuming that somebody + * else will do that for us */ + + termios.c_iflag &= ~(IGNBRK | BRKINT | ISTRIP | INLCR | IGNCR | IUCLC); + termios.c_iflag |= ICRNL | IMAXBEL | IUTF8; + termios.c_oflag |= ONLCR | OPOST; + termios.c_cflag |= CREAD; + termios.c_lflag = ISIG | ICANON | IEXTEN | ECHO | ECHOE | ECHOK | ECHOCTL | ECHOKE; + + termios.c_cc[VINTR] = 03; /* ^C */ + termios.c_cc[VQUIT] = 034; /* ^\ */ + termios.c_cc[VERASE] = 0177; + termios.c_cc[VKILL] = 025; /* ^X */ + termios.c_cc[VEOF] = 04; /* ^D */ + termios.c_cc[VSTART] = 021; /* ^Q */ + termios.c_cc[VSTOP] = 023; /* ^S */ + termios.c_cc[VSUSP] = 032; /* ^Z */ + termios.c_cc[VLNEXT] = 026; /* ^V */ + termios.c_cc[VWERASE] = 027; /* ^W */ + termios.c_cc[VREPRINT] = 022; /* ^R */ + termios.c_cc[VEOL] = 0; + termios.c_cc[VEOL2] = 0; + + termios.c_cc[VTIME] = 0; + termios.c_cc[VMIN] = 1; + + r = RET_NERRNO(tcsetattr(fd, TCSANOW, &termios)); + if (r < 0) + log_debug_errno(r, "Failed to set terminal parameters: %m"); + +finish: + /* Just in case, flush all crap out */ + (void) tcflush(fd, TCIOFLUSH); + + return r; +} + +static int terminal_reset_ansi_seq(int fd) { + int r, k; + + assert(fd >= 0); + + if (getenv_terminal_is_dumb()) + return 0; + + r = fd_nonblock(fd, true); + if (r < 0) + return log_debug_errno(r, "Failed to set terminal to non-blocking mode: %m"); + + k = loop_write_full(fd, + "\033[!p" /* soft terminal reset */ + "\033]104\007" /* reset colors */ + "\033[?7h", /* enable line-wrapping */ + SIZE_MAX, + 50 * USEC_PER_MSEC); + if (k < 0) + log_debug_errno(k, "Failed to write to terminal: %m"); + + if (r > 0) { + r = fd_nonblock(fd, false); + if (r < 0) + log_debug_errno(r, "Failed to set terminal back to blocking mode: %m"); + } + + return k < 0 ? k : r; +} + void reset_dev_console_fd(int fd, bool switch_to_text) { int r; @@ -1531,36 +1557,6 @@ int terminal_set_cursor_position(int fd, unsigned row, unsigned column) { return loop_write(fd, cursor_position, SIZE_MAX); } -int terminal_reset_ansi_seq(int fd) { - int r, k; - - assert(fd >= 0); - - if (getenv_terminal_is_dumb()) - return 0; - - r = fd_nonblock(fd, true); - if (r < 0) - return log_debug_errno(r, "Failed to set terminal to non-blocking mode: %m"); - - k = loop_write_full(fd, - "\033[!p" /* soft terminal reset */ - "\033]104\007" /* reset colors */ - "\033[?7h", /* enable line-wrapping */ - SIZE_MAX, - 50 * USEC_PER_MSEC); - if (k < 0) - log_debug_errno(k, "Failed to write to terminal: %m"); - - if (r > 0) { - r = fd_nonblock(fd, false); - if (r < 0) - log_debug_errno(r, "Failed to set terminal back to blocking mode: %m"); - } - - return k < 0 ? k : r; -} - int terminal_reset_defensive(int fd, bool switch_to_text) { int r = 0; @@ -1574,6 +1570,9 @@ int terminal_reset_defensive(int fd, bool switch_to_text) { * * The specified fd should be open for *writing*! */ + if (!isatty_safe(fd)) + return -ENOTTY; + RET_GATHER(r, terminal_reset_ioctl(fd, switch_to_text)); if (terminal_is_pty_fd(fd) == 0) diff --git a/src/basic/terminal-util.h b/src/basic/terminal-util.h index 46a91904c5..aec08e1942 100644 --- a/src/basic/terminal-util.h +++ b/src/basic/terminal-util.h @@ -95,8 +95,6 @@ bool isatty_safe(int fd); -int terminal_reset_ioctl(int fd, bool switch_to_text); -int terminal_reset_ansi_seq(int fd); int terminal_reset_defensive(int fd, bool switch_to_text); int terminal_set_cursor_position(int fd, unsigned row, unsigned column);