Package: libvirt / 0.8.3-5+squeeze5

0005-Autodetect-if-the-remote-nc-command-supports-the-q-o.patch Patch series | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
From: =?UTF-8?q?Guido=20G=C3=BCnther?= <agx@sigxcpu.org>
Date: Wed, 6 Oct 2010 18:12:46 +0200
Subject: [PATCH] Autodetect if the remote nc command supports the -q option

Author: Marc Deslauriers <marc.deslauriers@ubuntu.com>
Origin: other, based on http://hg.fedorahosted.org/hg/virt-manager/rev/1f781890ea4a
Origin: other, based on http://hg.fedorahosted.org/hg/virt-manager/rev/f09702cfdb03
Origin: other, based on http://hg.fedorahosted.org/hg/virt-manager/rev/907ee61e5558
Origin: other, based on http://hg.fedorahosted.org/hg/virt-manager/rev/16fcbf77e47e
Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/libvirt/+bug/517478
Ubuntu-Bug: https://bugs.launchpad.net/ubuntu/+source/virt-manager/+bug/605172
Bug: https://bugzilla.redhat.com/show_bug.cgi?id=562176
Bug: https://bugzilla.redhat.com/show_bug.cgi?id=614420
---
 src/remote/remote_driver.c |   47 +++++++++++++++++++++++++++++++++++++------
 1 files changed, 40 insertions(+), 7 deletions(-)

diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c
index cb0d8e1..5fab9c1 100644
--- a/src/remote/remote_driver.c
+++ b/src/remote/remote_driver.c
@@ -730,7 +730,8 @@ doRemoteOpen (virConnectPtr conn,
     }
 
     case trans_ssh: {
-        int j, nr_args = 6;
+        int j, nr_args = 5;
+        virBuffer cmd_netcat = VIR_BUFFER_INITIALIZER;
 
         if (username) nr_args += 2; /* For -l username */
         if (no_tty) nr_args += 5;   /* For -T -o BatchMode=yes -e none */
@@ -763,12 +764,44 @@ doRemoteOpen (virConnectPtr conn,
             cmd_argv[j++] = strdup ("none");
         }
         cmd_argv[j++] = strdup (priv->hostname);
-        cmd_argv[j++] = strdup (netcat ? netcat : "nc");
-        cmd_argv[j++] = strdup ("-U");
-        cmd_argv[j++] = strdup (sockname ? sockname :
-                                (flags & VIR_CONNECT_RO
-                                 ? LIBVIRTD_PRIV_UNIX_SOCKET_RO
-                                 : LIBVIRTD_PRIV_UNIX_SOCKET));
+        cmd_argv[j++] = strdup ("sh -c");
+
+	/*
+	 * This ugly thing is a shell script to detect availability of
+	 * the -q option for 'nc': debian and suse based distros need this
+	 * flag to ensure the remote nc will exit on EOF, so it will go away
+	 * when we close the VNC tunnel. If it doesn't go away, subsequent
+	 * VNC connection attempts will hang.
+	 *
+	 * Fedora's 'nc' doesn't have this option, and apparently defaults
+	 * to the desired behavior.
+	 */
+
+        virBufferVSprintf(&cmd_netcat, "'%s -q 2>&1 | grep -q \"requires an argument\";"
+                                       "if [ $? -eq 0 ] ; then"
+                                       "   CMD=\"%s -q 0 -U %s\";"
+                                       "else"
+                                       "   CMD=\"%s -U %s\";"
+                                       "fi;"
+                                       "eval \"$CMD\";'",
+                                       netcat ? netcat : "nc",
+                                       netcat ? netcat : "nc",
+                                       sockname ? sockname :
+                                        (flags & VIR_CONNECT_RO
+                                         ? LIBVIRTD_PRIV_UNIX_SOCKET_RO
+                                         : LIBVIRTD_PRIV_UNIX_SOCKET),
+                                       netcat ? netcat : "nc",
+                                       sockname ? sockname :
+                                        (flags & VIR_CONNECT_RO
+                                         ? LIBVIRTD_PRIV_UNIX_SOCKET_RO
+                                         : LIBVIRTD_PRIV_UNIX_SOCKET));
+
+        if (virBufferError(&cmd_netcat)) {
+            virBufferFreeAndReset(&cmd_netcat);
+            goto out_of_memory;
+        }
+
+        cmd_argv[j++] = virBufferContentAndReset(&cmd_netcat);
         cmd_argv[j++] = 0;
         assert (j == nr_args);
         for (j = 0; j < (nr_args-1); j++)
--