Skip to content

Commit

Permalink
Made campaignd and wesnothd accept IPv6 connections as well as IPv4
Browse files Browse the repository at this point in the history
  • Loading branch information
loonycyborg committed Dec 22, 2018
1 parent d8bbcc6 commit 0e2b415
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 17 deletions.
1 change: 1 addition & 0 deletions changelog.md
Expand Up @@ -96,6 +96,7 @@
UI afterwards (e.g. [redraw]) and the status panels are updated immediately.
as well.
* Re-added the Font Scaling preference.
* Enabled wesnothd and campaignd to accept IPv6 connections too

## Version 1.14.5+dev
### AI
Expand Down
6 changes: 4 additions & 2 deletions src/server/server.cpp
Expand Up @@ -2060,7 +2060,8 @@ void server::shut_down_handler(
} else {
// Graceful shut down.
graceful_restart = true;
acceptor_.close();
acceptor_v6_.close();
acceptor_v4_.close();

timer_.expires_from_now(boost::posix_time::seconds(10));
timer_.async_wait(std::bind(&server::handle_graceful_timeout, this, _1));
Expand Down Expand Up @@ -2091,7 +2092,8 @@ void server::restart_handler(const std::string& issuer_name,
*out << "No restart_command configured! Not restarting.";
} else {
graceful_restart = true;
acceptor_.close();
acceptor_v6_.close();
acceptor_v4_.close();
timer_.expires_from_now(boost::posix_time::seconds(10));
timer_.async_wait(std::bind(&server::handle_graceful_timeout, this, _1));

Expand Down
38 changes: 26 additions & 12 deletions src/server/server_base.cpp
Expand Up @@ -34,7 +34,8 @@ server_base::server_base(unsigned short port, bool keep_alive) :
port_(port),
keep_alive_(keep_alive),
io_service_(),
acceptor_(io_service_),
acceptor_v6_(io_service_),
acceptor_v4_(io_service_),
#ifndef _WIN32
input_(io_service_),
sighup_(io_service_, SIGHUP),
Expand All @@ -43,15 +44,26 @@ server_base::server_base(unsigned short port, bool keep_alive) :
{
}

void server_base::setup_acceptor(boost::asio::ip::tcp::acceptor& acceptor, boost::asio::ip::tcp::endpoint endpoint)
{
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();
}

void server_base::start_server()
{
boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::tcp::v4(), port_);
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_));
acceptor_.bind(endpoint);
acceptor_.listen();
serve();
boost::asio::ip::tcp::endpoint endpoint_v6(boost::asio::ip::tcp::v6(), port_);
setup_acceptor(acceptor_v6_, endpoint_v6);
serve(acceptor_v6_);

boost::asio::ip::tcp::endpoint endpoint_v4(boost::asio::ip::tcp::v4(), port_);
setup_acceptor(acceptor_v4_, endpoint_v4);
serve(acceptor_v4_);

handshake_response_.connection_num = htonl(42);

Expand All @@ -63,16 +75,18 @@ void server_base::start_server()
sigs_.async_wait(std::bind(&server_base::handle_termination, this, _1, _2));
}

void server_base::serve()
void server_base::serve(boost::asio::ip::tcp::acceptor& acceptor)
{
socket_ptr socket = std::make_shared<boost::asio::ip::tcp::socket>(std::ref(io_service_));
acceptor_.async_accept(*socket, std::bind(&server_base::accept_connection, this, _1, socket));
acceptor.async_accept(*socket, [&acceptor, socket, this](const boost::system::error_code& error){
this->accept_connection(acceptor, error, socket);
});
}

void server_base::accept_connection(const boost::system::error_code& error, socket_ptr socket)
void server_base::accept_connection(boost::asio::ip::tcp::acceptor& acceptor, const boost::system::error_code& error, socket_ptr socket)
{
if(accepting_connections())
serve();
serve(acceptor);
if(error) {
ERR_SERVER << "Accept failed: " << error.message() << "\n";
return;
Expand Down
8 changes: 5 additions & 3 deletions src/server/server_base.hpp
Expand Up @@ -43,10 +43,12 @@ class server_base
unsigned short port_;
bool keep_alive_;
boost::asio::io_service io_service_;
boost::asio::ip::tcp::acceptor acceptor_;
boost::asio::ip::tcp::acceptor acceptor_v6_;
boost::asio::ip::tcp::acceptor acceptor_v4_;
void setup_acceptor(boost::asio::ip::tcp::acceptor& acceptor, boost::asio::ip::tcp::endpoint endpoint);
void start_server();
void serve();
void accept_connection(const boost::system::error_code& error, socket_ptr socket);
void serve(boost::asio::ip::tcp::acceptor& acceptor);
void accept_connection(boost::asio::ip::tcp::acceptor& acceptor, const boost::system::error_code& error, socket_ptr socket);

union {
uint32_t connection_num;
Expand Down

0 comments on commit 0e2b415

Please sign in to comment.