Make sure we reset terminal config also on exception

This commit is contained in:
Dennis Klein
2018-10-10 19:00:02 +02:00
committed by Dennis Klein
parent a78d35d90d
commit 9f325451e5

View File

@@ -113,6 +113,27 @@ auto ControlPluginProgramOptions() -> Plugin::ProgOptions
return pluginOptions; return pluginOptions;
} }
struct terminal_config
{
terminal_config()
{
termios t;
tcgetattr(STDIN_FILENO, &t); // get the current terminal I/O structure
t.c_lflag &= ~ICANON; // disable canonical input
t.c_lflag &= ~ECHO; // do not echo input chars
tcsetattr(STDIN_FILENO, TCSANOW, &t); // apply the new settings
}
~terminal_config()
{
termios t;
tcgetattr(STDIN_FILENO, &t); // get the current terminal I/O structure
t.c_lflag |= ICANON; // re-enable canonical input
t.c_lflag |= ECHO; // echo input chars
tcsetattr(STDIN_FILENO, TCSANOW, &t); // apply the new settings
}
};
auto Control::InteractiveMode() -> void auto Control::InteractiveMode() -> void
try try
{ {
@@ -122,12 +143,9 @@ try
pollfd cinfd[1]; pollfd cinfd[1];
cinfd[0].fd = fileno(stdin); cinfd[0].fd = fileno(stdin);
cinfd[0].events = POLLIN; cinfd[0].events = POLLIN;
cinfd[0].revents = 0;
struct termios t; terminal_config tconfig;
tcgetattr(STDIN_FILENO, &t); // get the current terminal I/O structure
t.c_lflag &= ~ICANON; // disable canonical input
t.c_lflag &= ~ECHO; // do not echo input chars
tcsetattr(STDIN_FILENO, TCSANOW, &t); // apply the new settings
PrintInteractiveHelp(); PrintInteractiveHelp();
@@ -220,11 +238,6 @@ try
} }
} }
tcgetattr(STDIN_FILENO, &t); // get the current terminal I/O structure
t.c_lflag |= ICANON; // re-enable canonical input
t.c_lflag |= ECHO; // echo input chars
tcsetattr(STDIN_FILENO, TCSANOW, &t); // apply the new settings
RunShutdownSequence(); RunShutdownSequence();
} }
catch (PluginServices::DeviceControlError& e) catch (PluginServices::DeviceControlError& e)