[libvirt] [PATCH 3/3] Get QEMU pty paths from the monitor
Daniel Veillard
veillard at redhat.com
Mon Dec 14 10:10:49 UTC 2009
On Wed, Nov 25, 2009 at 11:31:37AM +0000, Daniel P. Berrange wrote:
> On Mon, Nov 23, 2009 at 12:30:29PM +0000, Matthew Booth wrote:
> > @@ -1291,7 +1330,7 @@ qemudWaitForMonitor(virConnectPtr conn,
> > {
> > char buf[4096]; /* Plenty of space to get startup greeting */
> > int logfd;
> > - int ret;
> > + int ret = -1;
> >
> > if ((logfd = qemudLogReadFD(conn, driver->logDir, vm->def->name, pos))
> > < 0)
> > @@ -1317,7 +1356,32 @@ qemudWaitForMonitor(virConnectPtr conn,
> > if (qemuConnectMonitor(vm) < 0)
> > return -1;
> >
> > - return 0;
> > + /* Try to get the pty path mappings again via the monitor. This is much more
> > + * reliable if it's available.
> > + * Note that the monitor itself can be on a pty, so we still need to try the
> > + * log output method. */
> > + virHashTablePtr paths = virHashCreate(0);
> > + if (paths == NULL) {
> > + virReportOOMError(NULL);
> > + goto cleanup;
> > + }
> > +
> > + qemuDomainObjEnterMonitor(vm);
>
> This needs to be EnterMonitorWithDriver(driver, vm), since the 'driver'
> is locked in this context
>
> > + qemuDomainObjPrivatePtr priv = vm->privateData;
> > + ret = qemuMonitorGetPtyPaths(priv->mon, paths);
> > + qemuDomainObjExitMonitor(vm);
>
> And ExitMonitorWithDriver
Loooks serious and was missing fro last patch so I made the change
> > + /* Path is everything after needle to the end of the line */
> > + *eol = '\0';
> > + char *path = needle + strlen(NEEDLE);
> > +
> > + virHashAddEntry(paths, id, strdup(path));
>
> Not checking OOM on strdup() here, or for failure of virHashAddEntry()
I fixed that too, I pushed the attached patch to clean those 2 issues,
please check :-)
Daniel
--
Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/
daniel at veillard.com | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library http://libvirt.org/
-------------- next part --------------
commit a7d1eb3c446fdbbd4183ba398c7f21a9fc0c1696
Author: Daniel Veillard <veillard at redhat.com>
Date: Mon Dec 14 11:05:55 2009 +0100
Fix a couple of problems in last patch
Those were pointed by DanB in his review but not yet fixed
* src/qemu/qemu_driver.c: qemudWaitForMonitor() use EnterMonitorWithDriver()
and ExitMonitorWithDriver() there
* src/qemu/qemu_monitor_text.c: checking fro strdu failure and hash
table add error in qemuMonitorTextGetPtyPaths()
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 7b8c447..5a61b8c 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -1534,10 +1534,10 @@ qemudWaitForMonitor(virConnectPtr conn,
goto cleanup;
}
- qemuDomainObjEnterMonitor(vm);
+ qemuDomainObjEnterMonitorWithDriver(driver, vm);
qemuDomainObjPrivatePtr priv = vm->privateData;
ret = qemuMonitorGetPtyPaths(priv->mon, paths);
- qemuDomainObjExitMonitor(vm);
+ qemuDomainObjExitMonitorWithDriver(driver, vm);
VIR_DEBUG("qemuMonitorGetPtyPaths returned %i", ret);
if (ret == 0) {
diff --git a/src/qemu/qemu_monitor_text.c b/src/qemu/qemu_monitor_text.c
index 3ed45ba..0cb9ea6 100644
--- a/src/qemu/qemu_monitor_text.c
+++ b/src/qemu/qemu_monitor_text.c
@@ -1650,9 +1650,19 @@ int qemuMonitorTextGetPtyPaths(qemuMonitorPtr mon,
/* Path is everything after needle to the end of the line */
*eol = '\0';
- char *path = needle + strlen(NEEDLE);
+ char *path = strdup(needle + strlen(NEEDLE));
+ if (path == NULL) {
+ virReportOOMError(NULL);
+ goto cleanup;
+ }
- virHashAddEntry(paths, id, strdup(path));
+ if (virHashAddEntry(paths, id, path) < 0) {
+ qemudReportError(NULL, NULL, NULL, VIR_ERR_OPERATION_FAILED,
+ _("failed to save chardev path '%s'"),
+ path);
+ VIR_FREE(path);
+ goto cleanup;
+ }
#undef NEEDLE
next:
More information about the libvir-list
mailing list