aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDesour <vorunbekannt75@web.de>2020-08-23 19:44:25 +0200
committerceleron55 <celeron55@gmail.com>2020-08-24 19:55:25 +0300
commitf27cf4777933f06f85fa2f013d56ca0a2cf1d588 (patch)
tree0de39c63d30849cbf4e7409f00470493a2de5b15
parent3e5bce2251deb8e5fcbaa266431f8c0f10078bf2 (diff)
downloadminetest-f27cf4777933f06f85fa2f013d56ca0a2cf1d588.tar.gz
minetest-f27cf4777933f06f85fa2f013d56ca0a2cf1d588.tar.bz2
minetest-f27cf4777933f06f85fa2f013d56ca0a2cf1d588.zip
Properly handle mod-errors in on_shutdown
-rw-r--r--src/client/game.cpp3
-rw-r--r--src/server.cpp17
-rw-r--r--src/server.h7
3 files changed, 23 insertions, 4 deletions
diff --git a/src/client/game.cpp b/src/client/game.cpp
index 0d3a0ca15..920383aaf 100644
--- a/src/client/game.cpp
+++ b/src/client/game.cpp
@@ -1300,7 +1300,8 @@ bool Game::createSingleplayerServer(const std::string &map_dir,
return false;
}
- server = new Server(map_dir, gamespec, simple_singleplayer_mode, bind_addr, false);
+ server = new Server(map_dir, gamespec, simple_singleplayer_mode, bind_addr,
+ false, nullptr, error_message);
server->start();
return true;
diff --git a/src/server.cpp b/src/server.cpp
index ef36aedca..7b3978462 100644
--- a/src/server.cpp
+++ b/src/server.cpp
@@ -213,7 +213,8 @@ Server::Server(
bool simple_singleplayer_mode,
Address bind_addr,
bool dedicated,
- ChatInterface *iface
+ ChatInterface *iface,
+ std::string *on_shutdown_errmsg
):
m_bind_addr(bind_addr),
m_path_world(path_world),
@@ -232,6 +233,7 @@ Server::Server(
m_thread(new ServerThread(this)),
m_clients(m_con),
m_admin_chat(iface),
+ m_on_shutdown_errmsg(on_shutdown_errmsg),
m_modchannel_mgr(new ModChannelMgr())
{
if (m_path_world.empty())
@@ -314,7 +316,18 @@ Server::~Server()
// Execute script shutdown hooks
infostream << "Executing shutdown hooks" << std::endl;
- m_script->on_shutdown();
+ try {
+ m_script->on_shutdown();
+ } catch (ModError &e) {
+ errorstream << "ModError: " << e.what() << std::endl;
+ if (m_on_shutdown_errmsg) {
+ if (m_on_shutdown_errmsg->empty()) {
+ *m_on_shutdown_errmsg = std::string("ModError: ") + e.what();
+ } else {
+ *m_on_shutdown_errmsg += std::string("\nModError: ") + e.what();
+ }
+ }
+ }
infostream << "Server: Saving environment metadata" << std::endl;
m_env->saveMeta();
diff --git a/src/server.h b/src/server.h
index f44716531..be6f60abc 100644
--- a/src/server.h
+++ b/src/server.h
@@ -131,7 +131,8 @@ public:
bool simple_singleplayer_mode,
Address bind_addr,
bool dedicated,
- ChatInterface *iface = nullptr
+ ChatInterface *iface = nullptr,
+ std::string *on_shutdown_errmsg = nullptr
);
~Server();
DISABLE_CLASS_COPY(Server);
@@ -596,6 +597,10 @@ private:
ChatInterface *m_admin_chat;
std::string m_admin_nick;
+ // if a mod-error occurs in the on_shutdown callback, the error message will
+ // be written into this
+ std::string *const m_on_shutdown_errmsg;
+
/*
Map edit event queue. Automatically receives all map edits.
The constructor of this class registers us to receive them through