virLogHandlerPtr virLogHandlerNewPostExecRestart(virJSONValuePtr object, bool privileged, virLogHandlerShutdownInhibitor inhibitor, void *opaque) { virLogHandlerPtr handler; virJSONValuePtr files; ssize_t n; size_t i; if (!(handler = virLogHandlerNew(privileged, inhibitor, opaque))) return NULL; if (!(files = virJSONValueObjectGet(object, "files"))) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Missing files data from JSON file")); goto error; } if ((n = virJSONValueArraySize(files)) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Malformed files data from JSON file")); goto error; } for (i = 0; i < n; i++) { virLogHandlerLogFilePtr file; virJSONValuePtr child = virJSONValueArrayGet(files, i); if (!(file = virLogHandlerLogFilePostExecRestart(handler, child))) goto error; if (VIR_APPEND_ELEMENT_COPY(handler->files, handler->nfiles, file) < 0) goto error; if ((file->watch = virEventAddHandle(file->pipefd, VIR_EVENT_HANDLE_READABLE, virLogHandlerDomainLogFileEvent, handler, NULL)) < 0) { VIR_DELETE_ELEMENT(handler->files, handler->nfiles - 1, handler->nfiles); goto error; } } return handler; error: virObjectUnref(handler); return NULL; }
static virLogDaemonPtr virLogDaemonNew(virLogDaemonConfigPtr config, bool privileged) { virLogDaemonPtr logd; if (VIR_ALLOC(logd) < 0) return NULL; if (virMutexInit(&logd->lock) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Unable to initialize mutex")); VIR_FREE(logd); return NULL; } if (!(logd->srv = virNetServerNew("virtlogd", 1, 1, 1, 0, config->max_clients, config->max_clients, -1, 0, NULL, virLogDaemonClientNew, virLogDaemonClientPreExecRestart, virLogDaemonClientFree, (void*)(intptr_t)(privileged ? 0x1 : 0x0)))) goto error; if (!(logd->dmn = virNetDaemonNew()) || virNetDaemonAddServer(logd->dmn, logd->srv) < 0) goto error; if (!(logd->handler = virLogHandlerNew(privileged, config->max_size, config->max_backups, virLogDaemonInhibitor, logd))) goto error; return logd; error: virLogDaemonFree(logd); return NULL; }