From 692a0295fe82a68c5b11b4d9f588b22b0008ebeb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= <marcandre.lureau@gmail.com>
Date: Mon, 8 Sep 2014 23:14:23 +0200
Subject: [PATCH] Use socat instead of nc if possible
It turns out that nc does not leave on server disconnect, and there
doesn't seem to be any option to do that, leaving client open, and
a bunch of idle processes.
Replacing nc with socat solves that, client is disconnected when
the VM is shut down, when the sever connection is closed.
https://bugzilla.redhat.com/show_bug.cgi?id=1030487
(cherry picked from commit 3eaecbb3a4d069cde18cb0ad1e93735e0b73ef72)
---
src/virt-viewer-app.c | 32 +++++++++++++++++++++++---------
1 file changed, 23 insertions(+), 9 deletions(-)
diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c
index 837f636..1abcc90 100644
--- a/src/virt-viewer-app.c
+++ b/src/virt-viewer-app.c
@@ -622,6 +622,7 @@ virt_viewer_app_open_tunnel_ssh(const char *sshhost,
const char *cmd[10];
char portstr[50];
int n = 0;
+ GString *cat;
cmd[n++] = "ssh";
if (sshport) {
@@ -634,17 +635,30 @@ virt_viewer_app_open_tunnel_ssh(const char *sshhost,
cmd[n++] = sshuser;
}
cmd[n++] = sshhost;
- cmd[n++] = "nc";
- if (port) {
- cmd[n++] = host;
- cmd[n++] = port;
- } else {
- cmd[n++] = "-U";
- cmd[n++] = unixsock;
- }
+
+ cat = g_string_new("if (command -v socat) >/dev/null 2>&1");
+
+ g_string_append(cat, "; then socat - ");
+ if (port)
+ g_string_append_printf(cat, "TCP:%s:%s", host, port);
+ else
+ g_string_append_printf(cat, "UNIX-CONNECT:%s", unixsock);
+
+ g_string_append(cat, "; else nc ");
+ if (port)
+ g_string_append_printf(cat, "%s %s", host, port);
+ else
+ g_string_append_printf(cat, "-U %s", unixsock);
+
+ g_string_append(cat, "; fi");
+
+ cmd[n++] = cat->str;
cmd[n++] = NULL;
- return virt_viewer_app_open_tunnel(cmd);
+ n = virt_viewer_app_open_tunnel(cmd);
+ g_string_free(cat, TRUE);
+
+ return n;
}
static int