From eb2fad7e94ba9bf48787e24542931688b9926ca1 Mon Sep 17 00:00:00 2001 From: Daniel P. Berrange Date: Mon, 6 Jul 2009 15:45:04 +0100 Subject: [PATCH] Fix problem with QEMU monitor welcome prompt confusing libvirt after a libvirtd daemon restart with active guests * src/qemu_driver: Read and dicard pending monitor data before issuing new monitor commands. (cherry picked from commit 2d1f2e706c8b13571e1227df1c69b2302da35d5a) Fedora-patch: libvirt-0.6.2-monitor-prompt-discard.patch --- src/qemu_driver.c | 24 ++++++++++++++++++++++++ 1 files changed, 24 insertions(+), 0 deletions(-) diff --git a/src/qemu_driver.c b/src/qemu_driver.c index 3d3675c..5fc21a1 100644 --- a/src/qemu_driver.c +++ b/src/qemu_driver.c @@ -1636,6 +1636,28 @@ cleanup: qemuDriverUnlock(driver); } + +/* Throw away any data available on the monitor + * This is done before executing a command, in order + * to allow re-synchronization if something went badly + * wrong in the past. it also deals with problem of + * QEMU *sometimes* re-printing its initial greeting + * when we reconnect to the monitor after restarts. + */ +static void +qemuMonitorDiscardPendingData(virDomainObjPtr vm) { + char buf[1024]; + int ret = 0; + + /* Monitor is non-blocking, so just loop till we + * get -1 or 0. Don't bother with detecting + * errors, since we'll deal with that better later */ + do { + ret = read(vm->monitor, buf, sizeof (buf)-1); + } while (ret > 0); +} + + static int qemudMonitorCommandExtra(const virDomainObjPtr vm, const char *cmd, @@ -1647,6 +1669,8 @@ qemudMonitorCommandExtra(const virDomainObjPtr vm, size_t cmdlen = strlen(cmd); size_t extralen = extra ? strlen(extra) : 0; + qemuMonitorDiscardPendingData(vm); + if (safewrite(vm->monitor, cmd, cmdlen) != cmdlen) return -1; if (safewrite(vm->monitor, "\r", 1) != 1) -- 1.6.2.5