From e96e82527a898588f904b81d0d06d56a6db61a4e Mon Sep 17 00:00:00 2001 From: Martin Michelsen Date: Thu, 20 Feb 2020 10:09:44 -0800 Subject: [PATCH] support interface names in config as well as raw ips --- Main.cc | 34 ++++++++++++++++++++++++---------- NetworkAddresses.cc | 6 +++--- NetworkAddresses.hh | 4 ++-- ServerState.hh | 2 +- system/config.json | 6 +++--- 5 files changed, 33 insertions(+), 19 deletions(-) diff --git a/Main.cc b/Main.cc index dd340dc5..425d881a 100644 --- a/Main.cc +++ b/Main.cc @@ -115,14 +115,28 @@ void populate_state_from_config(shared_ptr s, } catch (const out_of_range&) { } auto local_address_str = d.at("LocalAddress")->as_string(); - s->local_address = address_for_string(local_address_str.c_str()); - s->all_addresses.emplace(s->local_address); - log(INFO, "added local address: %s", local_address_str.c_str()); + try { + s->local_address = s->all_addresses.at(local_address_str); + string addr_str = string_for_address(s->local_address); + log(INFO, "added local address: %s (%s)", addr_str.c_str(), + local_address_str.c_str()); + } catch (const out_of_range&) { + s->local_address = address_for_string(local_address_str.c_str()); + log(INFO, "added local address: %s", local_address_str.c_str()); + } + s->all_addresses.emplace("", s->local_address); auto external_address_str = d.at("ExternalAddress")->as_string(); - s->external_address = address_for_string(external_address_str.c_str()); - s->all_addresses.emplace(s->external_address); - log(INFO, "added external address: %s", external_address_str.c_str()); + try { + s->external_address = s->all_addresses.at(external_address_str); + string addr_str = string_for_address(s->external_address); + log(INFO, "added external address: %s (%s)", addr_str.c_str(), + external_address_str.c_str()); + } catch (const out_of_range&) { + s->external_address = address_for_string(external_address_str.c_str()); + log(INFO, "added external address: %s", external_address_str.c_str()); + } + s->all_addresses.emplace("", s->external_address); try { s->run_dns_server = d.at("RunDNSServer")->as_bool(); @@ -193,10 +207,10 @@ int main(int argc, char* argv[]) { shared_ptr base(event_base_new(), event_base_free); log(INFO, "reading network addresses"); - state->all_addresses = get_local_address_list(); - for (uint32_t addr : state->all_addresses) { - string addr_str = string_for_address(addr); - log(INFO, "found address: %s", addr_str.c_str()); + state->all_addresses = get_local_addresses(); + for (const auto& it : state->all_addresses) { + string addr_str = string_for_address(it.second); + log(INFO, "found interface: %s = %s", it.first.c_str(), addr_str.c_str()); } log(INFO, "loading configuration"); diff --git a/NetworkAddresses.cc b/NetworkAddresses.cc index 833028d6..8ae5bf22 100644 --- a/NetworkAddresses.cc +++ b/NetworkAddresses.cc @@ -44,7 +44,7 @@ uint32_t resolve_address(const char* address) { return bswap32(res_sin->sin_addr.s_addr); } -set get_local_address_list() { +map get_local_addresses() { struct ifaddrs* ifa_raw; if (getifaddrs(&ifa_raw)) { auto s = string_for_error(errno); @@ -53,7 +53,7 @@ set get_local_address_list() { unique_ptr ifa(ifa_raw, freeifaddrs); - set ret; + map ret; for (struct ifaddrs* i = ifa.get(); i; i = i->ifa_next) { if (!i->ifa_addr) { continue; @@ -64,7 +64,7 @@ set get_local_address_list() { continue; } - ret.emplace(bswap32(sin->sin_addr.s_addr)); + ret.emplace(i->ifa_name, bswap32(sin->sin_addr.s_addr)); } return ret; diff --git a/NetworkAddresses.hh b/NetworkAddresses.hh index e5090b05..5420c640 100644 --- a/NetworkAddresses.hh +++ b/NetworkAddresses.hh @@ -3,7 +3,7 @@ #include #include -#include +#include #include @@ -12,7 +12,7 @@ // it's easier uint32_t resolve_address(const char* address); -std::set get_local_address_list(); +std::map get_local_addresses(); uint32_t get_connected_address(int fd); bool is_local_address(uint32_t daddr); bool is_local_address(const sockaddr_storage& daddr); diff --git a/ServerState.hh b/ServerState.hh index 11838f40..6569af03 100644 --- a/ServerState.hh +++ b/ServerState.hh @@ -52,7 +52,7 @@ struct ServerState { std::map> id_to_lobby; std::atomic next_lobby_id; - std::set all_addresses; + std::map all_addresses; uint32_t local_address; uint32_t external_address; diff --git a/system/config.json b/system/config.json index 1c0a7627..0a1a3b6e 100755 --- a/system/config.json +++ b/system/config.json @@ -3,10 +3,10 @@ // Server's name (maximum 16 characters) "ServerName": "Alexandria", - // Address to connect local clients to + // Address to connect local clients to (IP address or interface name) "LocalAddress": "192.168.0.5", - // Address to connect external clients to - "ExternalAddress": "10.0.1.6", + // Address to connect external clients to (IP address or interface name) + "ExternalAddress": "en0", // Set to false to disable the DNS server "RunDNSServer": true, // By default, the interactive shell runs if stdin is a terminal, and doesn't