Since 586502189edf9fd0f89a83de96717a2ea826fdb0 qemu commit, the log
lines reporting chardev's path has changed from:
$ ./x86_64-softmmu/qemu-system-x86_64 -serial pty -serial pty -monitor pty
char device redirected to /dev/pts/5
char device redirected to /dev/pts/6
char device redirected to /dev/pts/7
to:
$ ./x86_64-softmmu/qemu-system-x86_64 -serial pty -serial pty -monitor pty
char device compat_monitor0 redirected to /dev/pts/5
char device serial0 redirected to /dev/pts/6
char device serial1 redirected to /dev/pts/7
However, with current code we are not prepared for such change, which
results in us being unable to start any domain.
---
src/qemu/qemu_process.c | 33 +++++++++++++++++++++++++++++----
1 file changed, 29 insertions(+), 4 deletions(-)
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index eac6553..29bd082 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -1431,22 +1431,43 @@ cleanup:
*
* char device redirected to /dev/pts/3
*
+ * However, since 1.4 the line we are looking for has changed to:
+ *
+ * char device <alias> redirected to /some/path
+ *
* Returns -1 for error, 0 success, 1 continue reading
*/
static int
qemuProcessExtractTTYPath(const char *haystack,
size_t *offset,
+ const char *alias,
char **path)
{
- static const char needle[] = "char device redirected to";
- char *tmp, *dev;
+ static const char *needle[] = {"char device", "redirected to"};
+ const char *tmp, *dev;
VIR_FREE(*path);
/* First look for our magic string */
- if (!(tmp = strstr(haystack + *offset, needle))) {
+ if (!(tmp = strstr(haystack + *offset, needle[0])))
return 1;
+
+ tmp += strlen(needle[0]);
+ virSkipSpaces(&tmp);
+
+ if (STRPREFIX(tmp, "char")) {
+ /* we are dealing with new style */
+ tmp += strlen("char");
+ if (!STRPREFIX(tmp, alias))
+ return 1;
+
+ tmp += strlen(alias);
+ virSkipSpaces(&tmp);
}
- tmp += sizeof(needle);
+
+ if (!STRPREFIX(tmp, needle[1]))
+ return 1;
+
+ tmp += strlen(needle[1]);
dev = tmp;
/*
@@ -1569,6 +1590,7 @@ qemuProcessFindCharDevicePTYs(virDomainObjPtr vm,
virDomainChrDefPtr chr = vm->def->serials[i];
if (chr->source.type == VIR_DOMAIN_CHR_TYPE_PTY) {
if ((ret = qemuProcessExtractTTYPath(output, &offset,
+ chr->info.alias,
&chr->source.data.file.path)) !=
0)
return ret;
}
@@ -1579,6 +1601,7 @@ qemuProcessFindCharDevicePTYs(virDomainObjPtr vm,
virDomainChrDefPtr chr = vm->def->parallels[i];
if (chr->source.type == VIR_DOMAIN_CHR_TYPE_PTY) {
if ((ret = qemuProcessExtractTTYPath(output, &offset,
+ chr->info.alias,
&chr->source.data.file.path)) !=
0)
return ret;
}
@@ -1589,6 +1612,7 @@ qemuProcessFindCharDevicePTYs(virDomainObjPtr vm,
virDomainChrDefPtr chr = vm->def->channels[i];
if (chr->source.type == VIR_DOMAIN_CHR_TYPE_PTY) {
if ((ret = qemuProcessExtractTTYPath(output, &offset,
+ chr->info.alias,
&chr->source.data.file.path)) !=
0)
return ret;
}
@@ -1608,6 +1632,7 @@ qemuProcessFindCharDevicePTYs(virDomainObjPtr vm,
if (chr->source.type == VIR_DOMAIN_CHR_TYPE_PTY &&
chr->targetType == VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_VIRTIO) {
if ((ret = qemuProcessExtractTTYPath(output, &offset,
+ chr->info.alias,
&chr->source.data.file.path))
!= 0)
return ret;
}
--
1.8.0.2