diff --git a/contrib/epee/include/console_handler.h b/contrib/epee/include/console_handler.h index 256f272c..952fc3c9 100644 --- a/contrib/epee/include/console_handler.h +++ b/contrib/epee/include/console_handler.h @@ -240,9 +240,9 @@ namespace epee } template - bool run(chain_handler ch_handler, const std::string& prompt = "#", const std::string& usage = "") + bool run(chain_handler ch_handler, const std::string& prompt = "#", const std::string& usage = "", std::function exit_handler = NULL) { - return run(prompt, usage, [&](const std::string& cmd) { return ch_handler(cmd); }, [] { }); + return run(prompt, usage, [&](const std::string& cmd) { return ch_handler(cmd); }, exit_handler); } void stop() @@ -252,8 +252,8 @@ namespace epee } private: - template - bool run(const std::string& prompt, const std::string& usage, const t_cmd_handler& cmd_handler, const t_exit_handler& exit_handler) + template + bool run(const std::string& prompt, const std::string& usage, const t_cmd_handler& cmd_handler, std::function exit_handler) { TRY_ENTRY(); bool continue_handle = true; @@ -429,9 +429,9 @@ namespace epee std::unique_ptr m_console_thread; async_console_handler m_console_handler; public: - bool start_handling(const std::string& prompt, const std::string& usage_string = "") + bool start_handling(const std::string& prompt, const std::string& usage_string = "", std::function exit_handler = NULL) { - m_console_thread.reset(new boost::thread(boost::bind(&console_handlers_binder::run_handling, this, prompt, usage_string))); + m_console_thread.reset(new boost::thread(boost::bind(&console_handlers_binder::run_handling, this, prompt, usage_string, exit_handler))); m_console_thread->detach(); return true; } @@ -441,9 +441,9 @@ namespace epee m_console_handler.stop(); } - bool run_handling(const std::string& prompt, const std::string& usage_string) + bool run_handling(const std::string& prompt, const std::string& usage_string, std::function exit_handler = NULL) { - return m_console_handler.run(boost::bind(&console_handlers_binder::process_command_str, this, _1), prompt, usage_string); + return m_console_handler.run(boost::bind(&console_handlers_binder::process_command_str, this, _1), prompt, usage_string, exit_handler); } }; diff --git a/src/daemon/command_server.cpp b/src/daemon/command_server.cpp index 5510ee59..65bceff7 100644 --- a/src/daemon/command_server.cpp +++ b/src/daemon/command_server.cpp @@ -196,11 +196,11 @@ bool t_command_server::process_command_vec(const std::vector& cmd) return result; } -bool t_command_server::start_handling() +bool t_command_server::start_handling(std::function exit_handler) { if (m_is_rpc) return false; - m_command_lookup.start_handling("", get_commands_str()); + m_command_lookup.start_handling("", get_commands_str(), exit_handler); return true; } diff --git a/src/daemon/command_server.h b/src/daemon/command_server.h index aa8e0770..5df45728 100644 --- a/src/daemon/command_server.h +++ b/src/daemon/command_server.h @@ -62,7 +62,7 @@ public: bool process_command_vec(const std::vector& cmd); - bool start_handling(); + bool start_handling(std::function exit_handler = NULL); void stop_handling(); diff --git a/src/daemon/daemon.cpp b/src/daemon/daemon.cpp index 7931ba03..2bd59261 100644 --- a/src/daemon/daemon.cpp +++ b/src/daemon/daemon.cpp @@ -126,7 +126,7 @@ bool t_daemon::run(bool interactive) if (interactive) { rpc_commands = new daemonize::t_command_server(0, 0, false, mp_internals->rpc.get_server()); - rpc_commands->start_handling(); + rpc_commands->start_handling(std::bind(&daemonize::t_daemon::stop, this)); } mp_internals->p2p.run(); // blocks until p2p goes down