Split the main() into smaller functions

That’s not really enough, but better
This commit is contained in:
louiz’
2018-08-07 20:49:34 +02:00
parent 89ad479ef4
commit 9fa7591058
+54 -40
View File
@@ -55,45 +55,8 @@ static void sigusr_handler(int, siginfo_t*, void*)
reload.store(true); reload.store(true);
} }
int main(int ac, char** av) static void setup_signals()
{ {
if (ac > 1)
{
const std::string arg = av[1];
if (arg.size() >= 2 && arg[0] == '-' && arg[1] == '-')
{
if (arg == "--help")
return display_help();
else
{
std::cerr << "Unknow command line option: " << arg << std::endl;
return 1;
}
}
}
const std::string conf_filename = ac > 1 ? av[1] : xdg_config_path("biboumi.cfg");
std::cout << "Using configuration file: " << conf_filename << std::endl;
if (!Config::read_conf(conf_filename))
return config_help("");
const std::string password = Config::get("password", "");
if (password.empty())
return config_help("password");
const std::string hostname = Config::get("hostname", "");
if (hostname.empty())
return config_help("hostname");
#ifdef USE_DATABASE
try {
open_database();
} catch (const std::exception& e) {
log_error(e.what());
return 1;
}
#endif
// Block the signals we want to manage. They will be unblocked only during // Block the signals we want to manage. They will be unblocked only during
// the epoll_pwait or ppoll calls. This avoids some race conditions, // the epoll_pwait or ppoll calls. This avoids some race conditions,
// explained in man 2 pselect on linux // explained in man 2 pselect on linux
@@ -126,7 +89,10 @@ int main(int ac, char** av)
sigaction(SIGUSR1, &on_sigusr, nullptr); sigaction(SIGUSR1, &on_sigusr, nullptr);
sigaction(SIGUSR2, &on_sigusr, nullptr); sigaction(SIGUSR2, &on_sigusr, nullptr);
sigaction(SIGHUP, &on_sigusr, nullptr); sigaction(SIGHUP, &on_sigusr, nullptr);
}
static int main_loop(std::string hostname, std::string password)
{
auto p = std::make_shared<Poller>(); auto p = std::make_shared<Poller>();
#ifdef UDNS_FOUND #ifdef UDNS_FOUND
@@ -163,7 +129,7 @@ int main(int ac, char** av)
dns_handler.destroy(); dns_handler.destroy();
#endif #endif
if (identd) if (identd)
identd->shutdown(); identd->shutdown();
// Cancel the timer for a potential reconnection // Cancel the timer for a potential reconnection
TimedEventsManager::instance().cancel("XMPP reconnection"); TimedEventsManager::instance().cancel("XMPP reconnection");
} }
@@ -206,7 +172,7 @@ int main(int ac, char** av)
dns_handler.destroy(); dns_handler.destroy();
#endif #endif
if (identd) if (identd)
identd->shutdown(); identd->shutdown();
} }
} }
// If the only existing connection is the one to the XMPP component: // If the only existing connection is the one to the XMPP component:
@@ -225,3 +191,51 @@ int main(int ac, char** av)
log_info("All connections cleanly closed, have a nice day."); log_info("All connections cleanly closed, have a nice day.");
return 0; return 0;
} }
int main(int ac, char** av)
{
if (ac > 1)
{
const std::string arg = av[1];
if (arg.size() >= 2 && arg[0] == '-' && arg[1] == '-')
{
if (arg == "--help")
return display_help();
else
{
std::cerr << "Unknow command line option: " << arg
<< std::endl;
return 1;
}
}
}
const std::string conf_filename =
ac > 1 ? av[1]: xdg_config_path("biboumi.cfg");
std::cout << "Using configuration file: " << conf_filename << std::endl;
if (!Config::read_conf(conf_filename))
return config_help("");
const std::string password = Config::get("password", "");
if (password.empty())
return config_help("password");
const std::string hostname = Config::get("hostname", "");
if (hostname.empty())
return config_help("hostname");
#ifdef USE_DATABASE
try
{
open_database();
}
catch (const std::exception& e)
{
log_error(e.what());
return 1;
}
#endif
setup_signals();
return main_loop(std::move(hostname), std::move(password));
}