[X2Go-Commits] [libx2goclient] 17/44: src/x2goclient-network-ssh.c: implement master connection status check.

git-admin at x2go.org git-admin at x2go.org
Fri Sep 18 01:55:38 CEST 2020


This is an automated email from the git hooks/post-receive script.

x2go pushed a commit to branch master
in repository libx2goclient.

commit 9ac958189ccf99fab481be438297a6ad35834fa1
Author: Mihai Moldovan <ionic at ionic.de>
Date:   Fri Jul 31 12:06:59 2020 +0200

    src/x2goclient-network-ssh.c: implement master connection status check.
---
 src/x2goclient-network-ssh.c | 75 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 75 insertions(+)

diff --git a/src/x2goclient-network-ssh.c b/src/x2goclient-network-ssh.c
index 635aecf..74740f7 100644
--- a/src/x2goclient-network-ssh.c
+++ b/src/x2goclient-network-ssh.c
@@ -104,6 +104,7 @@ struct _X2GoClientNetworkSSH {
 
   char *control_path;
   gboolean active_master_conn;
+  guint check_timeout;
 };
 
 G_DEFINE_TYPE (X2GoClientNetworkSSH, x2goclient_network_ssh, X2GOCLIENT_TYPE_NETWORK);
@@ -137,6 +138,9 @@ static gboolean x2goclient_network_ssh_gptrarray_to_string (GPtrArray * const ar
 static void x2goclient_network_ssh_gptrarray_print_debug (GPtrArray * const arr, const gchar * const prelude, const gchar * const desc);
 static gboolean x2goclient_network_ssh_sshcmd_add_host_port (X2GoClientNetworkSSH * const self, GPtrArray * const ssh_cmd, GError ** const gerr);
 static gboolean x2goclient_network_ssh_start_sshcmd (X2GoClientNetworkSSH * const self, const GPtrArray * const ssh_cmd, GError ** const gerr, const gboolean master);
+static gboolean x2goclient_network_ssh_start_check_timeout (X2GoClientNetworkSSH * const self, GError ** const gerr);
+
+static gboolean x2goclient_network_ssh_check_timeout (const gpointer self);
 
 
 static void x2goclient_network_ssh_class_init (X2GoClientNetworkSSHClass * const klass) {
@@ -175,6 +179,7 @@ static void x2goclient_network_ssh_init (X2GoClientNetworkSSH * const self) {
 
   self->control_path = NULL;
   self->active_master_conn = FALSE;
+  self->check_timeout = 0;
 }
 
 X2GoClientNetworkSSH* x2goclient_network_ssh_new (const char * const session_path) {
@@ -219,6 +224,13 @@ static void x2goclient_network_ssh_finalize (GObject * const object) {
    * connection, so make sure that the dependencies are set up correctly here.
    */
 
+  if (self->check_timeout) {
+    if (!(g_source_remove (self->check_timeout))) {
+      g_log (NULL, G_LOG_LEVEL_CRITICAL, "Unable to remove timeout with ID %u.", self->check_timeout);
+    }
+  }
+  self->check_timeout = 0;
+
   if (!(x2goclient_network_ssh_kill_subprocesses (self))) {
     g_log (NULL, G_LOG_LEVEL_CRITICAL, "Some subprocesses were not terminated correctly!");
   }
@@ -876,6 +888,10 @@ static gboolean x2goclient_network_ssh_parent_connect (X2GoClientNetwork * const
     self->active_master_conn = ret = x2goclient_network_ssh_start_sshcmd (self, ssh_cmd, gerr, TRUE);
   }
 
+  if (ret) {
+    ret = x2goclient_network_ssh_start_check_timeout (self, gerr);
+  }
+
   g_free (session_path);
   session_path = NULL;
 
@@ -1350,3 +1366,62 @@ static gboolean x2goclient_network_ssh_start_sshcmd (X2GoClientNetworkSSH * cons
 
   return (ret);
 }
+
+static gboolean x2goclient_network_ssh_start_check_timeout (X2GoClientNetworkSSH * const self, GError ** const gerr) {
+  gboolean ret = FALSE;
+
+  g_return_val_if_fail (X2GOCLIENT_IS_NETWORK_SSH (self), ret);
+  g_return_val_if_fail (((NULL == gerr) || (NULL == *gerr)), ret);
+
+  guint check_id = g_timeout_add (50, &x2goclient_network_ssh_check_timeout, self);
+
+  ret = (!(!(check_id)));
+
+  if (ret) {
+    self->check_timeout = check_id;
+  }
+
+  return (ret);
+}
+
+static gboolean x2goclient_network_ssh_check_timeout (const gpointer data) {
+  gboolean ret = FALSE;
+
+  X2GoClientNetworkSSH *self = X2GOCLIENT_NETWORK_SSH (data);
+
+  g_return_val_if_fail (X2GOCLIENT_IS_NETWORK_SSH (self), ret);
+
+  GPtrArray *ssh_cmd = g_ptr_array_new_with_free_func (&x2goclient_clear_strings);
+  g_ptr_array_add (ssh_cmd, g_strdup ("ssh"));
+
+  /* Add control path options. */
+  g_ptr_array_add (ssh_cmd, g_strdup ("-o"));
+  g_ptr_array_add (ssh_cmd, g_strdup_printf ("ControlPath=\"%s\"", self->control_path));
+
+  /* Add master socket command. */
+  g_ptr_array_add (ssh_cmd, g_strdup ("-O"));
+  g_ptr_array_add (ssh_cmd, g_strdup ("check"));
+
+  ret = x2goclient_network_ssh_sshcmd_add_host_port (self, ssh_cmd, NULL);
+
+  if (ret) {
+    /* Zero-terminate. */
+    g_ptr_array_add (ssh_cmd, NULL);
+
+    /* Okay, execute. */
+    x2goclient_network_ssh_gptrarray_print_debug (ssh_cmd, "Checking master connection statuus via:", "OpenSSH client command");
+
+    g_log (NULL, G_LOG_LEVEL_DEBUG, "Launching!");
+    ret = x2goclient_network_ssh_start_sshcmd (self, ssh_cmd, NULL, FALSE);
+  }
+
+  if (!(ret)) {
+    /* We'll return FALSE, so make sure to reset the instance variable. */
+    self->check_timeout = 0;
+
+    /* Also, mark the master connection is terminated/gone. */
+    self->active_master_conn = FALSE;
+  }
+
+  return (ret);
+}

--
Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/libx2goclient.git


More information about the x2go-commits mailing list