wesnothd: properly terminate in response to failure to bind port
This commit is contained in:
parent
2c391ece5f
commit
e21e025519
3 changed files with 21 additions and 17 deletions
|
@ -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_);
|
||||
|
@ -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()) {
|
||||
|
@ -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) {
|
||||
|
|
|
@ -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) {}
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue