On 2012年06月09日 07:42, Eric Blake wrote:
If a user invokes 'virsh -c $URI', then within that batch shell,
they probably want 'connect' to revert to $URI rather than the
normal default URI you get for passing in NULL.

In particular, I had a setup where qemu:///session was failing,
but took 20 seconds to fail; since 'make -C tests check TESTS=virsh-all'
exercises the command 'virsh -c test:///default connect' without
arguments, it was locking up for 20 seconds trying to connect to
qemu, even though the testsuite specifically wants to limit itself
to the test:///default URI.

* tools/virsh.c (__vshControl): Add member.
(main, vshParseArgv): Set it.
(vshDeinit): Clean it up.
(cmdConnect): Use it to reopen to original connection.
---

This doesn't fix the root cause of this problem:
https://www.redhat.com/archives/libvir-list/2012-June/msg00237.html
but at least it makes my 'make check' runs faster while
I still investigate the root problem.

  tools/virsh.c |   10 +++++++---
  1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/tools/virsh.c b/tools/virsh.c
index 0453b95..b28dc49 100644
--- a/tools/virsh.c
+++ b/tools/virsh.c
@@ -241,6 +241,7 @@ typedef struct __vshCmd {
   */
  typedef struct __vshControl {
      char *name;                 /* connection name */
+    char *default_name;         /* -c or env-var default when name is NULL */
      virConnectPtr conn;         /* connection to hypervisor (MAY BE NULL) */
      vshCmd *cmd;                /* the current command */
      char *cmdstr;               /* string with command */
@@ -856,7 +857,7 @@ cmdConnect(vshControl *ctl, const vshCmd *cmd)
          vshError(ctl, "%s", _("Please specify valid connection URI"));
          return false;
      }
-    ctl->name = vshStrdup(ctl, name);
+    ctl->name = vshStrdup(ctl, name ? name : ctl->default_name);

      ctl->useGetInfo = false;
      ctl->useSnapshotOld = false;
@@ -19922,6 +19923,7 @@ vshDeinit(vshControl *ctl)
      vshReadlineDeinit(ctl);
      vshCloseLogFile(ctl);
      VIR_FREE(ctl->name);
+    VIR_FREE(ctl->default_name);
      if (ctl->conn) {
          int ret;
          if ((ret = virConnectClose(ctl->conn)) != 0) {
@@ -20176,7 +20178,8 @@ vshParseArgv(vshControl *ctl, int argc, char **argv)
              ctl->timing = true;
              break;
          case 'c':
-            ctl->name = vshStrdup(ctl, optarg);
+            VIR_FREE(ctl->default_name);
+            ctl->default_name = vshStrdup(ctl, optarg);
              break;
          case 'v':
              if (STRNEQ_NULLABLE(optarg, "long")) {
@@ -20211,6 +20214,7 @@ vshParseArgv(vshControl *ctl, int argc, char **argv)
              exit(EXIT_FAILURE);
          }
      }
+    ctl->name = vshStrdup(ctl, ctl->default_name);

      if (argc>  optind) {
          /* parse command */
@@ -20268,7 +20272,7 @@ main(int argc, char **argv)
          progname++;

      if ((defaultConn = getenv("VIRSH_DEFAULT_CONNECT_URI"))) {
-        ctl->name = vshStrdup(ctl, defaultConn);
+        ctl->default_name = vshStrdup(ctl, defaultConn);
      }

      if (!vshParseArgv(ctl, argc, argv)) {

Isn't the following patch enough for the fix? The problem is just
caused by ctl->name is freed even if no --name is specified for
command 'connect'. Or I missed something obviously?

diff --git a/tools/virsh.c b/tools/virsh.c
index abcfbff..0c8b44d 100644
--- a/tools/virsh.c
+++ b/tools/virsh.c
@@ -851,12 +851,15 @@ cmdConnect(vshControl *ctl, const vshCmd *cmd)
         ctl->conn = NULL;
     }

-    VIR_FREE(ctl->name);
     if (vshCommandOptString(cmd, "name", &name) < 0) {
         vshError(ctl, "%s", _("Please specify valid connection URI"));
         return false;
     }
-    ctl->name = vshStrdup(ctl, name);
+
+    if (name) {
+        VIR_FREE(ctl->name);
+        ctl->name = vshStrdup(ctl, name);
+    }

     ctl->useGetInfo = false;
     ctl->useSnapshotOld = false;

Regards,
Osier

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Reply via email to