diff --git a/src/logging/log_daemon.c b/src/logging/log_daemon.c index 7a1afecffb9ffda9704b486014a29cba295d274a..3fda9ca33c6166436d696f48eb27ba51d9ddf290 100644 --- a/src/logging/log_daemon.c +++ b/src/logging/log_daemon.c @@ -124,6 +124,17 @@ virLogDaemonFree(virLogDaemonPtr logd) } +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) { @@ -152,7 +163,9 @@ 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; @@ -210,7 +223,9 @@ virLogDaemonNewPostExecRestart(virJSONValuePtr object, bool privileged) } if (!(logd->handler = virLogHandlerNewPostExecRestart(child, - privileged))) + privileged, + virLogDaemonInhibitor, + logd))) goto error; return logd; diff --git a/src/logging/log_handler.c b/src/logging/log_handler.c index 2acbca7de21733fd15bcd8a8e53a2dab41e6296c..a4f0395b34df5230516155b7ed5a30ca3bc3270a 100644 --- a/src/logging/log_handler.c +++ b/src/logging/log_handler.c @@ -59,6 +59,9 @@ struct _virLogHandler { bool privileged; virLogHandlerLogFilePtr *files; size_t nfiles; + + virLogHandlerShutdownInhibitor inhibitor; + void *opaque; }; static virClassPtr virLogHandlerClass; @@ -165,13 +168,16 @@ virLogHandlerDomainLogFileEvent(int watch, 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; @@ -182,6 +188,8 @@ virLogHandlerNew(bool privileged) goto error; handler->privileged = privileged; + handler->inhibitor = inhibitor; + handler->opaque = opaque; return handler; @@ -191,7 +199,8 @@ virLogHandlerNew(bool privileged) static virLogHandlerLogFilePtr -virLogHandlerLogFilePostExecRestart(virJSONValuePtr object) +virLogHandlerLogFilePostExecRestart(virLogHandlerPtr handler, + virJSONValuePtr object) { virLogHandlerLogFilePtr file; const char *path; @@ -199,6 +208,8 @@ virLogHandlerLogFilePostExecRestart(virJSONValuePtr object) 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")); @@ -226,6 +237,7 @@ virLogHandlerLogFilePostExecRestart(virJSONValuePtr object) return file; error: + handler->inhibitor(false, handler->opaque); virLogHandlerLogFileFree(file); return NULL; } @@ -233,14 +245,18 @@ virLogHandlerLogFilePostExecRestart(virJSONValuePtr object) 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"))) { @@ -259,7 +275,7 @@ virLogHandlerNewPostExecRestart(virJSONValuePtr object, 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) @@ -290,8 +306,10 @@ virLogHandlerDispose(void *obj) 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); } @@ -341,6 +359,8 @@ virLogHandlerDomainOpenLogFile(virLogHandlerPtr handler, virObjectLock(handler); + handler->inhibitor(true, handler->opaque); + if (!(path = virLogHandlerGetLogFilePathForDomain(handler, driver, domuuid, @@ -400,6 +420,7 @@ virLogHandlerDomainOpenLogFile(virLogHandlerPtr handler, VIR_FREE(path); VIR_FORCE_CLOSE(pipefd[0]); VIR_FORCE_CLOSE(pipefd[1]); + handler->inhibitor(false, handler->opaque); virLogHandlerLogFileFree(file); virObjectUnlock(handler); return -1; diff --git a/src/logging/log_handler.h b/src/logging/log_handler.h index 1ad755e927a1de9326865a88ee878c192a17468f..e41ac7fa068a4f13523bb680223a8c40171e0471 100644 --- a/src/logging/log_handler.h +++ b/src/logging/log_handler.h @@ -30,9 +30,16 @@ typedef struct _virLogHandler virLogHandler; typedef virLogHandler *virLogHandlerPtr; -virLogHandlerPtr virLogHandlerNew(bool privileged); +typedef void (*virLogHandlerShutdownInhibitor)(bool inhibit, + void *opaque); + +virLogHandlerPtr virLogHandlerNew(bool privileged, + virLogHandlerShutdownInhibitor inhibitor, + void *opaque); virLogHandlerPtr virLogHandlerNewPostExecRestart(virJSONValuePtr child, - bool privileged); + bool privileged, + virLogHandlerShutdownInhibitor inhibitor, + void *opaque); void virLogHandlerFree(virLogHandlerPtr handler);