
On 30.12.2012 10:25, Osier Yang wrote:
On 2012年12月29日 17:09, Michal Privoznik wrote:
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")) {
I don't see why it's the new style with "char" here with regard to the new output string like "char device serial1 redirected to /dev/pts/7". Should it be below instead?
if (!STRPREFIX(tmp, "redirected")) or if (STRPREFIX(tmp, alias))
I should have documented that. If you take look at qemuBuildChrChardevStr() you can see, that all char devices IDs are constructed as "id=char%s", where %s is substituted device alias. Hence qemu sees 'charalias0' instead of bare 'alias0'. Therefore we should check for 'char' prefix. Michal