#include "config.hpp" #include #include "ini.hpp" #include "mem.hpp" namespace llarp { template static Section find_section(Config &c, const std::string &name, const Section &fallback) { if (c.sections.find(name) == c.sections.end()) return fallback; return c.sections[name].values; } bool Config::Load(const char *fname) { std::ifstream f; f.open(fname); if (f.is_open()) { ini::Parser parser(f); auto &top = parser.top(); router = find_section(top, "router", section_t{}); network = find_section(top, "network", section_t{}); netdb = find_section(top, "netdb", section_t{}); links = find_section(top, "links", section_t{}); return true; } return false; }; } // namespace llarp extern "C" { void llarp_new_config(struct llarp_config **conf) { llarp_config *c = new llarp_config; *conf = c; } void llarp_free_config(struct llarp_config **conf) { if (*conf) delete *conf; *conf = nullptr; } int llarp_load_config(struct llarp_config *conf, const char *fname) { if (!conf->impl.Load(fname)) return -1; return 0; } void llarp_config_iter(struct llarp_config *conf, struct llarp_config_iterator *iter) { iter->conf = conf; std::map sections = { {"router", conf->impl.router}, {"network", conf->impl.network}, {"links", conf->impl.links}, {"netdb", conf->impl.netdb}}; for (const auto §ion : sections) for (const auto &item : section.second) iter->visit(iter, section.first.c_str(), item.first.c_str(), item.second.c_str()); } }