support interface names in config as well as raw ips
This commit is contained in:
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user