Skip to content

Commit

Permalink
Properly handle mod-errors in on_shutdown
Browse files Browse the repository at this point in the history
  • Loading branch information
Desour authored and celeron55 committed Aug 24, 2020
1 parent 3e5bce2 commit f27cf47
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 4 deletions.
3 changes: 2 additions & 1 deletion src/client/game.cpp
Expand Up @@ -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;
Expand Down
17 changes: 15 additions & 2 deletions src/server.cpp
Expand Up @@ -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),
Expand All @@ -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())
Expand Down Expand Up @@ -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();
Expand Down
7 changes: 6 additions & 1 deletion src/server.h
Expand Up @@ -131,7 +131,8 @@ class Server : public con::PeerHandler, public MapEventReceiver,
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);
Expand Down Expand Up @@ -596,6 +597,10 @@ class Server : public con::PeerHandler, public MapEventReceiver,
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
Expand Down

0 comments on commit f27cf47

Please sign in to comment.