#include "ini.hpp" #include "storage.hpp" #include "nntp_server.hpp" #include "event.hpp" #include #include int main(int argc, char * argv[]) { if (argc != 2) { std::cerr << "usage: " << argv[0] << " config.ini" << std::endl; return 1; } nntpchan::Mainloop loop; nntpchan::NNTPServer nntp(loop); std::string fname(argv[1]); std::ifstream i(fname); if(i.is_open()) { INI::Parser conf(i); std::vector requiredSections = {"nntp", "storage"}; auto & level = conf.top(); for ( const auto & section : requiredSections ) { if(level.sections.find(section) == level.sections.end()) { std::cerr << "config file " << fname << " does not have required section: "; std::cerr << section << std::endl; return 1; } } auto & storeconf = level.sections["storage"].values; if (storeconf.find("path") == storeconf.end()) { std::cerr << "storage section does not have 'path' value" << std::endl; return 1; } nntp.SetStoragePath(storeconf["path"]); auto & nntpconf = level.sections["nntp"].values; if (nntpconf.find("bind") == nntpconf.end()) { std::cerr << "nntp section does not have 'bind' value" << std::endl; return 1; } if (nntpconf.find("authdb") != nntpconf.end()) { nntp.SetLoginDB(nntpconf["authdb"]); } auto & a = nntpconf["bind"]; try { nntp.Bind(a); } catch ( std::exception & ex ) { std::cerr << "failed to bind: " << ex.what() << std::endl; return 1; } try { std::cerr << "run mainloop" << std::endl; loop.Run(); } catch ( std::exception & ex ) { std::cerr << "exception in mainloop: " << ex.what() << std::endl; return 2; } } else { std::cerr << "failed to open " << fname << std::endl; return 1; } }