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