More termios fixes from Kirk Beitz.

llvm-svn: 125024
This commit is contained in:
Greg Clayton 2011-02-07 19:04:58 +00:00
parent e1a4ac9b5b
commit cdd074fbc7
4 changed files with 28 additions and 5 deletions

View File

@ -11,8 +11,9 @@
#define liblldb_TTYState_h_
#if defined(__cplusplus)
#if LLDB_CONFIG_TERMIOS_SUPPORTED
#include <termios.h>
#include <stdint.h>
#endif // #if LLDB_CONFIG_TERMIOS_SUPPORTED
#include "lldb/lldb-private.h"
@ -121,7 +122,9 @@ protected:
int m_fd; ///< File descriptor of the TTY.
int m_tflags; ///< Cached tflags information.
int m_ttystate_err; ///< Error value from call to save tflags.
#if LLDB_CONFIG_TERMIOS_SUPPORTED
struct termios m_ttystate; ///< Cached ttystate information.
#endif // #if LLDB_CONFIG_TERMIOS_SUPPORTED
lldb::pid_t m_process_group;///< Cached process group information.
};

View File

@ -21,7 +21,9 @@
#include "lldb/Target/StopInfo.h"
#include "lldb/Target/Thread.h"
#if LLDB_CONFIG_TERMIOS_SUPPORTED
#include <termios.h>
#endif
using namespace lldb;
using namespace lldb_private;
@ -547,11 +549,12 @@ Debugger::CheckIfTopInputReaderIsDone ()
void
Debugger::ActivateInputReader (const InputReaderSP &reader_sp)
{
#if LLDB_CONFIG_TERMIOS_SUPPORTED
FILE *in_fh = GetInputFileHandle();
if (in_fh)
{
struct termios in_fh_termios;
struct termios in_fh_termios;
int in_fd = fileno (in_fh);
if (::tcgetattr(in_fd, &in_fh_termios) == 0)
{
@ -578,6 +581,7 @@ Debugger::ActivateInputReader (const InputReaderSP &reader_sp)
::tcsetattr (in_fd, TCSANOW, &in_fh_termios);
}
}
#endif // #if LLDB_CONFIG_TERMIOS_SUPPORTED
}
void

View File

@ -10,7 +10,7 @@
#include "lldb/Core/TTYState.h"
#include <fcntl.h>
#include <unistd.h>
#include <sys/signal.h>
#include <signal.h>
using namespace lldb_private;
@ -21,7 +21,9 @@ TTYState::TTYState() :
m_fd(-1),
m_tflags(-1),
m_ttystate_err(-1),
#if LLDB_CONFIG_TERMIOS_SUPPORTED
m_ttystate(),
#endif // #if LLDB_CONFIG_TERMIOS_SUPPORTED
m_process_group(-1)
{
}
@ -45,7 +47,9 @@ TTYState::Save (int fd, bool save_process_group)
{
m_fd = fd;
m_tflags = ::fcntl (fd, F_GETFL, 0);
#if LLDB_CONFIG_TERMIOS_SUPPORTED
m_ttystate_err = ::tcgetattr (fd, &m_ttystate);
#endif // #if LLDB_CONFIG_TERMIOS_SUPPORTED
if (save_process_group)
m_process_group = ::tcgetpgrp (0);
else
@ -74,8 +78,10 @@ TTYState::Restore () const
if (TFlagsIsValid())
result = fcntl (m_fd, F_SETFL, m_tflags);
#if LLDB_CONFIG_TERMIOS_SUPPORTED
if (TTYStateIsValid())
result = tcsetattr (m_fd, TCSANOW, &m_ttystate);
#endif // #if LLDB_CONFIG_TERMIOS_SUPPORTED
if (ProcessGroupIsValid())
{

View File

@ -201,7 +201,9 @@ ScriptInterpreterPython::ScriptInterpreterPython (CommandInterpreter &interprete
m_dbg_stdout (interpreter.GetDebugger().GetOutputFileHandle()),
m_new_sysout (NULL),
m_dictionary_name (interpreter.GetDebugger().GetInstanceName().AsCString()),
#if LLDB_CONFIG_TERMIOS_SUPPORTED
m_termios (),
#endif // #if LLDB_CONFIG_TERMIOS_SUPPORTED
m_termios_valid (false),
m_session_is_active (false),
m_pty_slave_is_open (false),
@ -569,8 +571,10 @@ ScriptInterpreterPython::InputReaderCallback
else
input_fd = STDIN_FILENO;
#if LLDB_CONFIG_TERMIOS_SUPPORTED
script_interpreter->m_termios_valid = ::tcgetattr (input_fd, &script_interpreter->m_termios) == 0;
#endif // #if LLDB_CONFIG_TERMIOS_SUPPORTED
if (!CurrentThreadHasPythonLock())
{
while (!GetPythonLock(1))
@ -674,6 +678,7 @@ ScriptInterpreterPython::InputReaderCallback
// Restore terminal settings if they were validly saved
if (log)
log->Printf ("ScriptInterpreterPython::InputReaderCallback, Done, closing down input reader.");
#if LLDB_CONFIG_TERMIOS_SUPPORTED
if (script_interpreter->m_termios_valid)
{
int input_fd;
@ -685,6 +690,7 @@ ScriptInterpreterPython::InputReaderCallback
::tcsetattr (input_fd, TCSANOW, &script_interpreter->m_termios);
}
#endif // #if LLDB_CONFIG_TERMIOS_SUPPORTED
script_interpreter->m_embedded_python_pty.CloseMasterFileDescriptor();
break;
}
@ -1433,8 +1439,10 @@ ScriptInterpreterPython::Initialize ()
int input_fd = STDIN_FILENO;
#if LLDB_CONFIG_TERMIOS_SUPPORTED
struct termios stdin_termios;
bool valid_termios = ::tcgetattr (input_fd, &stdin_termios) == 0;
#endif // #if LLDB_CONFIG_TERMIOS_SUPPORTED
// Find the module that owns this code and use that path we get to
// set the PYTHONPATH appropriately.
@ -1511,9 +1519,11 @@ ScriptInterpreterPython::Initialize ()
PyRun_SimpleString ("from termios import *");
Py_DECREF (pmod);
}
#if LLDB_CONFIG_TERMIOS_SUPPORTED
if (valid_termios)
::tcsetattr (input_fd, TCSANOW, &stdin_termios);
#endif // #if LLDB_CONFIG_TERMIOS_SUPPORTED
}
void