提交 28224c4d 编写于 作者: M Michal Privoznik

qemu: Adapt to new log format

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.
上级 ce753ec5
...@@ -1431,22 +1431,45 @@ cleanup: ...@@ -1431,22 +1431,45 @@ cleanup:
* *
* char device redirected to /dev/pts/3 * 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 * Returns -1 for error, 0 success, 1 continue reading
*/ */
static int static int
qemuProcessExtractTTYPath(const char *haystack, qemuProcessExtractTTYPath(const char *haystack,
size_t *offset, size_t *offset,
const char *alias,
char **path) char **path)
{ {
static const char needle[] = "char device redirected to"; static const char *needle[] = {"char device", "redirected to"};
char *tmp, *dev; const char *tmp, *dev;
VIR_FREE(*path); VIR_FREE(*path);
/* First look for our magic string */ /* First look for our magic string */
if (!(tmp = strstr(haystack + *offset, needle))) { if (!(tmp = strstr(haystack + *offset, needle[0])))
return 1; return 1;
tmp += strlen(needle[0]);
virSkipSpaces(&tmp);
/* We prepend character devices IDs with 'char' prefix,
* hence full device ID is 'charalias0' */
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; dev = tmp;
/* /*
...@@ -1569,6 +1592,7 @@ qemuProcessFindCharDevicePTYs(virDomainObjPtr vm, ...@@ -1569,6 +1592,7 @@ qemuProcessFindCharDevicePTYs(virDomainObjPtr vm,
virDomainChrDefPtr chr = vm->def->serials[i]; virDomainChrDefPtr chr = vm->def->serials[i];
if (chr->source.type == VIR_DOMAIN_CHR_TYPE_PTY) { if (chr->source.type == VIR_DOMAIN_CHR_TYPE_PTY) {
if ((ret = qemuProcessExtractTTYPath(output, &offset, if ((ret = qemuProcessExtractTTYPath(output, &offset,
chr->info.alias,
&chr->source.data.file.path)) != 0) &chr->source.data.file.path)) != 0)
return ret; return ret;
} }
...@@ -1579,6 +1603,7 @@ qemuProcessFindCharDevicePTYs(virDomainObjPtr vm, ...@@ -1579,6 +1603,7 @@ qemuProcessFindCharDevicePTYs(virDomainObjPtr vm,
virDomainChrDefPtr chr = vm->def->parallels[i]; virDomainChrDefPtr chr = vm->def->parallels[i];
if (chr->source.type == VIR_DOMAIN_CHR_TYPE_PTY) { if (chr->source.type == VIR_DOMAIN_CHR_TYPE_PTY) {
if ((ret = qemuProcessExtractTTYPath(output, &offset, if ((ret = qemuProcessExtractTTYPath(output, &offset,
chr->info.alias,
&chr->source.data.file.path)) != 0) &chr->source.data.file.path)) != 0)
return ret; return ret;
} }
...@@ -1589,6 +1614,7 @@ qemuProcessFindCharDevicePTYs(virDomainObjPtr vm, ...@@ -1589,6 +1614,7 @@ qemuProcessFindCharDevicePTYs(virDomainObjPtr vm,
virDomainChrDefPtr chr = vm->def->channels[i]; virDomainChrDefPtr chr = vm->def->channels[i];
if (chr->source.type == VIR_DOMAIN_CHR_TYPE_PTY) { if (chr->source.type == VIR_DOMAIN_CHR_TYPE_PTY) {
if ((ret = qemuProcessExtractTTYPath(output, &offset, if ((ret = qemuProcessExtractTTYPath(output, &offset,
chr->info.alias,
&chr->source.data.file.path)) != 0) &chr->source.data.file.path)) != 0)
return ret; return ret;
} }
...@@ -1608,6 +1634,7 @@ qemuProcessFindCharDevicePTYs(virDomainObjPtr vm, ...@@ -1608,6 +1634,7 @@ qemuProcessFindCharDevicePTYs(virDomainObjPtr vm,
if (chr->source.type == VIR_DOMAIN_CHR_TYPE_PTY && if (chr->source.type == VIR_DOMAIN_CHR_TYPE_PTY &&
chr->targetType == VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_VIRTIO) { chr->targetType == VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_VIRTIO) {
if ((ret = qemuProcessExtractTTYPath(output, &offset, if ((ret = qemuProcessExtractTTYPath(output, &offset,
chr->info.alias,
&chr->source.data.file.path)) != 0) &chr->source.data.file.path)) != 0)
return ret; return ret;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册