aboutsummaryrefslogtreecommitdiff
path: root/contrib/epee/include/console_handler.h
diff options
context:
space:
mode:
authormoneromooo-monero <moneromooo-monero@users.noreply.github.com>2015-05-30 19:24:15 +0100
committermoneromooo-monero <moneromooo-monero@users.noreply.github.com>2015-05-30 19:25:07 +0100
commit87c01c30f38941e567cdb934fe03c0b403475de9 (patch)
tree176c5ead833c913fb6c631517b186673bdefd170 /contrib/epee/include/console_handler.h
parentexplicitly include libc++ with clang (diff)
downloadmonero-87c01c30f38941e567cdb934fe03c0b403475de9.tar.xz
console_handler: handle EOF properly
Exit instead of reading "empty" commands in an infinite loop.
Diffstat (limited to '')
-rw-r--r--contrib/epee/include/console_handler.h22
1 files changed, 19 insertions, 3 deletions
diff --git a/contrib/epee/include/console_handler.h b/contrib/epee/include/console_handler.h
index fc8cc3841..256f272c2 100644
--- a/contrib/epee/include/console_handler.h
+++ b/contrib/epee/include/console_handler.h
@@ -58,6 +58,9 @@ namespace epee
if (!start_read())
return false;
+ if (state_eos == m_read_status)
+ return false;
+
std::unique_lock<std::mutex> lock(m_response_mutex);
while (state_init == m_read_status)
{
@@ -71,11 +74,14 @@ namespace epee
res = true;
}
- m_read_status = state_init;
+ if (!eos())
+ m_read_status = state_init;
return res;
}
+ bool eos() const { return m_read_status == state_eos; }
+
void stop()
{
if (m_run)
@@ -167,7 +173,12 @@ namespace epee
{
read_ok = false;
}
-
+ if (std::cin.eof()) {
+ m_read_status = state_eos;
+ m_response_cv.notify_one();
+ break;
+ }
+ else
{
std::unique_lock<std::mutex> lock(m_response_mutex);
if (m_run.load(std::memory_order_relaxed))
@@ -189,7 +200,8 @@ namespace epee
state_init,
state_success,
state_error,
- state_cancelled
+ state_cancelled,
+ state_eos
};
private:
@@ -266,6 +278,10 @@ namespace epee
{
LOG_PRINT("Failed to read line.", LOG_LEVEL_0);
}
+ if (m_stdin_reader.eos())
+ {
+ break;
+ }
string_tools::trim(command);
LOG_PRINT_L2("Read command: " << command);