[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