Skip to content

Commit

Permalink
wesnothd: properly terminate in response to failure to bind port
Browse files Browse the repository at this point in the history
  • Loading branch information
loonycyborg committed Nov 8, 2021
1 parent 2c391ec commit e21e025
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 17 deletions.
29 changes: 17 additions & 12 deletions src/server/common/server_base.cpp
Expand Up @@ -97,14 +97,19 @@ void server_base::start_server()

void server_base::serve(boost::asio::yield_context yield, boost::asio::ip::tcp::acceptor& acceptor, boost::asio::ip::tcp::endpoint endpoint)
{
if(!acceptor.is_open()) {
acceptor.open(endpoint.protocol());
acceptor.set_option(boost::asio::ip::tcp::acceptor::reuse_address(true));
acceptor.set_option(boost::asio::ip::tcp::acceptor::keep_alive(keep_alive_));
if(endpoint.protocol() == boost::asio::ip::tcp::v6())
acceptor.set_option(boost::asio::ip::v6_only(true));
acceptor.bind(endpoint);
acceptor.listen();
try {
if(!acceptor.is_open()) {
acceptor.open(endpoint.protocol());
acceptor.set_option(boost::asio::ip::tcp::acceptor::reuse_address(true));
acceptor.set_option(boost::asio::ip::tcp::acceptor::keep_alive(keep_alive_));
if(endpoint.protocol() == boost::asio::ip::tcp::v6())
acceptor.set_option(boost::asio::ip::v6_only(true));
acceptor.bind(endpoint);
acceptor.listen();
}
} catch(const boost::system::system_error& e) {
ERR_SERVER << "Exception when trying to bind port: " << e.code().message() << "\n";
throw server_shutdown("Port binding failed", e.code());
}

socket_ptr socket = std::make_shared<socket_ptr::element_type>(io_service_);
Expand All @@ -113,7 +118,7 @@ void server_base::serve(boost::asio::yield_context yield, boost::asio::ip::tcp::
acceptor.async_accept(socket->lowest_layer(), yield[error]);
if(error) {
ERR_SERVER << "Accept failed: " << error.message() << "\n";
return;
throw server_shutdown("Accept failed", error);
}

if(accepting_connections()) {
Expand Down Expand Up @@ -226,15 +231,15 @@ void server_base::handle_termination(const boost::system::error_code& error, int
exit(128 + signal_number);
}

void server_base::run() {
int server_base::run() {
for(;;) {
try {
io_service_.run();
LOG_SERVER << "Server has shut down because event loop is out of work\n";
break;
return 1;
} catch(const server_shutdown& e) {
LOG_SERVER << "Server has been shut down: " << e.what() << "\n";
break;
return e.ec.value();
} catch(const boost::system::system_error& e) {
ERR_SERVER << "Caught system error exception from handler: " << e.code().message() << "\n";
} catch(const std::exception& e) {
Expand Down
5 changes: 3 additions & 2 deletions src/server/common/server_base.hpp
Expand Up @@ -53,7 +53,8 @@ typedef utils::variant<socket_ptr, tls_socket_ptr> any_socket_ptr;

struct server_shutdown : public game::error
{
server_shutdown(const std::string& msg) : game::error(msg) {}
boost::system::error_code ec;
server_shutdown(const std::string& msg, boost::system::error_code ec = {}) : game::error(msg), ec(ec) {}
};

/**
Expand All @@ -80,7 +81,7 @@ class server_base
public:
server_base(unsigned short port, bool keep_alive);
virtual ~server_base() {}
void run();
int run();

/**
* Send a WML document from within a coroutine
Expand Down
4 changes: 1 addition & 3 deletions src/server/wesnothd/server.cpp
Expand Up @@ -3093,7 +3093,5 @@ int main(int argc, char** argv)
}
}

wesnothd::server(port, keep_alive, config_file, min_threads, max_threads).run();

return 0;
return wesnothd::server(port, keep_alive, config_file, min_threads, max_threads).run();
}

0 comments on commit e21e025

Please sign in to comment.