[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

Re: [libvirt] [PATCH] qemu: Adapt to new log format



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))

+        /* 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;
              }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]