support interface names in config as well as raw ips

This commit is contained in:
Martin Michelsen
2020-02-20 10:09:44 -08:00
parent cbfffa9795
commit e96e82527a
5 changed files with 33 additions and 19 deletions
+24 -10
View File
@@ -115,14 +115,28 @@ void populate_state_from_config(shared_ptr<ServerState> 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("<local>", 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("<external>", 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<struct event_base> 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");
+3 -3
View File
@@ -44,7 +44,7 @@ uint32_t resolve_address(const char* address) {
return bswap32(res_sin->sin_addr.s_addr);
}
set<uint32_t> get_local_address_list() {
map<string, uint32_t> get_local_addresses() {
struct ifaddrs* ifa_raw;
if (getifaddrs(&ifa_raw)) {
auto s = string_for_error(errno);
@@ -53,7 +53,7 @@ set<uint32_t> get_local_address_list() {
unique_ptr<struct ifaddrs, void(*)(struct ifaddrs*)> ifa(ifa_raw, freeifaddrs);
set<uint32_t> ret;
map<string, uint32_t> ret;
for (struct ifaddrs* i = ifa.get(); i; i = i->ifa_next) {
if (!i->ifa_addr) {
continue;
@@ -64,7 +64,7 @@ set<uint32_t> 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;
+2 -2
View File
@@ -3,7 +3,7 @@
#include <netinet/in.h>
#include <stdint.h>
#include <set>
#include <map>
#include <string>
@@ -12,7 +12,7 @@
// it's easier
uint32_t resolve_address(const char* address);
std::set<uint32_t> get_local_address_list();
std::map<std::string, uint32_t> 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);
+1 -1
View File
@@ -52,7 +52,7 @@ struct ServerState {
std::map<int64_t, std::shared_ptr<Lobby>> id_to_lobby;
std::atomic<int32_t> next_lobby_id;
std::set<uint32_t> all_addresses;
std::map<std::string, uint32_t> all_addresses;
uint32_t local_address;
uint32_t external_address;
+3 -3
View File
@@ -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