}
+static void
+virLogDaemonInhibitor(bool inhibit, void *opaque)
+{
+ virLogDaemonPtr daemon = opaque;
+
+ if (inhibit)
+ virNetDaemonAddShutdownInhibition(daemon->dmn);
+ else
+ virNetDaemonRemoveShutdownInhibition(daemon->dmn);
+}
+
static virLogDaemonPtr
virLogDaemonNew(virLogDaemonConfigPtr config, bool privileged)
{
virNetDaemonAddServer(logd->dmn, logd->srv) < 0)
goto error;
- if (!(logd->handler = virLogHandlerNew(privileged)))
+ if (!(logd->handler = virLogHandlerNew(privileged,
+ virLogDaemonInhibitor,
+ logd)))
goto error;
return logd;
}
if (!(logd->handler = virLogHandlerNewPostExecRestart(child,
- privileged)))
+ privileged,
+ virLogDaemonInhibitor,
+ logd)))
goto error;
return logd;
bool privileged;
virLogHandlerLogFilePtr *files;
size_t nfiles;
+
+ virLogHandlerShutdownInhibitor inhibitor;
+ void *opaque;
};
static virClassPtr virLogHandlerClass;
return;
error:
+ handler->inhibitor(false, handler->opaque);
virLogHandlerLogFileClose(handler, logfile);
virObjectUnlock(handler);
}
virLogHandlerPtr
-virLogHandlerNew(bool privileged)
+virLogHandlerNew(bool privileged,
+ virLogHandlerShutdownInhibitor inhibitor,
+ void *opaque)
{
virLogHandlerPtr handler;
goto error;
handler->privileged = privileged;
+ handler->inhibitor = inhibitor;
+ handler->opaque = opaque;
return handler;
static virLogHandlerLogFilePtr
-virLogHandlerLogFilePostExecRestart(virJSONValuePtr object)
+virLogHandlerLogFilePostExecRestart(virLogHandlerPtr handler,
+ virJSONValuePtr object)
{
virLogHandlerLogFilePtr file;
const char *path;
if (VIR_ALLOC(file) < 0)
return NULL;
+ handler->inhibitor(true, handler->opaque);
+
if ((path = virJSONValueObjectGetString(object, "path")) == NULL) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("Missing file path in JSON document"));
return file;
error:
+ handler->inhibitor(false, handler->opaque);
virLogHandlerLogFileFree(file);
return NULL;
}
virLogHandlerPtr
virLogHandlerNewPostExecRestart(virJSONValuePtr object,
- bool privileged)
+ bool privileged,
+ virLogHandlerShutdownInhibitor inhibitor,
+ void *opaque)
{
virLogHandlerPtr handler;
virJSONValuePtr files;
ssize_t n;
size_t i;
- if (!(handler = virLogHandlerNew(privileged)))
+ if (!(handler = virLogHandlerNew(privileged,
+ inhibitor,
+ opaque)))
return NULL;
if (!(files = virJSONValueObjectGet(object, "files"))) {
virLogHandlerLogFilePtr file;
virJSONValuePtr child = virJSONValueArrayGet(files, i);
- if (!(file = virLogHandlerLogFilePostExecRestart(child)))
+ if (!(file = virLogHandlerLogFilePostExecRestart(handler, child)))
goto error;
if (VIR_APPEND_ELEMENT_COPY(handler->files, handler->nfiles, file) < 0)
virLogHandlerPtr handler = obj;
size_t i;
- for (i = 0; i < handler->nfiles; i++)
+ for (i = 0; i < handler->nfiles; i++) {
+ handler->inhibitor(false, handler->opaque);
virLogHandlerLogFileFree(handler->files[i]);
+ }
VIR_FREE(handler->files);
}
virObjectLock(handler);
+ handler->inhibitor(true, handler->opaque);
+
if (!(path = virLogHandlerGetLogFilePathForDomain(handler,
driver,
domuuid,
VIR_FREE(path);
VIR_FORCE_CLOSE(pipefd[0]);
VIR_FORCE_CLOSE(pipefd[1]);
+ handler->inhibitor(false, handler->opaque);
virLogHandlerLogFileFree(file);
virObjectUnlock(handler);
return -1;