diff options
Diffstat (limited to 'contrib/llvm/tools/lldb/source/Host/common/Terminal.cpp')
-rw-r--r-- | contrib/llvm/tools/lldb/source/Host/common/Terminal.cpp | 334 |
1 files changed, 137 insertions, 197 deletions
diff --git a/contrib/llvm/tools/lldb/source/Host/common/Terminal.cpp b/contrib/llvm/tools/lldb/source/Host/common/Terminal.cpp index 9f3abb7..022b3fa 100644 --- a/contrib/llvm/tools/lldb/source/Host/common/Terminal.cpp +++ b/contrib/llvm/tools/lldb/source/Host/common/Terminal.cpp @@ -8,6 +8,8 @@ //===----------------------------------------------------------------------===// #include "lldb/Host/Terminal.h" + +#include "lldb/Host/PosixApi.h" #include "llvm/ADT/STLExtras.h" #include <fcntl.h> @@ -17,120 +19,91 @@ #include <termios.h> #endif - using namespace lldb_private; -bool -Terminal::IsATerminal () const -{ - - return m_fd >= 0 && ::isatty (m_fd); -} - +bool Terminal::IsATerminal() const { return m_fd >= 0 && ::isatty(m_fd); } -bool -Terminal::SetEcho (bool enabled) -{ - if (FileDescriptorIsValid()) - { +bool Terminal::SetEcho(bool enabled) { + if (FileDescriptorIsValid()) { #ifdef LLDB_CONFIG_TERMIOS_SUPPORTED - if (IsATerminal ()) - { - struct termios fd_termios; - if (::tcgetattr(m_fd, &fd_termios) == 0) - { - bool set_corectly = false; - if (enabled) - { - if (fd_termios.c_lflag & ECHO) - set_corectly = true; - else - fd_termios.c_lflag |= ECHO; - } - else - { - if (fd_termios.c_lflag & ECHO) - fd_termios.c_lflag &= ~ECHO; - else - set_corectly = true; - } - - if (set_corectly) - return true; - return ::tcsetattr (m_fd, TCSANOW, &fd_termios) == 0; - } + if (IsATerminal()) { + struct termios fd_termios; + if (::tcgetattr(m_fd, &fd_termios) == 0) { + bool set_corectly = false; + if (enabled) { + if (fd_termios.c_lflag & ECHO) + set_corectly = true; + else + fd_termios.c_lflag |= ECHO; + } else { + if (fd_termios.c_lflag & ECHO) + fd_termios.c_lflag &= ~ECHO; + else + set_corectly = true; } -#endif // #ifdef LLDB_CONFIG_TERMIOS_SUPPORTED + + if (set_corectly) + return true; + return ::tcsetattr(m_fd, TCSANOW, &fd_termios) == 0; + } } - return false; +#endif // #ifdef LLDB_CONFIG_TERMIOS_SUPPORTED + } + return false; } -bool -Terminal::SetCanonical (bool enabled) -{ - if (FileDescriptorIsValid()) - { +bool Terminal::SetCanonical(bool enabled) { + if (FileDescriptorIsValid()) { #ifdef LLDB_CONFIG_TERMIOS_SUPPORTED - if (IsATerminal ()) - { - struct termios fd_termios; - if (::tcgetattr(m_fd, &fd_termios) == 0) - { - bool set_corectly = false; - if (enabled) - { - if (fd_termios.c_lflag & ICANON) - set_corectly = true; - else - fd_termios.c_lflag |= ICANON; - } - else - { - if (fd_termios.c_lflag & ICANON) - fd_termios.c_lflag &= ~ICANON; - else - set_corectly = true; - } - - if (set_corectly) - return true; - return ::tcsetattr (m_fd, TCSANOW, &fd_termios) == 0; - } + if (IsATerminal()) { + struct termios fd_termios; + if (::tcgetattr(m_fd, &fd_termios) == 0) { + bool set_corectly = false; + if (enabled) { + if (fd_termios.c_lflag & ICANON) + set_corectly = true; + else + fd_termios.c_lflag |= ICANON; + } else { + if (fd_termios.c_lflag & ICANON) + fd_termios.c_lflag &= ~ICANON; + else + set_corectly = true; } -#endif // #ifdef LLDB_CONFIG_TERMIOS_SUPPORTED + + if (set_corectly) + return true; + return ::tcsetattr(m_fd, TCSANOW, &fd_termios) == 0; + } } - return false; +#endif // #ifdef LLDB_CONFIG_TERMIOS_SUPPORTED + } + return false; } //---------------------------------------------------------------------- // Default constructor //---------------------------------------------------------------------- -TerminalState::TerminalState() : - m_tty(), - m_tflags(-1), +TerminalState::TerminalState() + : m_tty(), m_tflags(-1), #ifdef LLDB_CONFIG_TERMIOS_SUPPORTED - m_termios_ap(), + m_termios_ap(), #endif - m_process_group(-1) -{ + m_process_group(-1) { } //---------------------------------------------------------------------- // Destructor //---------------------------------------------------------------------- -TerminalState::~TerminalState() -{ -} +TerminalState::~TerminalState() {} -void -TerminalState::Clear () -{ - m_tty.Clear(); - m_tflags = -1; +void TerminalState::Clear() { + m_tty.Clear(); + m_tflags = -1; #ifdef LLDB_CONFIG_TERMIOS_SUPPORTED - m_termios_ap.reset(); + m_termios_ap.reset(); #endif - m_process_group = -1; + m_process_group = -1; } //---------------------------------------------------------------------- @@ -138,142 +111,114 @@ TerminalState::Clear () // and if "save_process_group" is true, attempt to save the process // group info for the TTY. //---------------------------------------------------------------------- -bool -TerminalState::Save (int fd, bool save_process_group) -{ - m_tty.SetFileDescriptor(fd); - if (m_tty.IsATerminal()) - { +bool TerminalState::Save(int fd, bool save_process_group) { + m_tty.SetFileDescriptor(fd); + if (m_tty.IsATerminal()) { #ifndef LLDB_DISABLE_POSIX - m_tflags = ::fcntl (fd, F_GETFL, 0); + m_tflags = ::fcntl(fd, F_GETFL, 0); #endif #ifdef LLDB_CONFIG_TERMIOS_SUPPORTED - if (m_termios_ap.get() == NULL) - m_termios_ap.reset (new struct termios); - int err = ::tcgetattr (fd, m_termios_ap.get()); - if (err != 0) - m_termios_ap.reset(); + if (m_termios_ap.get() == NULL) + m_termios_ap.reset(new struct termios); + int err = ::tcgetattr(fd, m_termios_ap.get()); + if (err != 0) + m_termios_ap.reset(); #endif // #ifdef LLDB_CONFIG_TERMIOS_SUPPORTED #ifndef LLDB_DISABLE_POSIX - if (save_process_group) - m_process_group = ::tcgetpgrp (0); - else - m_process_group = -1; -#endif - } + if (save_process_group) + m_process_group = ::tcgetpgrp(0); else - { - m_tty.Clear(); - m_tflags = -1; + m_process_group = -1; +#endif + } else { + m_tty.Clear(); + m_tflags = -1; #ifdef LLDB_CONFIG_TERMIOS_SUPPORTED - m_termios_ap.reset(); + m_termios_ap.reset(); #endif - m_process_group = -1; - } - return IsValid(); + m_process_group = -1; + } + return IsValid(); } //---------------------------------------------------------------------- // Restore the state of the TTY using the cached values from a // previous call to Save(). //---------------------------------------------------------------------- -bool -TerminalState::Restore () const -{ +bool TerminalState::Restore() const { #ifndef LLDB_DISABLE_POSIX - if (IsValid()) - { - const int fd = m_tty.GetFileDescriptor(); - if (TFlagsIsValid()) - fcntl (fd, F_SETFL, m_tflags); + if (IsValid()) { + const int fd = m_tty.GetFileDescriptor(); + if (TFlagsIsValid()) + fcntl(fd, F_SETFL, m_tflags); #ifdef LLDB_CONFIG_TERMIOS_SUPPORTED - if (TTYStateIsValid()) - tcsetattr (fd, TCSANOW, m_termios_ap.get()); + if (TTYStateIsValid()) + tcsetattr(fd, TCSANOW, m_termios_ap.get()); #endif // #ifdef LLDB_CONFIG_TERMIOS_SUPPORTED - if (ProcessGroupIsValid()) - { - // Save the original signal handler. - void (*saved_sigttou_callback) (int) = NULL; - saved_sigttou_callback = (void (*)(int)) signal (SIGTTOU, SIG_IGN); - // Set the process group - tcsetpgrp (fd, m_process_group); - // Restore the original signal handler. - signal (SIGTTOU, saved_sigttou_callback); - } - return true; + if (ProcessGroupIsValid()) { + // Save the original signal handler. + void (*saved_sigttou_callback)(int) = NULL; + saved_sigttou_callback = (void (*)(int))signal(SIGTTOU, SIG_IGN); + // Set the process group + tcsetpgrp(fd, m_process_group); + // Restore the original signal handler. + signal(SIGTTOU, saved_sigttou_callback); } + return true; + } #endif - return false; + return false; } - - - //---------------------------------------------------------------------- // Returns true if this object has valid saved TTY state settings // that can be used to restore a previous state. //---------------------------------------------------------------------- -bool -TerminalState::IsValid() const -{ - return m_tty.FileDescriptorIsValid () && (TFlagsIsValid() || TTYStateIsValid()); +bool TerminalState::IsValid() const { + return m_tty.FileDescriptorIsValid() && + (TFlagsIsValid() || TTYStateIsValid()); } //---------------------------------------------------------------------- // Returns true if m_tflags is valid //---------------------------------------------------------------------- -bool -TerminalState::TFlagsIsValid() const -{ - return m_tflags != -1; -} +bool TerminalState::TFlagsIsValid() const { return m_tflags != -1; } //---------------------------------------------------------------------- // Returns true if m_ttystate is valid //---------------------------------------------------------------------- -bool -TerminalState::TTYStateIsValid() const -{ +bool TerminalState::TTYStateIsValid() const { #ifdef LLDB_CONFIG_TERMIOS_SUPPORTED - return m_termios_ap.get() != 0; + return m_termios_ap.get() != 0; #else - return false; + return false; #endif } //---------------------------------------------------------------------- // Returns true if m_process_group is valid //---------------------------------------------------------------------- -bool -TerminalState::ProcessGroupIsValid() const -{ - return static_cast<int32_t>(m_process_group) != -1; +bool TerminalState::ProcessGroupIsValid() const { + return static_cast<int32_t>(m_process_group) != -1; } //------------------------------------------------------------------ // Constructor //------------------------------------------------------------------ -TerminalStateSwitcher::TerminalStateSwitcher () : - m_currentState(UINT32_MAX) -{ -} +TerminalStateSwitcher::TerminalStateSwitcher() : m_currentState(UINT32_MAX) {} //------------------------------------------------------------------ // Destructor //------------------------------------------------------------------ -TerminalStateSwitcher::~TerminalStateSwitcher () -{ -} +TerminalStateSwitcher::~TerminalStateSwitcher() {} //------------------------------------------------------------------ // Returns the number of states that this switcher contains //------------------------------------------------------------------ -uint32_t -TerminalStateSwitcher::GetNumberOfStates() const -{ - return llvm::array_lengthof(m_ttystates); +uint32_t TerminalStateSwitcher::GetNumberOfStates() const { + return llvm::array_lengthof(m_ttystates); } //------------------------------------------------------------------ @@ -281,28 +226,26 @@ TerminalStateSwitcher::GetNumberOfStates() const // // Returns true if the restore was successful, false otherwise. //------------------------------------------------------------------ -bool -TerminalStateSwitcher::Restore (uint32_t idx) const -{ - const uint32_t num_states = GetNumberOfStates(); - if (idx >= num_states) - return false; - - // See if we already are in this state? - if (m_currentState < num_states && (idx == m_currentState) && m_ttystates[idx].IsValid()) - return true; - - // Set the state to match the index passed in and only update the - // current state if there are no errors. - if (m_ttystates[idx].Restore()) - { - m_currentState = idx; - return true; - } - - // We failed to set the state. The tty state was invalid or not - // initialized. +bool TerminalStateSwitcher::Restore(uint32_t idx) const { + const uint32_t num_states = GetNumberOfStates(); + if (idx >= num_states) return false; + + // See if we already are in this state? + if (m_currentState < num_states && (idx == m_currentState) && + m_ttystates[idx].IsValid()) + return true; + + // Set the state to match the index passed in and only update the + // current state if there are no errors. + if (m_ttystates[idx].Restore()) { + m_currentState = idx; + return true; + } + + // We failed to set the state. The tty state was invalid or not + // initialized. + return false; } //------------------------------------------------------------------ @@ -311,13 +254,10 @@ TerminalStateSwitcher::Restore (uint32_t idx) const // // Returns true if the restore was successful, false otherwise. //------------------------------------------------------------------ -bool -TerminalStateSwitcher::Save (uint32_t idx, int fd, bool save_process_group) -{ - const uint32_t num_states = GetNumberOfStates(); - if (idx < num_states) - return m_ttystates[idx].Save(fd, save_process_group); - return false; +bool TerminalStateSwitcher::Save(uint32_t idx, int fd, + bool save_process_group) { + const uint32_t num_states = GetNumberOfStates(); + if (idx < num_states) + return m_ttystates[idx].Save(fd, save_process_group); + return false; } - - |