#include "event.h"
#include "memory.h"
#include "stream.h"
+#include "hooks.h"
#ifdef HAVE_AVAHI
# include "mdns.h"
#endif
VIR_DAEMON_ERR_PRIVS,
VIR_DAEMON_ERR_NETWORK,
VIR_DAEMON_ERR_CONFIG,
+ VIR_DAEMON_ERR_HOOKS,
VIR_DAEMON_ERR_LAST
};
"Unable to setup signal handlers",
"Unable to drop privileges",
"Unable to initialize network sockets",
- "Unable to load configuration file")
+ "Unable to load configuration file",
+ "Unable to look for hook scripts")
static void sig_handler(int sig, siginfo_t * siginfo,
void* context ATTRIBUTE_UNUSED) {
switch (siginfo.si_signo) {
case SIGHUP:
VIR_INFO0(_("Reloading configuration on SIGHUP"));
+ virHookCall(VIR_HOOK_DRIVER_DAEMON, "-",
+ VIR_HOOK_DAEMON_OP_RELOAD, SIGHUP, "SIGHUP", NULL);
if (virStateReload() < 0)
VIR_WARN0(_("Error while reloading drivers"));
+
break;
case SIGINT:
goto error;
}
+ /* setup the hooks if any */
+ if (virHookInitialize()) {
+ ret = VIR_DAEMON_ERR_HOOKS;
+ goto error;
+ }
+
/* Disable error func, now logging is setup */
virSetErrorFunc(NULL, virshErrorHandler);
+ /*
+ * Call the daemon startup hook
+ * TODO: should we abort the daemon startup if the script returned
+ * an error ?
+ */
+ virHookCall(VIR_HOOK_DRIVER_DAEMON, "-", VIR_HOOK_DAEMON_OP_START,
+ 0, "start", NULL);
+
if (qemudNetworkInit(server) < 0) {
ret = VIR_DAEMON_ERR_NETWORK;
goto error;
}
pthread_join(server->eventThread, NULL);
+ virHookCall(VIR_HOOK_DRIVER_DAEMON, "-", VIR_HOOK_DAEMON_OP_SHUTDOWN,
+ 0, "shutdown", NULL);
+
error:
if (statuswrite != -1) {
if (ret != 0) {