提交 50896b28 编写于 作者: D Daniel P. Berrange

logging: change log protocol to be more reusable

The current virtlogd RPC protocol provides the ability to
handle log files associated with QEMU stdout/err. The log
protocol messages take the virt driver, domain name and
use that to form a log file path. This is quite restrictive
as it prevents us re-using the same RPC protocol messages
for logging to char device backends where the filename
can be arbitrarily user specified. It is also bad because
it means we have 2 separate locations which have to decide
on logfile name.

This change alters the RPC protocol so that we pass the
desired log file path along when opening the log file
initially. Now the virt driver is exclusively in charge
of deciding the log filename
Signed-off-by: NDaniel P. Berrange <berrange@redhat.com>
上级 d4abb09d
...@@ -55,6 +55,7 @@ virLogManagerProtocolDispatchDomainOpenLogFile(virNetServerPtr server ATTRIBUTE_ ...@@ -55,6 +55,7 @@ virLogManagerProtocolDispatchDomainOpenLogFile(virNetServerPtr server ATTRIBUTE_
args->driver, args->driver,
(unsigned char *)args->dom.uuid, (unsigned char *)args->dom.uuid,
args->dom.name, args->dom.name,
args->path,
&inode, &offset)) < 0) &inode, &offset)) < 0)
goto cleanup; goto cleanup;
...@@ -87,9 +88,7 @@ virLogManagerProtocolDispatchDomainGetLogFilePosition(virNetServerPtr server ATT ...@@ -87,9 +88,7 @@ virLogManagerProtocolDispatchDomainGetLogFilePosition(virNetServerPtr server ATT
ino_t inode; ino_t inode;
if (virLogHandlerDomainGetLogFilePosition(virLogDaemonGetHandler(logDaemon), if (virLogHandlerDomainGetLogFilePosition(virLogDaemonGetHandler(logDaemon),
args->driver, args->path,
(unsigned char *)args->dom.uuid,
args->dom.name,
&inode, &offset) < 0) &inode, &offset) < 0)
goto cleanup; goto cleanup;
...@@ -125,9 +124,7 @@ virLogManagerProtocolDispatchDomainReadLogFile(virNetServerPtr server ATTRIBUTE_ ...@@ -125,9 +124,7 @@ virLogManagerProtocolDispatchDomainReadLogFile(virNetServerPtr server ATTRIBUTE_
} }
if ((data = virLogHandlerDomainReadLogFile(virLogDaemonGetHandler(logDaemon), if ((data = virLogHandlerDomainReadLogFile(virLogDaemonGetHandler(logDaemon),
args->driver, args->path,
(unsigned char *)args->dom.uuid,
args->dom.name,
args->pos.inode, args->pos.inode,
args->pos.offset, args->pos.offset,
args->maxlen)) == NULL) args->maxlen)) == NULL)
......
...@@ -351,59 +351,23 @@ virLogHandlerDispose(void *obj) ...@@ -351,59 +351,23 @@ virLogHandlerDispose(void *obj)
} }
static char *
virLogHandlerGetLogFilePathForDomain(virLogHandlerPtr handler,
const char *driver,
const unsigned char *domuuid ATTRIBUTE_UNUSED,
const char *domname)
{
char *path;
if (handler->privileged) {
if (virAsprintf(&path,
LOCALSTATEDIR "/log/libvirt/%s/%s.log",
driver, domname) < 0)
return NULL;
} else {
char *cachedir;
cachedir = virGetUserCacheDirectory();
if (!cachedir)
return NULL;
if (virAsprintf(&path,
"%s/%s/log/%s.log", cachedir, driver, domname) < 0) {
VIR_FREE(cachedir);
return NULL;
}
}
return path;
}
int int
virLogHandlerDomainOpenLogFile(virLogHandlerPtr handler, virLogHandlerDomainOpenLogFile(virLogHandlerPtr handler,
const char *driver, const char *driver,
const unsigned char *domuuid, const unsigned char *domuuid,
const char *domname, const char *domname,
const char *path,
ino_t *inode, ino_t *inode,
off_t *offset) off_t *offset)
{ {
size_t i; size_t i;
virLogHandlerLogFilePtr file = NULL; virLogHandlerLogFilePtr file = NULL;
int pipefd[2] = { -1, -1 }; int pipefd[2] = { -1, -1 };
char *path;
virObjectLock(handler); virObjectLock(handler);
handler->inhibitor(true, handler->opaque); handler->inhibitor(true, handler->opaque);
if (!(path = virLogHandlerGetLogFilePathForDomain(handler,
driver,
domuuid,
domname)))
goto error;
for (i = 0; i < handler->nfiles; i++) { for (i = 0; i < handler->nfiles; i++) {
if (STREQ(virRotatingFileWriterGetPath(handler->files[i]->file), if (STREQ(virRotatingFileWriterGetPath(handler->files[i]->file),
path)) { path)) {
...@@ -449,8 +413,6 @@ virLogHandlerDomainOpenLogFile(virLogHandlerPtr handler, ...@@ -449,8 +413,6 @@ virLogHandlerDomainOpenLogFile(virLogHandlerPtr handler,
goto error; goto error;
} }
VIR_FREE(path);
*inode = virRotatingFileWriterGetINode(file->file); *inode = virRotatingFileWriterGetINode(file->file);
*offset = virRotatingFileWriterGetOffset(file->file); *offset = virRotatingFileWriterGetOffset(file->file);
...@@ -458,7 +420,6 @@ virLogHandlerDomainOpenLogFile(virLogHandlerPtr handler, ...@@ -458,7 +420,6 @@ virLogHandlerDomainOpenLogFile(virLogHandlerPtr handler,
return pipefd[1]; return pipefd[1];
error: error:
VIR_FREE(path);
VIR_FORCE_CLOSE(pipefd[0]); VIR_FORCE_CLOSE(pipefd[0]);
VIR_FORCE_CLOSE(pipefd[1]); VIR_FORCE_CLOSE(pipefd[1]);
handler->inhibitor(false, handler->opaque); handler->inhibitor(false, handler->opaque);
...@@ -470,25 +431,16 @@ virLogHandlerDomainOpenLogFile(virLogHandlerPtr handler, ...@@ -470,25 +431,16 @@ virLogHandlerDomainOpenLogFile(virLogHandlerPtr handler,
int int
virLogHandlerDomainGetLogFilePosition(virLogHandlerPtr handler, virLogHandlerDomainGetLogFilePosition(virLogHandlerPtr handler,
const char *driver, const char *path,
const unsigned char *domuuid,
const char *domname,
ino_t *inode, ino_t *inode,
off_t *offset) off_t *offset)
{ {
char *path;
virLogHandlerLogFilePtr file = NULL; virLogHandlerLogFilePtr file = NULL;
int ret = -1; int ret = -1;
size_t i; size_t i;
virObjectLock(handler); virObjectLock(handler);
if (!(path = virLogHandlerGetLogFilePathForDomain(handler,
driver,
domuuid,
domname)))
goto cleanup;
for (i = 0; i < handler->nfiles; i++) { for (i = 0; i < handler->nfiles; i++) {
if (STREQ(virRotatingFileWriterGetPath(handler->files[i]->file), if (STREQ(virRotatingFileWriterGetPath(handler->files[i]->file),
path)) { path)) {
...@@ -499,8 +451,8 @@ virLogHandlerDomainGetLogFilePosition(virLogHandlerPtr handler, ...@@ -499,8 +451,8 @@ virLogHandlerDomainGetLogFilePosition(virLogHandlerPtr handler,
if (!file) { if (!file) {
virReportError(VIR_ERR_INTERNAL_ERROR, virReportError(VIR_ERR_INTERNAL_ERROR,
_("No open log file for domain %s"), _("No open log file %s"),
domname); path);
goto cleanup; goto cleanup;
} }
...@@ -510,7 +462,6 @@ virLogHandlerDomainGetLogFilePosition(virLogHandlerPtr handler, ...@@ -510,7 +462,6 @@ virLogHandlerDomainGetLogFilePosition(virLogHandlerPtr handler,
ret = 0; ret = 0;
cleanup: cleanup:
VIR_FREE(path);
virObjectUnlock(handler); virObjectUnlock(handler);
return ret; return ret;
} }
...@@ -518,26 +469,17 @@ virLogHandlerDomainGetLogFilePosition(virLogHandlerPtr handler, ...@@ -518,26 +469,17 @@ virLogHandlerDomainGetLogFilePosition(virLogHandlerPtr handler,
char * char *
virLogHandlerDomainReadLogFile(virLogHandlerPtr handler, virLogHandlerDomainReadLogFile(virLogHandlerPtr handler,
const char *driver, const char *path,
const unsigned char *domuuid,
const char *domname,
ino_t inode, ino_t inode,
off_t offset, off_t offset,
size_t maxlen) size_t maxlen)
{ {
char *path;
virRotatingFileReaderPtr file = NULL; virRotatingFileReaderPtr file = NULL;
char *data = NULL; char *data = NULL;
ssize_t got; ssize_t got;
virObjectLock(handler); virObjectLock(handler);
if (!(path = virLogHandlerGetLogFilePathForDomain(handler,
driver,
domuuid,
domname)))
goto error;
if (!(file = virRotatingFileReaderNew(path, DEFAULT_MAX_BACKUP))) if (!(file = virRotatingFileReaderNew(path, DEFAULT_MAX_BACKUP)))
goto error; goto error;
...@@ -554,11 +496,9 @@ virLogHandlerDomainReadLogFile(virLogHandlerPtr handler, ...@@ -554,11 +496,9 @@ virLogHandlerDomainReadLogFile(virLogHandlerPtr handler,
virRotatingFileReaderFree(file); virRotatingFileReaderFree(file);
virObjectUnlock(handler); virObjectUnlock(handler);
VIR_FREE(path);
return data; return data;
error: error:
VIR_FREE(path);
VIR_FREE(data); VIR_FREE(data);
virRotatingFileReaderFree(file); virRotatingFileReaderFree(file);
virObjectUnlock(handler); virObjectUnlock(handler);
......
...@@ -47,20 +47,17 @@ int virLogHandlerDomainOpenLogFile(virLogHandlerPtr handler, ...@@ -47,20 +47,17 @@ int virLogHandlerDomainOpenLogFile(virLogHandlerPtr handler,
const char *driver, const char *driver,
const unsigned char *domuuid, const unsigned char *domuuid,
const char *domname, const char *domname,
const char *path,
ino_t *inode, ino_t *inode,
off_t *offset); off_t *offset);
int virLogHandlerDomainGetLogFilePosition(virLogHandlerPtr handler, int virLogHandlerDomainGetLogFilePosition(virLogHandlerPtr handler,
const char *driver, const char *path,
const unsigned char *domuuid,
const char *domname,
ino_t *inode, ino_t *inode,
off_t *offset); off_t *offset);
char *virLogHandlerDomainReadLogFile(virLogHandlerPtr handler, char *virLogHandlerDomainReadLogFile(virLogHandlerPtr handler,
const char *driver, const char *path,
const unsigned char *domuuid,
const char *domname,
ino_t inode, ino_t inode,
off_t offset, off_t offset,
size_t maxlen); size_t maxlen);
......
...@@ -156,6 +156,7 @@ virLogManagerDomainOpenLogFile(virLogManagerPtr mgr, ...@@ -156,6 +156,7 @@ virLogManagerDomainOpenLogFile(virLogManagerPtr mgr,
const char *driver, const char *driver,
const unsigned char *domuuid, const unsigned char *domuuid,
const char *domname, const char *domname,
const char *path,
unsigned int flags, unsigned int flags,
ino_t *inode, ino_t *inode,
off_t *offset) off_t *offset)
...@@ -172,6 +173,7 @@ virLogManagerDomainOpenLogFile(virLogManagerPtr mgr, ...@@ -172,6 +173,7 @@ virLogManagerDomainOpenLogFile(virLogManagerPtr mgr,
args.driver = (char *)driver; args.driver = (char *)driver;
memcpy(args.dom.uuid, domuuid, VIR_UUID_BUFLEN); memcpy(args.dom.uuid, domuuid, VIR_UUID_BUFLEN);
args.dom.name = (char *)domname; args.dom.name = (char *)domname;
args.path = (char *)path;
args.flags = flags; args.flags = flags;
if (virNetClientProgramCall(mgr->program, if (virNetClientProgramCall(mgr->program,
...@@ -211,9 +213,7 @@ virLogManagerDomainOpenLogFile(virLogManagerPtr mgr, ...@@ -211,9 +213,7 @@ virLogManagerDomainOpenLogFile(virLogManagerPtr mgr,
int int
virLogManagerDomainGetLogFilePosition(virLogManagerPtr mgr, virLogManagerDomainGetLogFilePosition(virLogManagerPtr mgr,
const char *driver, const char *path,
const unsigned char *domuuid,
const char *domname,
unsigned int flags, unsigned int flags,
ino_t *inode, ino_t *inode,
off_t *offset) off_t *offset)
...@@ -225,9 +225,7 @@ virLogManagerDomainGetLogFilePosition(virLogManagerPtr mgr, ...@@ -225,9 +225,7 @@ virLogManagerDomainGetLogFilePosition(virLogManagerPtr mgr,
memset(&args, 0, sizeof(args)); memset(&args, 0, sizeof(args));
memset(&ret, 0, sizeof(ret)); memset(&ret, 0, sizeof(ret));
args.driver = (char *)driver; args.path = (char *)path;
memcpy(args.dom.uuid, domuuid, VIR_UUID_BUFLEN);
args.dom.name = (char *)domname;
args.flags = flags; args.flags = flags;
if (virNetClientProgramCall(mgr->program, if (virNetClientProgramCall(mgr->program,
...@@ -250,9 +248,7 @@ virLogManagerDomainGetLogFilePosition(virLogManagerPtr mgr, ...@@ -250,9 +248,7 @@ virLogManagerDomainGetLogFilePosition(virLogManagerPtr mgr,
char * char *
virLogManagerDomainReadLogFile(virLogManagerPtr mgr, virLogManagerDomainReadLogFile(virLogManagerPtr mgr,
const char *driver, const char *path,
const unsigned char *domuuid,
const char *domname,
ino_t inode, ino_t inode,
off_t offset, off_t offset,
size_t maxlen, size_t maxlen,
...@@ -267,9 +263,7 @@ virLogManagerDomainReadLogFile(virLogManagerPtr mgr, ...@@ -267,9 +263,7 @@ virLogManagerDomainReadLogFile(virLogManagerPtr mgr,
memset(&args, 0, sizeof(args)); memset(&args, 0, sizeof(args));
memset(&ret, 0, sizeof(ret)); memset(&ret, 0, sizeof(ret));
args.driver = (char *)driver; args.path = (char *)path;
memcpy(args.dom.uuid, domuuid, VIR_UUID_BUFLEN);
args.dom.name = (char *)domname;
args.flags = flags; args.flags = flags;
args.pos.inode = inode; args.pos.inode = inode;
args.pos.offset = offset; args.pos.offset = offset;
......
...@@ -37,22 +37,19 @@ int virLogManagerDomainOpenLogFile(virLogManagerPtr mgr, ...@@ -37,22 +37,19 @@ int virLogManagerDomainOpenLogFile(virLogManagerPtr mgr,
const char *driver, const char *driver,
const unsigned char *domuuid, const unsigned char *domuuid,
const char *domname, const char *domname,
const char *path,
unsigned int flags, unsigned int flags,
ino_t *inode, ino_t *inode,
off_t *offset); off_t *offset);
int virLogManagerDomainGetLogFilePosition(virLogManagerPtr mgr, int virLogManagerDomainGetLogFilePosition(virLogManagerPtr mgr,
const char *driver, const char *path,
const unsigned char *domuuid,
const char *domname,
unsigned int flags, unsigned int flags,
ino_t *inode, ino_t *inode,
off_t *offset); off_t *offset);
char *virLogManagerDomainReadLogFile(virLogManagerPtr mgr, char *virLogManagerDomainReadLogFile(virLogManagerPtr mgr,
const char *driver, const char *path,
const unsigned char *domuuid,
const char *domname,
ino_t inode, ino_t inode,
off_t offset, off_t offset,
size_t maxlen, size_t maxlen,
......
...@@ -35,6 +35,7 @@ typedef struct virLogManagerProtocolLogFilePosition virLogManagerProtocolLogFile ...@@ -35,6 +35,7 @@ typedef struct virLogManagerProtocolLogFilePosition virLogManagerProtocolLogFile
struct virLogManagerProtocolDomainOpenLogFileArgs { struct virLogManagerProtocolDomainOpenLogFileArgs {
virLogManagerProtocolNonNullString driver; virLogManagerProtocolNonNullString driver;
virLogManagerProtocolDomain dom; virLogManagerProtocolDomain dom;
virLogManagerProtocolNonNullString path;
unsigned int flags; unsigned int flags;
}; };
...@@ -43,8 +44,7 @@ struct virLogManagerProtocolDomainOpenLogFileRet { ...@@ -43,8 +44,7 @@ struct virLogManagerProtocolDomainOpenLogFileRet {
}; };
struct virLogManagerProtocolDomainGetLogFilePositionArgs { struct virLogManagerProtocolDomainGetLogFilePositionArgs {
virLogManagerProtocolNonNullString driver; virLogManagerProtocolNonNullString path;
virLogManagerProtocolDomain dom;
unsigned int flags; unsigned int flags;
}; };
...@@ -53,8 +53,7 @@ struct virLogManagerProtocolDomainGetLogFilePositionRet { ...@@ -53,8 +53,7 @@ struct virLogManagerProtocolDomainGetLogFilePositionRet {
}; };
struct virLogManagerProtocolDomainReadLogFileArgs { struct virLogManagerProtocolDomainReadLogFileArgs {
virLogManagerProtocolNonNullString driver; virLogManagerProtocolNonNullString path;
virLogManagerProtocolDomain dom;
virLogManagerProtocolLogFilePosition pos; virLogManagerProtocolLogFilePosition pos;
unsigned hyper maxlen; unsigned hyper maxlen;
unsigned int flags; unsigned int flags;
......
...@@ -85,8 +85,7 @@ struct _qemuDomainLogContext { ...@@ -85,8 +85,7 @@ struct _qemuDomainLogContext {
int readfd; /* Only used if manager == NULL */ int readfd; /* Only used if manager == NULL */
off_t pos; off_t pos;
ino_t inode; /* Only used if manager != NULL */ ino_t inode; /* Only used if manager != NULL */
unsigned char uuid[VIR_UUID_BUFLEN]; /* Only used if manager != NULL */ char *path;
char *name; /* Only used if manager != NULL */
virLogManagerPtr manager; virLogManagerPtr manager;
}; };
...@@ -2285,7 +2284,6 @@ qemuDomainLogContextPtr qemuDomainLogContextNew(virQEMUDriverPtr driver, ...@@ -2285,7 +2284,6 @@ qemuDomainLogContextPtr qemuDomainLogContextNew(virQEMUDriverPtr driver,
{ {
virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
qemuDomainLogContextPtr ctxt = NULL; qemuDomainLogContextPtr ctxt = NULL;
char *logfile = NULL;
if (VIR_ALLOC(ctxt) < 0) if (VIR_ALLOC(ctxt) < 0)
goto error; goto error;
...@@ -2295,37 +2293,33 @@ qemuDomainLogContextPtr qemuDomainLogContextNew(virQEMUDriverPtr driver, ...@@ -2295,37 +2293,33 @@ qemuDomainLogContextPtr qemuDomainLogContextNew(virQEMUDriverPtr driver,
ctxt->readfd = -1; ctxt->readfd = -1;
virAtomicIntSet(&ctxt->refs, 1); virAtomicIntSet(&ctxt->refs, 1);
if (virAsprintf(&ctxt->path, "%s/%s.log", cfg->logDir, vm->def->name) < 0)
goto error;
if (cfg->stdioLogD) { if (cfg->stdioLogD) {
ctxt->manager = virLogManagerNew(virQEMUDriverIsPrivileged(driver)); ctxt->manager = virLogManagerNew(virQEMUDriverIsPrivileged(driver));
if (!ctxt->manager) if (!ctxt->manager)
goto error; goto error;
if (VIR_STRDUP(ctxt->name, vm->def->name) < 0)
goto error;
memcpy(ctxt->uuid, vm->def->uuid, VIR_UUID_BUFLEN);
ctxt->writefd = virLogManagerDomainOpenLogFile(ctxt->manager, ctxt->writefd = virLogManagerDomainOpenLogFile(ctxt->manager,
"qemu", "qemu",
vm->def->uuid, vm->def->uuid,
vm->def->name, vm->def->name,
ctxt->path,
0, 0,
&ctxt->inode, &ctxt->inode,
&ctxt->pos); &ctxt->pos);
if (ctxt->writefd < 0) if (ctxt->writefd < 0)
goto error; goto error;
} else { } else {
if (virAsprintf(&logfile, "%s/%s.log", cfg->logDir, vm->def->name) < 0) if ((ctxt->writefd = open(ctxt->path, O_WRONLY | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR)) < 0) {
goto error;
if ((ctxt->writefd = open(logfile, O_WRONLY | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR)) < 0) {
virReportSystemError(errno, _("failed to create logfile %s"), virReportSystemError(errno, _("failed to create logfile %s"),
logfile); ctxt->path);
goto error; goto error;
} }
if (virSetCloseExec(ctxt->writefd) < 0) { if (virSetCloseExec(ctxt->writefd) < 0) {
virReportSystemError(errno, _("failed to set close-on-exec flag on %s"), virReportSystemError(errno, _("failed to set close-on-exec flag on %s"),
logfile); ctxt->path);
goto error; goto error;
} }
...@@ -2336,33 +2330,32 @@ qemuDomainLogContextPtr qemuDomainLogContextNew(virQEMUDriverPtr driver, ...@@ -2336,33 +2330,32 @@ qemuDomainLogContextPtr qemuDomainLogContextNew(virQEMUDriverPtr driver,
!virQEMUDriverIsPrivileged(driver) && !virQEMUDriverIsPrivileged(driver) &&
ftruncate(ctxt->writefd, 0) < 0) { ftruncate(ctxt->writefd, 0) < 0) {
virReportSystemError(errno, _("failed to truncate %s"), virReportSystemError(errno, _("failed to truncate %s"),
logfile); ctxt->path);
goto error; goto error;
} }
if (mode == QEMU_DOMAIN_LOG_CONTEXT_MODE_START) { if (mode == QEMU_DOMAIN_LOG_CONTEXT_MODE_START) {
if ((ctxt->readfd = open(logfile, O_RDONLY, S_IRUSR | S_IWUSR)) < 0) { if ((ctxt->readfd = open(ctxt->path, O_RDONLY, S_IRUSR | S_IWUSR)) < 0) {
virReportSystemError(errno, _("failed to open logfile %s"), virReportSystemError(errno, _("failed to open logfile %s"),
logfile); ctxt->path);
goto error; goto error;
} }
if (virSetCloseExec(ctxt->readfd) < 0) { if (virSetCloseExec(ctxt->readfd) < 0) {
virReportSystemError(errno, _("failed to set close-on-exec flag on %s"), virReportSystemError(errno, _("failed to set close-on-exec flag on %s"),
logfile); ctxt->path);
goto error; goto error;
} }
} }
if ((ctxt->pos = lseek(ctxt->writefd, 0, SEEK_END)) < 0) { if ((ctxt->pos = lseek(ctxt->writefd, 0, SEEK_END)) < 0) {
virReportSystemError(errno, _("failed to seek in log file %s"), virReportSystemError(errno, _("failed to seek in log file %s"),
logfile); ctxt->path);
goto error; goto error;
} }
} }
cleanup: cleanup:
virObjectUnref(cfg); virObjectUnref(cfg);
VIR_FREE(logfile);
return ctxt; return ctxt;
error: error:
...@@ -2415,9 +2408,7 @@ ssize_t qemuDomainLogContextRead(qemuDomainLogContextPtr ctxt, ...@@ -2415,9 +2408,7 @@ ssize_t qemuDomainLogContextRead(qemuDomainLogContextPtr ctxt,
size_t buflen; size_t buflen;
if (ctxt->manager) { if (ctxt->manager) {
buf = virLogManagerDomainReadLogFile(ctxt->manager, buf = virLogManagerDomainReadLogFile(ctxt->manager,
"qemu", ctxt->path,
ctxt->uuid,
ctxt->name,
ctxt->inode, ctxt->inode,
ctxt->pos, ctxt->pos,
1024 * 128, 1024 * 128,
...@@ -2466,9 +2457,7 @@ void qemuDomainLogContextMarkPosition(qemuDomainLogContextPtr ctxt) ...@@ -2466,9 +2457,7 @@ void qemuDomainLogContextMarkPosition(qemuDomainLogContextPtr ctxt)
{ {
if (ctxt->manager) if (ctxt->manager)
virLogManagerDomainGetLogFilePosition(ctxt->manager, virLogManagerDomainGetLogFilePosition(ctxt->manager,
"qemu", ctxt->path,
ctxt->uuid,
ctxt->name,
0, 0,
&ctxt->inode, &ctxt->inode,
&ctxt->pos); &ctxt->pos);
...@@ -2497,7 +2486,7 @@ void qemuDomainLogContextFree(qemuDomainLogContextPtr ctxt) ...@@ -2497,7 +2486,7 @@ void qemuDomainLogContextFree(qemuDomainLogContextPtr ctxt)
return; return;
virLogManagerFree(ctxt->manager); virLogManagerFree(ctxt->manager);
VIR_FREE(ctxt->name); VIR_FREE(ctxt->path);
VIR_FORCE_CLOSE(ctxt->writefd); VIR_FORCE_CLOSE(ctxt->writefd);
VIR_FORCE_CLOSE(ctxt->readfd); VIR_FORCE_CLOSE(ctxt->readfd);
VIR_FREE(ctxt); VIR_FREE(ctxt);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册