diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/config/config.cpp | 1 | ||||
-rw-r--r-- | src/main.cpp | 39 |
2 files changed, 32 insertions, 8 deletions
diff --git a/src/config/config.cpp b/src/config/config.cpp index 5f937e6..82295d5 100644 --- a/src/config/config.cpp +++ b/src/config/config.cpp @@ -56,7 +56,6 @@ void Config::connect(t_config_changed_callback callback) void Config::close() { Config* self = Config::instance().get(); - self->save_to_file(); self->values.clear(); Config::instance().reset(); } diff --git a/src/main.cpp b/src/main.cpp index 28f5a76..b27fd8b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -10,7 +10,9 @@ #include <signal.h> // A flag set by the SIGINT signal handler. -volatile std::atomic<bool> stop(false); +static volatile std::atomic<bool> stop(false); +// Flag set by the SIGUSR1/2 signal handler. +static volatile std::atomic<bool> reload(false); // A flag indicating that we are wanting to exit the process. i.e: if this // flag is set and all connections are closed, we can exit properly. static bool exiting = false; @@ -35,6 +37,11 @@ static void sigint_handler(int, siginfo_t*, void*) stop = true; } +static void sigusr_handler(int, siginfo_t*, void*) +{ + reload = true; +} + int main(int ac, char** av) { if (ac > 1) @@ -69,14 +76,21 @@ int main(int ac, char** av) // config sigset_t mask; sigemptyset(&mask); - struct sigaction on_sig; - on_sig.sa_sigaction = &sigint_handler; - on_sig.sa_mask = mask; + struct sigaction on_sigint; + on_sigint.sa_sigaction = &sigint_handler; + on_sigint.sa_mask = mask; // we want to catch that signal only once. // Sending SIGINT again will "force" an exit - on_sig.sa_flags = SA_RESETHAND; - sigaction(SIGINT, &on_sig, nullptr); - sigaction(SIGTERM, &on_sig, nullptr); + on_sigint.sa_flags = SA_RESETHAND; + sigaction(SIGINT, &on_sigint, nullptr); + sigaction(SIGTERM, &on_sigint, nullptr); + + // Install a signal to reload the config on SIGUSR1/2 + struct sigaction on_sigusr; + on_sigusr.sa_sigaction = &sigusr_handler; + on_sigusr.sa_mask = mask; + sigaction(SIGUSR1, &on_sigusr, nullptr); + sigaction(SIGUSR2, &on_sigusr, nullptr); const std::chrono::milliseconds timeout(-1); while (p.poll(timeout) != -1 || !exiting) @@ -91,6 +105,17 @@ int main(int ac, char** av) stop = false; xmpp_component->shutdown(); } + if (reload) + { + // Closing the config will just force it to be reopened the next time + // a configuration option is needed + log_info("Signal received, reloading the config..."); + Config::close(); + // Destroy the logger instance, to be recreated the next time a log + // line needs to be written + Logger::instance().reset(); + reload = false; + } // If the only existing connection is the one to the XMPP component: // close the XMPP stream. if (exiting && p.size() == 1 && xmpp_component->is_document_open()) |