This is an automated email from the git hooks/post-receive script. x2go pushed a change to branch master in repository libx2goclient. from afb65da src/x2goclient-network-ssh.c: stop using g_printf (), use g_log () instead. new 3fe03ca src/x2goclient-openssh-version.c: typo fix in error string. new f8c71aa src/x2goclient-network-ssh.c: add active_master_conn instance variable, scheduled to replace master_conn. new 5d6eef0 src/x2goclient-network-ssh.c: fix UB when printing OpenSSH client command array elements being NULL (and hence not strings) and clean up the code a bit. new e536f54 src/x2goclient-network-ssh.c: replace "stderr" parameter to x2goclient_network_ssh_log_std_str () with "select_stderr". new 270b3f5 src/x2goclient-network-ssh.c: split out array printing routine into its own function. new e1100f6 src/x2goclient-network-ssh.c: rename x2goclient_network_ssh_ptrarray_print () to x2goclient_network_ssh_gptrarray_to_string () and fully rework it. new ca8983d src/x2goclient-network-ssh.c: add another helper function x2goclient_network_ssh_gptrarray_print_debug (), wrapping the GPtrArray printing to g_log () and its DEBUG target. new c57d50c misc src/: constify all function parameters. new fcb526e src/x2goclient-network-ssh.c: split out appending host (and, if applicable, port) to an GPtrArray to a new function called x2goclient_network_ssh_sshcmd_add_host_port (). new b98389b src/x2goclient-network-ssh.c: don't assign NULL to a (g)boolean. new d8ec4e0 src/x2goclient-network-ssh.{c,h}: split out OpenSSH client process spawning into a separate function called x2goclient_network_ssh_start_sshcmd (). new b871c1b src/x2goclient-network-ssh.c: rewrite x2goclient_network_ssh_kill_subprocesses () to not kill an actual process but spawn an OpenSSH client process executing an exit command for the master connection. new 1e36d6d src/x2goclient-network-ssh.c: remove master_conn instance variable. new 27f6fa5 src/test/sshtest.c: add locale.h header, needed for setlocale () and friends. new 285eeb3 src/x2goclient-network-ssh.c: re-order finalization. new 387254c src/x2goclient-network-ssh.c: fix x2goclient_network_ssh_log_std_str (): actual decrease the size counter. new 9ac9581 src/x2goclient-network-ssh.c: implement master connection status check. new b8e9b1f src/x2goclient-network.c: add connected boolean private instance variable and read-only getters and setters. new 88174ed src/x2goclient-network.c: make x2goclient_network_connect () idempotent via the connected instance variable. new ca3938f src/x2goclient-network.{c,h}: add new private parent_connect function pointer, to be used for x2goclient_network_connect (). new 5ce70da src/x2goclient-network-ssh.c: use parent_connect function pointer in x2goclient_network_ssh_connect (). new 9e9d174 src/test/sshtest.c: test connection status getter and setter. new 007bfa8 src/test/sshtest.c: try to connect a second time to see if the function is really idempotent now. new 3d8d50f src/x2goclient-network.c: reorder properties in setter to keep original order. new ddeb531 src/x2goclient-network.c: add getter and setters for {write,read}-only properties. new 7ee08cf src/x2goclient-network.{c,h}: make parent_connection function pointer a read-only property called connect-function acting on an instance private called connect_function, add getter and setter. new c8853fa src/x2goclient-network-ssh.c: use connect-function property to fetch parent connect function. new 54e91ee src/x2goclient-network-ssh.c: move check timeout to a separate thread, add synchronization via a mutex. new 8feeaae src/x2goclient-network-ssh.c: actually assign data to check_thread instance variable. new 115cda2 src/x2goclient-network-ssh.c: fix typo in debug message. new 7e61eea src/x2goclient-network-ssh.c: change timeout check to 3000 ms (3 seconds) while debugging. new 8ea258e src/test/sshtest.c: sleep for 30 seconds after connection has been established, then tear everything down. new 8e4cad6 src/x2goclient-network-ssh.c: make parameter to x2goclient_network_ssh_check_timeout_data_free const )not const-data). new 1a1e7d0 src/x2goclient-network-ssh.c: check timeout is not an idle source, rename unwrapping function to x2goclient_network_ssh_start_check_timeout_unwrap. new 67c9306 src/x2goclient-network-ssh.c: add parenthesis to cast, non-functional. new 9ba0651 src/test/sshtest.c: only try to connect again if the first connection succeeded. new 108c6b4 src/x2goclient-openssh-bugs.c: bump version requirement for stderr closing to 8.5+. new 69202fa src/x2goclient-network-ssh.c: check thread pointer before joining check thread. new fc37887 src/x2goclient-network-ssh.c: pass self instead of the main context to check thread main function. new b6d34d0 src/x2goclient-network-ssh.c: let x2goclient_network_ssh_finalize () make more use of the mutex. new 1a45278 src/x2goclient-network-ssh.c: initialize main loop pointer for good measure. new 5157e75 src/x2goclient-network-ssh.c: make check thread main loop an instance variable. new f89c2dc src/x2goclient-network-ssh.c: add comment only. new 8491443 src/x2goclient-network-ssh.c: add debugging output for check thread main function. The 44 revisions listed above as "new" are entirely new to this repository and will be described in separate emails. The revisions listed as "adds" were already present in the repository and have only been added to this reference. Summary of changes: src/test/sshtest.c | 37 +- src/x2goclient-network-ssh.c | 989 +++++++++++++++++++++++++++++---------- src/x2goclient-network-ssh.h | 6 +- src/x2goclient-network.c | 85 +++- src/x2goclient-network.h | 6 +- src/x2goclient-openssh-bugs.c | 6 +- src/x2goclient-openssh-bugs.h | 4 +- src/x2goclient-openssh-version.c | 8 +- src/x2goclient-openssh-version.h | 6 +- src/x2goclient-utils.c | 4 +- src/x2goclient-utils.h | 6 +- 11 files changed, 877 insertions(+), 280 deletions(-) -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/libx2goclient.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository libx2goclient. commit c57d50c7fe6d116432729737a81671dbd98c1c12 Author: Mihai Moldovan <ionic@ionic.de> Date: Thu Jul 30 11:55:31 2020 +0200 misc src/: constify all function parameters. This does not change the data, only makes the parameters themselves const. I'd like to avoid changing these, so making them const sounds like a good idea. --- src/test/sshtest.c | 2 +- src/x2goclient-network-ssh.c | 56 ++++++++++++++++++++-------------------- src/x2goclient-network-ssh.h | 4 +-- src/x2goclient-network.c | 30 ++++++++++----------- src/x2goclient-network.h | 6 ++--- src/x2goclient-openssh-bugs.c | 4 +-- src/x2goclient-openssh-bugs.h | 4 +-- src/x2goclient-openssh-version.c | 6 ++--- src/x2goclient-openssh-version.h | 6 ++--- src/x2goclient-utils.c | 4 +-- src/x2goclient-utils.h | 6 ++--- 11 files changed, 64 insertions(+), 64 deletions(-) diff --git a/src/test/sshtest.c b/src/test/sshtest.c index 770cec7..21c23b1 100644 --- a/src/test/sshtest.c +++ b/src/test/sshtest.c @@ -41,7 +41,7 @@ #define _(String) gettext (String) -int main (int argc, char **argv) { +int main (const int argc, const char * const * const argv) { int ret = EXIT_FAILURE; setlocale (LC_MESSAGES, ""); diff --git a/src/x2goclient-network-ssh.c b/src/x2goclient-network-ssh.c index 3bdedd2..9f11df6 100644 --- a/src/x2goclient-network-ssh.c +++ b/src/x2goclient-network-ssh.c @@ -63,13 +63,13 @@ struct _X2GoClientNetworkOptionsSSH { G_DEFINE_TYPE (X2GoClientNetworkOptionsSSH, x2goclient_network_options_ssh, X2GOCLIENT_TYPE_NETWORK_OPTIONS); -static void x2goclient_network_options_ssh_class_init (X2GoClientNetworkOptionsSSHClass *klass) { +static void x2goclient_network_options_ssh_class_init (X2GoClientNetworkOptionsSSHClass * const klass) { } -static void x2goclient_network_options_ssh_init (X2GoClientNetworkOptionsSSH *self) { +static void x2goclient_network_options_ssh_init (X2GoClientNetworkOptionsSSH * const self) { } -GPtrArray* x2goclient_network_options_ssh_to_array (X2GoClientNetworkOptionsSSH *self) { +GPtrArray* x2goclient_network_options_ssh_to_array (X2GoClientNetworkOptionsSSH * const self) { GPtrArray *ret = NULL; g_return_val_if_fail (X2GOCLIENT_IS_NETWORK_OPTIONS_SSH (self), ret); @@ -120,25 +120,25 @@ enum { static GParamSpec *net_ssh_obj_properties[X2GO_NET_SSH_N_PROPERTIES] = { NULL, }; -static void x2goclient_network_ssh_dispose (GObject *object); -static void x2goclient_network_ssh_finalize (GObject *object); -static void x2goclient_network_ssh_set_property (GObject *object, guint prop_id, const GValue * const value, GParamSpec *param_spec); -static void x2goclient_network_ssh_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *param_spec); +static void x2goclient_network_ssh_dispose (GObject * const object); +static void x2goclient_network_ssh_finalize (GObject * const object); +static void x2goclient_network_ssh_set_property (GObject * const object, const guint prop_id, const GValue * const value, GParamSpec * const param_spec); +static void x2goclient_network_ssh_get_property (GObject * const object, guint prop_id, GValue * const value, GParamSpec * const param_spec); static GSocketAddress* x2goclient_network_ssh_parse_sockspec_unix_socket (const GString * const sockspec); -static guint16 x2goclient_network_ssh_parse_sockspec_port (const GString * const portspec, GError **gerr); +static guint16 x2goclient_network_ssh_parse_sockspec_port (const GString * const portspec, GError ** const gerr); static GString* x2goclient_network_ssh_sanitize_sockspec (const GString * const sockspec); -static GSocketAddress* x2goclient_network_ssh_parse_sockspec_ip (const GString * const sockspec, const gboolean want_v6, GError **gerr); -static GSocketAddress* x2goclient_network_ssh_parse_sockspec_alias (const GString * const sockspec, GError **gerr); -static GSocketAddress* x2goclient_network_ssh_parse_sockspec (X2GoClientNetwork *parent, const GString * const sockspec); -static gboolean x2goclient_network_ssh_kill_subprocesses (X2GoClientNetworkSSH *self); -static gboolean x2goclient_network_ssh_parent_connect (X2GoClientNetwork *parent, GError **gerr); -static gboolean x2goclient_network_ssh_fetch_openssh_version (X2GoClientNetworkSSH *self, GError **gerr); +static GSocketAddress* x2goclient_network_ssh_parse_sockspec_ip (const GString * const sockspec, const gboolean want_v6, GError ** const gerr); +static GSocketAddress* x2goclient_network_ssh_parse_sockspec_alias (const GString * const sockspec, GError ** const gerr); +static GSocketAddress* x2goclient_network_ssh_parse_sockspec (X2GoClientNetwork * const parent, const GString * const sockspec); +static gboolean x2goclient_network_ssh_kill_subprocesses (X2GoClientNetworkSSH * const self); +static gboolean x2goclient_network_ssh_parent_connect (X2GoClientNetwork * const parent, GError ** const gerr); +static gboolean x2goclient_network_ssh_fetch_openssh_version (X2GoClientNetworkSSH * const self, GError ** const gerr); static void x2goclient_network_ssh_log_std_str (const gchar * const str, const gsize str_size, const _Bool select_stderr); static gboolean x2goclient_network_ssh_gptrarray_to_string (GPtrArray * const arr, const gchar * const prelude, gchar ** const ret_str); static void x2goclient_network_ssh_gptrarray_print_debug (GPtrArray * const arr, const gchar * const prelude, const gchar * const desc); -static void x2goclient_network_ssh_class_init (X2GoClientNetworkSSHClass *klass) { +static void x2goclient_network_ssh_class_init (X2GoClientNetworkSSHClass * const klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); object_class->dispose = &x2goclient_network_ssh_dispose; @@ -167,7 +167,7 @@ static void x2goclient_network_ssh_class_init (X2GoClientNetworkSSHClass *klass) parent_class->parse_sockspec = &x2goclient_network_ssh_parse_sockspec; } -static void x2goclient_network_ssh_init (X2GoClientNetworkSSH *self) { +static void x2goclient_network_ssh_init (X2GoClientNetworkSSH * const self) { /* Properties. */ self->openssh_version = NULL; self->openssh_bugs = x2goclient_openssh_bugs_new (); @@ -205,11 +205,11 @@ X2GoClientNetworkSSH* x2goclient_network_ssh_new (const char * const session_pat return (ret); } -static void x2goclient_network_ssh_dispose (GObject *object) { +static void x2goclient_network_ssh_dispose (GObject * const object) { (G_OBJECT_CLASS (x2goclient_network_ssh_parent_class))->dispose (object); } -static void x2goclient_network_ssh_finalize (GObject *object) { +static void x2goclient_network_ssh_finalize (GObject * const object) { X2GoClientNetworkSSH *self = X2GOCLIENT_NETWORK_SSH (object); /* Properties. */ @@ -235,7 +235,7 @@ static void x2goclient_network_ssh_finalize (GObject *object) { } -static void x2goclient_network_ssh_set_property (GObject *object, guint prop_id, const GValue * const value, GParamSpec *param_spec) { +static void x2goclient_network_ssh_set_property (GObject * const object, const guint prop_id, const GValue * const value, GParamSpec * const param_spec) { X2GoClientNetworkSSH *self = X2GOCLIENT_NETWORK_SSH (object); switch (prop_id) { @@ -259,7 +259,7 @@ static void x2goclient_network_ssh_set_property (GObject *object, guint prop_id, } } -static void x2goclient_network_ssh_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *param_spec) { +static void x2goclient_network_ssh_get_property (GObject * const object, const guint prop_id, GValue * const value, GParamSpec * const param_spec) { X2GoClientNetworkSSH *self = X2GOCLIENT_NETWORK_SSH (object); switch (prop_id) { @@ -320,7 +320,7 @@ static GSocketAddress* x2goclient_network_ssh_parse_sockspec_unix_socket (const return (ret); } -static guint16 x2goclient_network_ssh_parse_sockspec_port (const GString * const portspec, GError **gerr) { +static guint16 x2goclient_network_ssh_parse_sockspec_port (const GString * const portspec, GError ** const gerr) { guint16 ret = 0; g_return_val_if_fail (((NULL == gerr) || (NULL == *gerr)), ret); @@ -380,7 +380,7 @@ static GString* x2goclient_network_ssh_sanitize_sockspec (const GString * const return (ret); } -static GSocketAddress* x2goclient_network_ssh_parse_sockspec_ip (const GString * const sockspec, const gboolean want_v6, GError **gerr) { +static GSocketAddress* x2goclient_network_ssh_parse_sockspec_ip (const GString * const sockspec, const gboolean want_v6, GError ** const gerr) { GSocketAddress *ret = NULL; g_return_val_if_fail (((NULL == gerr) || (NULL == *gerr)), ret); @@ -547,7 +547,7 @@ static GSocketAddress* x2goclient_network_ssh_parse_sockspec_ip (const GString * return (ret); } -static GSocketAddress* x2goclient_network_ssh_parse_sockspec_alias (const GString * const sockspec, GError **gerr) { +static GSocketAddress* x2goclient_network_ssh_parse_sockspec_alias (const GString * const sockspec, GError ** const gerr) { GSocketAddress *ret = NULL; g_return_val_if_fail (((NULL == gerr) || (NULL == *gerr)), ret); @@ -630,7 +630,7 @@ static GSocketAddress* x2goclient_network_ssh_parse_sockspec_alias (const GStrin return (ret); } -static GSocketAddress* x2goclient_network_ssh_parse_sockspec (X2GoClientNetwork *parent, const GString * const sockspec) { +static GSocketAddress* x2goclient_network_ssh_parse_sockspec (X2GoClientNetwork * const parent, const GString * const sockspec) { GSocketAddress *ret = NULL; g_return_val_if_fail (X2GOCLIENT_IS_NETWORK (parent), ret); @@ -691,7 +691,7 @@ static GSocketAddress* x2goclient_network_ssh_parse_sockspec (X2GoClientNetwork return ret; } -static gboolean x2goclient_network_ssh_kill_subprocesses (X2GoClientNetworkSSH *self) { +static gboolean x2goclient_network_ssh_kill_subprocesses (X2GoClientNetworkSSH * const self) { gboolean ret = FALSE; g_return_val_if_fail (X2GOCLIENT_IS_NETWORK_SSH (self), ret); @@ -736,7 +736,7 @@ static gboolean x2goclient_network_ssh_kill_subprocesses (X2GoClientNetworkSSH * return (ret); } -gboolean x2goclient_network_ssh_connect (X2GoClientNetworkSSH *self, GError **gerr) { +gboolean x2goclient_network_ssh_connect (X2GoClientNetworkSSH * const self, GError ** const gerr) { gboolean ret = FALSE; g_return_val_if_fail (X2GOCLIENT_IS_NETWORK_SSH (self), ret); @@ -750,7 +750,7 @@ gboolean x2goclient_network_ssh_connect (X2GoClientNetworkSSH *self, GError **ge return (ret); } -static gboolean x2goclient_network_ssh_parent_connect (X2GoClientNetwork *parent, GError **gerr) { +static gboolean x2goclient_network_ssh_parent_connect (X2GoClientNetwork * const parent, GError ** const gerr) { gboolean ret = TRUE; g_return_val_if_fail (X2GOCLIENT_IS_NETWORK_SSH (parent), ret); @@ -1025,7 +1025,7 @@ static gboolean x2goclient_network_ssh_parent_connect (X2GoClientNetwork *parent return (ret); } -static gboolean x2goclient_network_ssh_fetch_openssh_version (X2GoClientNetworkSSH *self, GError **gerr) { +static gboolean x2goclient_network_ssh_fetch_openssh_version (X2GoClientNetworkSSH * const self, GError ** const gerr) { gboolean ret = FALSE; g_return_val_if_fail (X2GOCLIENT_IS_NETWORK_SSH (self), ret); diff --git a/src/x2goclient-network-ssh.h b/src/x2goclient-network-ssh.h index 80cc10f..5fa346d 100644 --- a/src/x2goclient-network-ssh.h +++ b/src/x2goclient-network-ssh.h @@ -38,7 +38,7 @@ G_DECLARE_FINAL_TYPE (X2GoClientNetworkOptionsSSH, x2goclient_network_options_ss X2GoClientNetworkOptionsSSH* x2goclient_network_options_ssh_new (void); -GPtrArray* x2goclient_network_options_ssh_to_array (X2GoClientNetworkOptionsSSH *self); +GPtrArray* x2goclient_network_options_ssh_to_array (X2GoClientNetworkOptionsSSH * const self); #define X2GOCLIENT_TYPE_NETWORK_SSH (x2goclient_network_ssh_get_type ()) @@ -70,7 +70,7 @@ enum { }; -gboolean x2goclient_network_ssh_connect (X2GoClientNetworkSSH *self, GError **gerr); +gboolean x2goclient_network_ssh_connect (X2GoClientNetworkSSH * const self, GError ** const gerr); G_END_DECLS diff --git a/src/x2goclient-network.c b/src/x2goclient-network.c index 36b27bc..c10a6b6 100644 --- a/src/x2goclient-network.c +++ b/src/x2goclient-network.c @@ -42,10 +42,10 @@ typedef struct X2GoClientNetworkOptionsPrivate_ { /* G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (X2GoClientNetworkOptions, x2goclient_network_options, G_TYPE_OBJECT); */ G_DEFINE_ABSTRACT_TYPE (X2GoClientNetworkOptions, x2goclient_network_options, G_TYPE_OBJECT); -static void x2goclient_network_options_class_init (X2GoClientNetworkOptionsClass *klass) { +static void x2goclient_network_options_class_init (X2GoClientNetworkOptionsClass * const klass) { } -static void x2goclient_network_options_init (X2GoClientNetworkOptions *self) { +static void x2goclient_network_options_init (X2GoClientNetworkOptions * const self) { } @@ -77,14 +77,14 @@ enum { static GParamSpec *net_obj_properties[X2GO_NET_N_PROPERTIES] = { NULL, }; -static void x2goclient_network_dispose (GObject *object); -static void x2goclient_network_finalize (GObject *object); -static void x2goclient_network_set_property (GObject *object, guint prop_id, const GValue * const value, GParamSpec *param_spec); -static void x2goclient_network_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *param_spec); -static GSocketAddress* x2goclient_network_parse_sockspec (X2GoClientNetwork *self, const GString * const sockspec); +static void x2goclient_network_dispose (GObject * const object); +static void x2goclient_network_finalize (GObject * const object); +static void x2goclient_network_set_property (GObject * const object, const guint prop_id, const GValue * const value, GParamSpec * const param_spec); +static void x2goclient_network_get_property (GObject * const object, const guint prop_id, GValue * const value, GParamSpec * const param_spec); +static GSocketAddress* x2goclient_network_parse_sockspec (X2GoClientNetwork * const self, const GString * const sockspec); -static void x2goclient_network_class_init (X2GoClientNetworkClass *klass) { +static void x2goclient_network_class_init (X2GoClientNetworkClass * const klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); object_class->dispose = &x2goclient_network_dispose; @@ -124,7 +124,7 @@ static void x2goclient_network_class_init (X2GoClientNetworkClass *klass) { g_object_class_install_properties (object_class, X2GO_NET_N_PROPERTIES, net_obj_properties); } -static void x2goclient_network_init (X2GoClientNetwork *self) { +static void x2goclient_network_init (X2GoClientNetwork * const self) { X2GoClientNetworkPrivate *priv = x2goclient_network_get_instance_private (self); priv->socket = NULL; @@ -132,7 +132,7 @@ static void x2goclient_network_init (X2GoClientNetwork *self) { priv->session_path = NULL; } -static void x2goclient_network_dispose (GObject *object) { +static void x2goclient_network_dispose (GObject * const object) { X2GoClientNetworkPrivate *priv = x2goclient_network_get_instance_private (X2GOCLIENT_NETWORK (object)); g_clear_object (&priv->socket); @@ -141,7 +141,7 @@ static void x2goclient_network_dispose (GObject *object) { (G_OBJECT_CLASS (x2goclient_network_parent_class))->dispose (object); } -static void x2goclient_network_finalize (GObject *object) { +static void x2goclient_network_finalize (GObject * const object) { X2GoClientNetworkPrivate *priv = x2goclient_network_get_instance_private (X2GOCLIENT_NETWORK (object)); if (priv->socket_spec) { @@ -155,7 +155,7 @@ static void x2goclient_network_finalize (GObject *object) { } -static GSocketAddress* x2goclient_network_parse_sockspec (X2GoClientNetwork *self, const GString * const sockspec) { +static GSocketAddress* x2goclient_network_parse_sockspec (X2GoClientNetwork * const self, const GString * const sockspec) { GSocketAddress *ret = NULL; X2GoClientNetworkClass *class = X2GOCLIENT_NETWORK_GET_CLASS (self); @@ -168,7 +168,7 @@ static GSocketAddress* x2goclient_network_parse_sockspec (X2GoClientNetwork *sel return (ret); } -gboolean x2goclient_network_connect (X2GoClientNetwork *self, GError **gerr) { +gboolean x2goclient_network_connect (X2GoClientNetwork * const self, GError ** const gerr) { gboolean ret = FALSE; X2GoClientNetworkClass *class = X2GOCLIENT_NETWORK_GET_CLASS (self); @@ -182,7 +182,7 @@ gboolean x2goclient_network_connect (X2GoClientNetwork *self, GError **gerr) { return (ret); } -static void x2goclient_network_set_property (GObject *object, guint prop_id, const GValue * const value, GParamSpec *param_spec) { +static void x2goclient_network_set_property (GObject * const object, guint prop_id, const GValue * const value, GParamSpec * const param_spec) { X2GoClientNetwork *self = X2GOCLIENT_NETWORK (object); X2GoClientNetworkPrivate *priv = x2goclient_network_get_instance_private (self); @@ -209,7 +209,7 @@ static void x2goclient_network_set_property (GObject *object, guint prop_id, con } } -static void x2goclient_network_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *param_spec) { +static void x2goclient_network_get_property (GObject * const object, const guint prop_id, GValue * const value, GParamSpec * const param_spec) { X2GoClientNetwork *self = X2GOCLIENT_NETWORK (object); X2GoClientNetworkPrivate *priv = x2goclient_network_get_instance_private (self); diff --git a/src/x2goclient-network.h b/src/x2goclient-network.h index c698dc6..cf96c35 100644 --- a/src/x2goclient-network.h +++ b/src/x2goclient-network.h @@ -55,16 +55,16 @@ G_DECLARE_DERIVABLE_TYPE (X2GoClientNetwork, x2goclient_network, X2GOCLIENT, NET struct _X2GoClientNetworkClass { GObjectClass parent_class; - gboolean (*connect) (X2GoClientNetwork *self, GError **gerr); + gboolean (*connect) (X2GoClientNetwork * const self, GError ** const gerr); /*< private >*/ - GSocketAddress* (*parse_sockspec) (X2GoClientNetwork *self, const GString * const sockspec); + GSocketAddress* (*parse_sockspec) (X2GoClientNetwork * const self, const GString * const sockspec); /* We might need a lot more functions... */ gpointer padding[50]; }; -gboolean x2goclient_network_connect (X2GoClientNetwork *self, GError **gerr); +gboolean x2goclient_network_connect (X2GoClientNetwork * const self, GError ** const gerr); G_END_DECLS diff --git a/src/x2goclient-openssh-bugs.c b/src/x2goclient-openssh-bugs.c index b2f540a..1c7fa45 100644 --- a/src/x2goclient-openssh-bugs.c +++ b/src/x2goclient-openssh-bugs.c @@ -35,7 +35,7 @@ X2GoClientOpenSSHBugs* x2goclient_openssh_bugs_new (void) { return (g_slice_new0 (X2GoClientOpenSSHBugs)); } -void x2goclient_openssh_bugs_free (X2GoClientOpenSSHBugs *openssh_bugs) { +void x2goclient_openssh_bugs_free (X2GoClientOpenSSHBugs * const openssh_bugs) { g_slice_free (X2GoClientOpenSSHBugs, openssh_bugs); } @@ -53,7 +53,7 @@ static X2GoClientOpenSSHBugs* x2goclient_openssh_bugs_copy (const X2GoClientOpen G_DEFINE_BOXED_TYPE (X2GoClientOpenSSHBugs, x2goclient_openssh_bugs, &x2goclient_openssh_bugs_copy, &x2goclient_openssh_bugs_free) -gboolean x2goclient_openssh_bugs_update (X2GoClientOpenSSHBugs *self, const X2GoClientOpenSSHVersion * const version, GError **gerr) { +gboolean x2goclient_openssh_bugs_update (X2GoClientOpenSSHBugs * const self, const X2GoClientOpenSSHVersion * const version, GError ** const gerr) { gboolean ret = FALSE; g_return_val_if_fail (((NULL == gerr) || (NULL == *gerr)), ret); diff --git a/src/x2goclient-openssh-bugs.h b/src/x2goclient-openssh-bugs.h index d3b25d1..440d5f6 100644 --- a/src/x2goclient-openssh-bugs.h +++ b/src/x2goclient-openssh-bugs.h @@ -59,10 +59,10 @@ typedef struct X2GoClientOpenSSHBugs_ { GType x2goclient_openssh_bugs_get_type (void) G_GNUC_CONST; X2GoClientOpenSSHBugs* x2goclient_openssh_bugs_new (void); -void x2goclient_openssh_bugs_free (X2GoClientOpenSSHBugs *openssh_bugs); +void x2goclient_openssh_bugs_free (X2GoClientOpenSSHBugs * const openssh_bugs); -gboolean x2goclient_openssh_bugs_update (X2GoClientOpenSSHBugs *self, const X2GoClientOpenSSHVersion * const version, GError **gerr); +gboolean x2goclient_openssh_bugs_update (X2GoClientOpenSSHBugs * const self, const X2GoClientOpenSSHVersion * const version, GError ** const gerr); /* diff --git a/src/x2goclient-openssh-version.c b/src/x2goclient-openssh-version.c index 2525bcd..3911989 100644 --- a/src/x2goclient-openssh-version.c +++ b/src/x2goclient-openssh-version.c @@ -39,7 +39,7 @@ X2GoClientOpenSSHVersion* x2goclient_openssh_version_new (void) { return (g_slice_new0 (X2GoClientOpenSSHVersion)); } -void x2goclient_openssh_version_free (X2GoClientOpenSSHVersion *openssh_version) { +void x2goclient_openssh_version_free (X2GoClientOpenSSHVersion * const openssh_version) { g_slice_free (X2GoClientOpenSSHVersion, openssh_version); } @@ -118,7 +118,7 @@ G_DEFINE_BOXED_TYPE (X2GoClientOpenSSHVersion, x2goclient_openssh_version, &x2go }\ } while (0) -_Bool x2goclient_openssh_version_parse (X2GoClientOpenSSHVersion *openssh_version, const gchar * const version_string, GError **gerr) { +_Bool x2goclient_openssh_version_parse (X2GoClientOpenSSHVersion * const openssh_version, const gchar * const version_string, GError ** const gerr) { _Bool ret = FALSE; g_return_val_if_fail (((NULL == gerr) || (NULL == *gerr)), ret); @@ -368,7 +368,7 @@ _Bool x2goclient_openssh_version_parse (X2GoClientOpenSSHVersion *openssh_versio return (ret); } -X2GoClientOpenSSHVersion* x2goclient_openssh_version_fetch_openssh_version (GError **gerr) { +X2GoClientOpenSSHVersion* x2goclient_openssh_version_fetch_openssh_version (GError ** const gerr) { X2GoClientOpenSSHVersion *ret = NULL; gboolean cont = FALSE; diff --git a/src/x2goclient-openssh-version.h b/src/x2goclient-openssh-version.h index 42b1273..a22309d 100644 --- a/src/x2goclient-openssh-version.h +++ b/src/x2goclient-openssh-version.h @@ -45,7 +45,7 @@ typedef struct X2GoClientOpenSSHVersion_ { GType x2goclient_openssh_version_get_type (void) G_GNUC_CONST; X2GoClientOpenSSHVersion* x2goclient_openssh_version_new (void); -void x2goclient_openssh_version_free (X2GoClientOpenSSHVersion *openssh_version); +void x2goclient_openssh_version_free (X2GoClientOpenSSHVersion * const openssh_version); /* * Error handling helpers. @@ -80,8 +80,8 @@ enum { }; -_Bool x2goclient_openssh_version_parse (X2GoClientOpenSSHVersion *openssh_version, const gchar * const version_string, GError **gerr); -X2GoClientOpenSSHVersion* x2goclient_openssh_version_fetch_openssh_version (GError **gerr); +_Bool x2goclient_openssh_version_parse (X2GoClientOpenSSHVersion * const openssh_version, const gchar * const version_string, GError ** const gerr); +X2GoClientOpenSSHVersion* x2goclient_openssh_version_fetch_openssh_version (GError ** const gerr); G_END_DECLS diff --git a/src/x2goclient-utils.c b/src/x2goclient-utils.c index 28eaf85..d1ac734 100644 --- a/src/x2goclient-utils.c +++ b/src/x2goclient-utils.c @@ -101,7 +101,7 @@ void x2goclient_clear_strings (gpointer data) { * * Returns: the converted value as a #long long, unless an error occurred */ -long long x2goclient_str_to_int (const gchar *restrict str, _Bool min, long long limit_min, _Bool max, long long limit_max, const gchar **restrict end, _Bool *restrict conv_err, _Bool *restrict min_err, _Bool *restrict max_err) { +long long x2goclient_str_to_int (const gchar * const restrict str, const _Bool min, const long long limit_min, const _Bool max, const long long limit_max, const gchar ** const restrict end, _Bool * const restrict conv_err, _Bool * const restrict min_err, _Bool * const restrict max_err) { long long ret = 42; *min_err = *max_err = FALSE; @@ -193,7 +193,7 @@ long long x2goclient_str_to_int (const gchar *restrict str, _Bool min, long long * original string) if @needle was not found, unless an error * occurred */ -gchar* x2goclient_strbrk_dup (gchar *restrict *haystack, const char needle, const _Bool free_orig, gsize * const new_size) { +gchar* x2goclient_strbrk_dup (gchar *restrict * const haystack, const char needle, const _Bool free_orig, gsize * const new_size) { gchar *ret = NULL; g_return_val_if_fail (((NULL != haystack) && (NULL != *haystack)), ret); diff --git a/src/x2goclient-utils.h b/src/x2goclient-utils.h index 89e0425..a626cbf 100644 --- a/src/x2goclient-utils.h +++ b/src/x2goclient-utils.h @@ -49,10 +49,10 @@ G_BEGIN_DECLS #endif /* !defined (__GI_SCANNER__) */ #endif /* !defined (__GTK_DOC_IGNORE__) */ -void x2goclient_clear_strings (gpointer data); +void x2goclient_clear_strings (gpointer const data); -long long x2goclient_str_to_int (const gchar *restrict str, _Bool min, long long limit_min, _Bool max, long long limit_max, const gchar **restrict end, _Bool *restrict conv_err, _Bool *restrict min_err, _Bool *restrict max_err); -gchar* x2goclient_strbrk_dup (gchar *restrict *haystack, const char needle, const _Bool free_orig, gsize * const new_size); +long long x2goclient_str_to_int (const gchar * const restrict str, const _Bool min, const long long limit_min, const _Bool max, const long long limit_max, const gchar ** const restrict end, _Bool * const restrict conv_err, _Bool * const restrict min_err, _Bool * const restrict max_err); +gchar* x2goclient_strbrk_dup (gchar * restrict * const haystack, const char needle, const _Bool free_orig, gsize * const new_size); G_END_DECLS -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/libx2goclient.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository libx2goclient. commit 3fe03cac2487ca631c41574bbf30de29fc1106a2 Author: Mihai Moldovan <ionic@ionic.de> Date: Wed Jul 29 10:44:59 2020 +0200 src/x2goclient-openssh-version.c: typo fix in error string. --- src/x2goclient-openssh-version.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/x2goclient-openssh-version.c b/src/x2goclient-openssh-version.c index f169428..2525bcd 100644 --- a/src/x2goclient-openssh-version.c +++ b/src/x2goclient-openssh-version.c @@ -618,7 +618,7 @@ X2GoClientOpenSSHVersion* x2goclient_openssh_version_fetch_openssh_version (GErr ssh_proc_comm_cancel = NULL; } else { - g_propagate_prefixed_error (gerr, ssh_err, "OpenSSH vesion fetching process didn't execute/start successfully! Error: "); + g_propagate_prefixed_error (gerr, ssh_err, "OpenSSH version fetching process didn't execute/start successfully! Error: "); } g_clear_error (&ssh_err); -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/libx2goclient.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository libx2goclient. commit e1100f6544bda45fb0ab19525d53694f060dfb99 Author: Mihai Moldovan <ionic@ionic.de> Date: Thu Jul 30 09:59:20 2020 +0200 src/x2goclient-network-ssh.c: rename x2goclient_network_ssh_ptrarray_print () to x2goclient_network_ssh_gptrarray_to_string () and fully rework it. Instead of having it print out the result directly via g_log (and not having any control of the actual printing), make it return a boolean value indicating errors and a string as an output parameter. This way, callers can handle the string however they want. Additionally, pre-calculate the size of the resulting string (checking for size-based wrapping along the way) and copy data in chunks instead of using the old Shlemiel-The-Painter algorithm. --- src/x2goclient-network-ssh.c | 160 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 141 insertions(+), 19 deletions(-) diff --git a/src/x2goclient-network-ssh.c b/src/x2goclient-network-ssh.c index feab49c..f43a894 100644 --- a/src/x2goclient-network-ssh.c +++ b/src/x2goclient-network-ssh.c @@ -134,7 +134,7 @@ static gboolean x2goclient_network_ssh_kill_subprocesses (X2GoClientNetworkSSH * static gboolean x2goclient_network_ssh_parent_connect (X2GoClientNetwork *parent, GError **gerr); static gboolean x2goclient_network_ssh_fetch_openssh_version (X2GoClientNetworkSSH *self, GError **gerr); static void x2goclient_network_ssh_log_std_str (const gchar * const str, const gsize str_size, const _Bool select_stderr); -static void x2goclient_network_ssh_ptrarray_print (GPtrArray * const arr, const gchar * const prelude); +static gboolean x2goclient_network_ssh_gptrarray_to_string (GPtrArray * const arr, const gchar * const prelude, gchar ** const ret_str); static void x2goclient_network_ssh_class_init (X2GoClientNetworkSSHClass *klass) { @@ -951,7 +951,21 @@ static gboolean x2goclient_network_ssh_parent_connect (X2GoClientNetwork *parent } if (ret) { - x2goclient_network_ssh_gptrarray_print (ssh_cmd, "Would try to connect via:"); + gchar *ssh_cmd_str = NULL; + if (x2goclient_network_ssh_gptrarray_to_string (ssh_cmd, "Would try to connect via:", &ssh_cmd_str)) { + if (ssh_cmd_str) { + g_log (NULL, G_LOG_LEVEL_DEBUG, "%s", ssh_cmd_str); + + g_free (ssh_cmd_str); + ssh_cmd_str = NULL; + } + else { + g_log (NULL, G_LOG_LEVEL_DEBUG, "Unable to print out OpenSSH client command, it was completely empty."); + } + } + else { + g_log (NULL, G_LOG_LEVEL_DEBUG, "Unable to print out OpenSSH client command, internal error (the string likely was too big)."); + } g_log (NULL, G_LOG_LEVEL_DEBUG, "Launching!"); GError *ssh_err = NULL; @@ -1101,36 +1115,144 @@ static void x2goclient_network_ssh_log_std_str (const gchar * const str, const g } } -static void x2goclient_network_ssh_gptrarray_print (GPtrArray * const arr, const gchar * const prelude) { - g_return_if_fail (arr); +static gboolean x2goclient_network_ssh_gptrarray_to_string (GPtrArray * const arr, const gchar * const prelude, gchar ** const ret_str) { +#define SIZE_LOW_WRAP(buffer_size, elem_size) ((G_MAXSIZE - (buffer_size)) < ((elem_size))) + gboolean ret = FALSE; + + g_return_val_if_fail (((arr) && (ret_str)), ret); + + *(ret_str) = NULL; - /* - * Yeah, this is potentially slow, but there is no better way to use - * g_log (). - */ gchar *tmp = NULL; const gchar *empty = "(NULL)"; + const gsize empty_size = strlen (empty); + + /* Account for terminating NULL. */ + gsize size = 1; + + /* + * First, calculate the total size. + * + * Calculating the size and printing will take two iterations, but that's + * still better than a lot of reallocations and data moves. + */ + ret = TRUE; if (prelude) { - tmp = g_strdup (prelude); + const gsize elem_size = strlen (prelude); + + if (SIZE_LOW_WRAP (size, elem_size)) { + ret = FALSE; + } + else { + size += elem_size; + } } + for (gsize i = 0; ((i < arr->len) && (ret)); ++i) { + const gchar *cur_entry = g_ptr_array_index (arr, i); + + gsize additional_chars = 0; + /* Account for the potential additional chars " []". */ + if ((0 == i) && (!(prelude))) { + /* No space character necessary if we don't have a prelude. */ + additional_chars = 2; + } + else { + additional_chars = 3; + } + + if (SIZE_LOW_WRAP (size, additional_chars)) { + ret = FALSE; + continue; + } - for (gsize i = 0; i < arr->len; ++i) { - gchar *tmp_new = NULL; - gchar *cur_entry = (gchar *)g_ptr_array_index (arr, i); + size += additional_chars; + gsize elem_size = 0; if (cur_entry) { - tmp_new = g_strdup_printf ("%s [%s]", tmp, cur_entry); + elem_size = strlen (cur_entry); } else { - tmp_new = g_strdup_printf ("%s [%s]", tmp, empty); + elem_size = empty_size; } - g_free (tmp); + if (SIZE_LOW_WRAP (size, elem_size)) { + ret = FALSE; + continue; + } + + size += elem_size; + } + + if (ret) { + /* Now allocate enough space. */ + *(ret_str) = tmp = g_new0 (gchar, size); + + gsize tmp_size = size, + written_size = 0; + + /* + * *(ret_str) could be NULL now, but that can only happen if both the + * prelude and array are empty. + * + * That's fine, since in that case everything will be skipped. + */ + if ((prelude) && (tmp)) { + written_size = g_strlcpy (tmp, prelude, tmp_size); + + if (written_size >= tmp_size) { + /* Truncation. */ + ret = FALSE; + } + else { + tmp += written_size; + tmp_size -= written_size; + } + } + +#define HANDLE_TRUNC() \ + do { \ + if (written_size >= tmp_size) { \ + /* Truncation. */ \ + ret = FALSE; \ + continue; \ + } \ + else { \ + tmp += written_size; \ + tmp_size -= written_size; \ + } \ + } while (0) + + for (gsize i = 0; ((i < arr->len) && (ret)); ++i) { + const gchar *cur_entry = g_ptr_array_index (arr, i); + + if ((0 != i) || (prelude)) { + written_size = g_strlcpy (tmp, " ", tmp_size); + HANDLE_TRUNC (); + } + + written_size = g_strlcpy (tmp, "[", tmp_size); + HANDLE_TRUNC (); + + if (cur_entry) { + written_size = g_strlcpy (tmp, cur_entry, tmp_size); + } + else { + written_size = g_strlcpy (tmp, empty, tmp_size); + } + HANDLE_TRUNC (); - tmp = tmp_new; + written_size = g_strlcpy (tmp, "]", tmp_size); + HANDLE_TRUNC (); + } } - g_log (NULL, G_LOG_LEVEL_DEBUG, "%s", tmp); - g_free (tmp); - tmp = NULL; + if (!(ret)) { + /* Clean up, we errored. */ + g_free (*(ret_str)); + *(ret_str) = tmp = NULL; + } + + return (ret); +#undef HANDLE_TRUNC +#undef SIZE_LOW_WRAP } -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/libx2goclient.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository libx2goclient. commit 5d6eef026538461eb9fcdebed5ff159fe9976c2b Author: Mihai Moldovan <ionic@ionic.de> Date: Wed Jul 29 11:25:00 2020 +0200 src/x2goclient-network-ssh.c: fix UB when printing OpenSSH client command array elements being NULL (and hence not strings) and clean up the code a bit. --- src/x2goclient-network-ssh.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/x2goclient-network-ssh.c b/src/x2goclient-network-ssh.c index 472f7db..540ac1e 100644 --- a/src/x2goclient-network-ssh.c +++ b/src/x2goclient-network-ssh.c @@ -955,20 +955,21 @@ static gboolean x2goclient_network_ssh_parent_connect (X2GoClientNetwork *parent * Yeah, this is potentially slow, but there is no better way to use * g_log (). */ - const gchar *tmp_start = "Would try to connect via:"; - gchar *tmp = NULL; + gchar *tmp = g_strdup ("Would try to connect via:"); for (gsize i = 0; i < ssh_cmd->len; ++i) { gchar *tmp_new = NULL; + gchar *cur_entry = (gchar *)g_ptr_array_index (ssh_cmd, i); + const gchar *empty = "(NULL)"; - if (0 == i) { - tmp_new = g_strdup_printf ("%s [%s]", tmp_start, (gchar *)g_ptr_array_index (ssh_cmd, i)); + if (cur_entry) { + tmp_new = g_strdup_printf ("%s [%s]", tmp, cur_entry); } else { - tmp_new = g_strdup_printf ("%s [%s]", tmp, (gchar *)g_ptr_array_index (ssh_cmd, i)); - - g_free (tmp); + tmp_new = g_strdup_printf ("%s [%s]", tmp, empty); } + g_free (tmp); + tmp = tmp_new; } g_log (NULL, G_LOG_LEVEL_DEBUG, "%s", tmp); -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/libx2goclient.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository libx2goclient. commit 270b3f5667a872e7148d1e1ef82f462604f59950 Author: Mihai Moldovan <ionic@ionic.de> Date: Wed Jul 29 11:41:55 2020 +0200 src/x2goclient-network-ssh.c: split out array printing routine into its own function. We could probably use it in multiple places. --- src/x2goclient-network-ssh.c | 63 +++++++++++++++++++++++++------------------- 1 file changed, 36 insertions(+), 27 deletions(-) diff --git a/src/x2goclient-network-ssh.c b/src/x2goclient-network-ssh.c index 32d92cd..feab49c 100644 --- a/src/x2goclient-network-ssh.c +++ b/src/x2goclient-network-ssh.c @@ -134,6 +134,7 @@ static gboolean x2goclient_network_ssh_kill_subprocesses (X2GoClientNetworkSSH * static gboolean x2goclient_network_ssh_parent_connect (X2GoClientNetwork *parent, GError **gerr); static gboolean x2goclient_network_ssh_fetch_openssh_version (X2GoClientNetworkSSH *self, GError **gerr); static void x2goclient_network_ssh_log_std_str (const gchar * const str, const gsize str_size, const _Bool select_stderr); +static void x2goclient_network_ssh_ptrarray_print (GPtrArray * const arr, const gchar * const prelude); static void x2goclient_network_ssh_class_init (X2GoClientNetworkSSHClass *klass) { @@ -950,33 +951,7 @@ static gboolean x2goclient_network_ssh_parent_connect (X2GoClientNetwork *parent } if (ret) { - { - /* - * Yeah, this is potentially slow, but there is no better way to use - * g_log (). - */ - gchar *tmp = g_strdup ("Would try to connect via:"); - for (gsize i = 0; i < ssh_cmd->len; ++i) { - gchar *tmp_new = NULL; - gchar *cur_entry = (gchar *)g_ptr_array_index (ssh_cmd, i); - const gchar *empty = "(NULL)"; - - if (cur_entry) { - tmp_new = g_strdup_printf ("%s [%s]", tmp, cur_entry); - } - else { - tmp_new = g_strdup_printf ("%s [%s]", tmp, empty); - } - - g_free (tmp); - - tmp = tmp_new; - } - g_log (NULL, G_LOG_LEVEL_DEBUG, "%s", tmp); - - g_free (tmp); - tmp = NULL; - } + x2goclient_network_ssh_gptrarray_print (ssh_cmd, "Would try to connect via:"); g_log (NULL, G_LOG_LEVEL_DEBUG, "Launching!"); GError *ssh_err = NULL; @@ -1125,3 +1100,37 @@ static void x2goclient_network_ssh_log_std_str (const gchar * const str, const g g_log (NULL, G_LOG_LEVEL_DEBUG, "Std%s: no data", stream); } } + +static void x2goclient_network_ssh_gptrarray_print (GPtrArray * const arr, const gchar * const prelude) { + g_return_if_fail (arr); + + /* + * Yeah, this is potentially slow, but there is no better way to use + * g_log (). + */ + gchar *tmp = NULL; + const gchar *empty = "(NULL)"; + if (prelude) { + tmp = g_strdup (prelude); + } + + for (gsize i = 0; i < arr->len; ++i) { + gchar *tmp_new = NULL; + gchar *cur_entry = (gchar *)g_ptr_array_index (arr, i); + + if (cur_entry) { + tmp_new = g_strdup_printf ("%s [%s]", tmp, cur_entry); + } + else { + tmp_new = g_strdup_printf ("%s [%s]", tmp, empty); + } + + g_free (tmp); + + tmp = tmp_new; + } + g_log (NULL, G_LOG_LEVEL_DEBUG, "%s", tmp); + + g_free (tmp); + tmp = NULL; +} -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/libx2goclient.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository libx2goclient. commit e536f5459b631f757342ee440a2fb09254c26858 Author: Mihai Moldovan <ionic@ionic.de> Date: Wed Jul 29 11:38:24 2020 +0200 src/x2goclient-network-ssh.c: replace "stderr" parameter to x2goclient_network_ssh_log_std_str () with "select_stderr". We didn't mean to hide the global symbol, so... let's just not do this. --- src/x2goclient-network-ssh.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/x2goclient-network-ssh.c b/src/x2goclient-network-ssh.c index 540ac1e..32d92cd 100644 --- a/src/x2goclient-network-ssh.c +++ b/src/x2goclient-network-ssh.c @@ -133,7 +133,7 @@ static GSocketAddress* x2goclient_network_ssh_parse_sockspec (X2GoClientNetwork static gboolean x2goclient_network_ssh_kill_subprocesses (X2GoClientNetworkSSH *self); static gboolean x2goclient_network_ssh_parent_connect (X2GoClientNetwork *parent, GError **gerr); static gboolean x2goclient_network_ssh_fetch_openssh_version (X2GoClientNetworkSSH *self, GError **gerr); -static void x2goclient_network_ssh_log_std_str (const gchar * const str, const gsize str_size, const _Bool stderr); +static void x2goclient_network_ssh_log_std_str (const gchar * const str, const gsize str_size, const _Bool select_stderr); static void x2goclient_network_ssh_class_init (X2GoClientNetworkSSHClass *klass) { @@ -1075,7 +1075,7 @@ static gboolean x2goclient_network_ssh_fetch_openssh_version (X2GoClientNetworkS return (ret); } -static void x2goclient_network_ssh_log_std_str (const gchar * const str, const gsize str_size, const _Bool stderr) { +static void x2goclient_network_ssh_log_std_str (const gchar * const str, const gsize str_size, const _Bool select_stderr) { /* * For a size bigger than zero, the bytes object must be non-NULL, * otherwise any value is legit according to the documentation. @@ -1084,7 +1084,7 @@ static void x2goclient_network_ssh_log_std_str (const gchar * const str, const g const gchar *stream = "out"; - if (stderr) { + if (select_stderr) { stream = "err"; } -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/libx2goclient.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository libx2goclient. commit ca8983d9615d4f97e7d99c5e059ed1d5ae6a6be7 Author: Mihai Moldovan <ionic@ionic.de> Date: Thu Jul 30 10:52:11 2020 +0200 src/x2goclient-network-ssh.c: add another helper function x2goclient_network_ssh_gptrarray_print_debug (), wrapping the GPtrArray printing to g_log () and its DEBUG target. We'll probably use it later on again, so split this out. --- src/x2goclient-network-ssh.c | 42 +++++++++++++++++++++++++++--------------- 1 file changed, 27 insertions(+), 15 deletions(-) diff --git a/src/x2goclient-network-ssh.c b/src/x2goclient-network-ssh.c index f43a894..3bdedd2 100644 --- a/src/x2goclient-network-ssh.c +++ b/src/x2goclient-network-ssh.c @@ -135,6 +135,7 @@ static gboolean x2goclient_network_ssh_parent_connect (X2GoClientNetwork *parent static gboolean x2goclient_network_ssh_fetch_openssh_version (X2GoClientNetworkSSH *self, GError **gerr); static void x2goclient_network_ssh_log_std_str (const gchar * const str, const gsize str_size, const _Bool select_stderr); static gboolean x2goclient_network_ssh_gptrarray_to_string (GPtrArray * const arr, const gchar * const prelude, gchar ** const ret_str); +static void x2goclient_network_ssh_gptrarray_print_debug (GPtrArray * const arr, const gchar * const prelude, const gchar * const desc); static void x2goclient_network_ssh_class_init (X2GoClientNetworkSSHClass *klass) { @@ -951,21 +952,7 @@ static gboolean x2goclient_network_ssh_parent_connect (X2GoClientNetwork *parent } if (ret) { - gchar *ssh_cmd_str = NULL; - if (x2goclient_network_ssh_gptrarray_to_string (ssh_cmd, "Would try to connect via:", &ssh_cmd_str)) { - if (ssh_cmd_str) { - g_log (NULL, G_LOG_LEVEL_DEBUG, "%s", ssh_cmd_str); - - g_free (ssh_cmd_str); - ssh_cmd_str = NULL; - } - else { - g_log (NULL, G_LOG_LEVEL_DEBUG, "Unable to print out OpenSSH client command, it was completely empty."); - } - } - else { - g_log (NULL, G_LOG_LEVEL_DEBUG, "Unable to print out OpenSSH client command, internal error (the string likely was too big)."); - } + x2goclient_network_ssh_gptrarray_print_debug (ssh_cmd, "Would try to connect via:", "OpenSSH client command"); g_log (NULL, G_LOG_LEVEL_DEBUG, "Launching!"); GError *ssh_err = NULL; @@ -1256,3 +1243,28 @@ static gboolean x2goclient_network_ssh_gptrarray_to_string (GPtrArray * const ar #undef HANDLE_TRUNC #undef SIZE_LOW_WRAP } + +static void x2goclient_network_ssh_gptrarray_print_debug (GPtrArray * const arr, const gchar * const prelude, const gchar * const desc) { + gchar *arr_str = NULL; + const gchar *def_desc = "unspecified pointer array"; + const gchar *real_desc = def_desc; + + if (desc) { + real_desc = desc; + } + + if (x2goclient_network_ssh_gptrarray_to_string (arr, prelude, &arr_str)) { + if (arr_str) { + g_log (NULL, G_LOG_LEVEL_DEBUG, "%s", arr_str); + + g_free (arr_str); + arr_str = NULL; + } + else { + g_log (NULL, G_LOG_LEVEL_DEBUG, "Unable to print out %s, it was completely empty.", real_desc); + } + } + else { + g_log (NULL, G_LOG_LEVEL_DEBUG, "Unable to print out %s, internal error (the string likely was too big).", real_desc); + } +} -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/libx2goclient.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository libx2goclient. commit f8c71aaa1e14f8d8d10d262d1596d70740459da3 Author: Mihai Moldovan <ionic@ionic.de> Date: Wed Jul 29 10:59:26 2020 +0200 src/x2goclient-network-ssh.c: add active_master_conn instance variable, scheduled to replace master_conn. --- src/x2goclient-network-ssh.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/x2goclient-network-ssh.c b/src/x2goclient-network-ssh.c index 010810d..472f7db 100644 --- a/src/x2goclient-network-ssh.c +++ b/src/x2goclient-network-ssh.c @@ -104,6 +104,7 @@ struct _X2GoClientNetworkSSH { char *control_path; GSubprocess *master_conn; + gboolean active_master_conn; }; G_DEFINE_TYPE (X2GoClientNetworkSSH, x2goclient_network_ssh, X2GOCLIENT_TYPE_NETWORK); @@ -171,6 +172,7 @@ static void x2goclient_network_ssh_init (X2GoClientNetworkSSH *self) { self->control_path = NULL; self->master_conn = NULL; + self->active_master_conn = NULL; } X2GoClientNetworkSSH* x2goclient_network_ssh_new (const char * const session_path) { @@ -692,7 +694,9 @@ static gboolean x2goclient_network_ssh_kill_subprocesses (X2GoClientNetworkSSH * g_return_val_if_fail (X2GOCLIENT_IS_NETWORK_SSH (self), ret); - if (self->master_conn) { + if (self->active_master_conn) { + /* FIXME: rework this code! */ + /* Cleanup, if necessary. */ g_log (NULL, G_LOG_LEVEL_DEBUG, "Master connection cleanup required."); @@ -722,6 +726,7 @@ static gboolean x2goclient_network_ssh_kill_subprocesses (X2GoClientNetworkSSH * g_object_unref (self->master_conn); self->master_conn = NULL; + self->active_master_conn = FALSE; ret = TRUE; } -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/libx2goclient.git
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
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository libx2goclient. commit 1e36d6dfc0a24dbacbbcc8061e1d5e2acf243c2b Author: Mihai Moldovan <ionic@ionic.de> Date: Thu Jul 30 15:05:25 2020 +0200 src/x2goclient-network-ssh.c: remove master_conn instance variable. --- src/x2goclient-network-ssh.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/x2goclient-network-ssh.c b/src/x2goclient-network-ssh.c index fded0cb..6e85e16 100644 --- a/src/x2goclient-network-ssh.c +++ b/src/x2goclient-network-ssh.c @@ -103,7 +103,6 @@ struct _X2GoClientNetworkSSH { X2GoClientOpenSSHBugs *openssh_bugs; char *control_path; - GSubprocess *master_conn; gboolean active_master_conn; }; @@ -175,7 +174,6 @@ static void x2goclient_network_ssh_init (X2GoClientNetworkSSH * const self) { self->openssh_bugs = x2goclient_openssh_bugs_new (); self->control_path = NULL; - self->master_conn = NULL; self->active_master_conn = FALSE; } -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/libx2goclient.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository libx2goclient. commit b871c1b39fcb71b7198bcb0094bc19bcd60527b9 Author: Mihai Moldovan <ionic@ionic.de> Date: Thu Jul 30 15:05:01 2020 +0200 src/x2goclient-network-ssh.c: rewrite x2goclient_network_ssh_kill_subprocesses () to not kill an actual process but spawn an OpenSSH client process executing an exit command for the master connection. --- src/x2goclient-network-ssh.c | 45 +++++++++++++++++++------------------------- 1 file changed, 19 insertions(+), 26 deletions(-) diff --git a/src/x2goclient-network-ssh.c b/src/x2goclient-network-ssh.c index 48a75a4..fded0cb 100644 --- a/src/x2goclient-network-ssh.c +++ b/src/x2goclient-network-ssh.c @@ -699,40 +699,33 @@ static gboolean x2goclient_network_ssh_kill_subprocesses (X2GoClientNetworkSSH * g_return_val_if_fail (X2GOCLIENT_IS_NETWORK_SSH (self), ret); if (self->active_master_conn) { - /* FIXME: rework this code! */ - /* Cleanup, if necessary. */ g_log (NULL, G_LOG_LEVEL_DEBUG, "Master connection cleanup required."); - g_subprocess_force_exit (self->master_conn); + GPtrArray *ssh_cmd = g_ptr_array_new_with_free_func (&x2goclient_clear_strings); + g_ptr_array_add (ssh_cmd, g_strdup ("ssh")); - GCancellable *wait_cancel = g_cancellable_new (); - GError *wait_error = NULL; - while (!(g_subprocess_wait (self->master_conn, wait_cancel, &wait_error))) { - /* - * Try to wait for subprocess termination really hard. - * The wait call should only fail if the operation was cancelled, but - * given that we don't do that (explicitly), it should not occur in the - * first place. - */ - g_log (NULL, G_LOG_LEVEL_CRITICAL, "Waiting on master connection subprocess termination was cancelled!\nError: %s\nThis should not have happened. Retrying.", wait_error->message); + /* 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)); - g_clear_error (&wait_error); - } + /* Add master socket command. */ + g_ptr_array_add (ssh_cmd, g_strdup ("-O")); + g_ptr_array_add (ssh_cmd, g_strdup ("exit")); - if (0 == g_subprocess_get_if_exited (self->master_conn)) { - gint exit_status = g_subprocess_get_exit_status (self->master_conn); - g_log (NULL, G_LOG_LEVEL_WARNING, "Master connection subprocess exited with an error; return code: %d", exit_status); - } - else { - g_log (NULL, G_LOG_LEVEL_MESSAGE, "Master connection subprocess exited successfully."); - } + ret = x2goclient_network_ssh_sshcmd_add_host_port (self, ssh_cmd, NULL); - g_object_unref (self->master_conn); - self->master_conn = NULL; - self->active_master_conn = FALSE; + if (ret) { + /* Zero-terminate. */ + g_ptr_array_add (ssh_cmd, NULL); - ret = TRUE; + /* Okay, execute. */ + x2goclient_network_ssh_gptrarray_print_debug (ssh_cmd, "Terminating master connection via:", "OpenSSH client command"); + + g_log (NULL, G_LOG_LEVEL_DEBUG, "Launching!"); + ret = x2goclient_network_ssh_start_sshcmd (self, ssh_cmd, NULL, FALSE); + self->active_master_conn = (!(ret)); + } } return (ret); -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/libx2goclient.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository libx2goclient. commit 9e9d174d4b834506665ae52881a6c16685012697 Author: Mihai Moldovan <ionic@ionic.de> Date: Mon Aug 3 12:48:47 2020 +0200 src/test/sshtest.c: test connection status getter and setter. --- src/test/sshtest.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/test/sshtest.c b/src/test/sshtest.c index 1e5c21d..fca6bf5 100644 --- a/src/test/sshtest.c +++ b/src/test/sshtest.c @@ -82,8 +82,26 @@ int main (const int argc, const char * const * const argv) { g_free (session_path); session_path = NULL; + /* + * Check connection status fetching and setting. + * + * The latter should fail. + */ + g_printf ("Trying to get connection status...\n"); + gboolean conn_ret = TRUE; + g_object_get (G_OBJECT (net_ssh), "connected", &conn_ret, NULL); + g_printf ("Current connection status: %d\n", (int) (conn_ret)); + + g_printf ("Trying to set connection status (should fail)...\n"); + conn_ret = TRUE; + g_object_set (G_OBJECT (net_ssh), "connected", &conn_ret, NULL); + + g_printf ("Trying to get connection status again...\n"); + g_object_get (G_OBJECT (net_ssh), "connected", &conn_ret, NULL); + g_printf ("Current connection status (again): %d\n", (int) (conn_ret)); + g_printf ("Trying to connect...\n"); - gboolean conn_ret = x2goclient_network_ssh_connect (net_ssh, NULL); + conn_ret = x2goclient_network_ssh_connect (net_ssh, NULL); g_printf ("Connection status: %s.\n", (conn_ret) ? "true" : "false"); g_clear_object (&net_ssh); -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/libx2goclient.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository libx2goclient. commit b8e9b1f1362055abfd356d49f34276c67af379a9 Author: Mihai Moldovan <ionic@ionic.de> Date: Mon Aug 3 11:11:20 2020 +0200 src/x2goclient-network.c: add connected boolean private instance variable and read-only getters and setters. --- src/x2goclient-network.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/x2goclient-network.c b/src/x2goclient-network.c index c10a6b6..40afb8e 100644 --- a/src/x2goclient-network.c +++ b/src/x2goclient-network.c @@ -54,6 +54,7 @@ typedef struct X2GoClientNetworkPrivate_ { GSocketAddress *socket; X2GoClientNetworkOptions *options; gchar *session_path; /* Will eventually be replaced with a session object, probably. */ + gboolean connected; } X2GoClientNetworkPrivate; G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (X2GoClientNetwork, x2goclient_network, G_TYPE_OBJECT); @@ -71,6 +72,7 @@ enum { X2GO_NET_PROP_SOCKET, X2GO_NET_PROP_OPTIONS, X2GO_NET_PROP_SESSION_PATH, + X2GO_NET_PROP_CONNECTED, X2GO_NET_N_PROPERTIES }; @@ -121,6 +123,12 @@ static void x2goclient_network_class_init (X2GoClientNetworkClass * const klass) g_boxed_free (G_TYPE_GSTRING, default_session_path); default_session_path = NULL; + net_obj_properties[X2GO_NET_PROP_CONNECTED] = g_param_spec_boolean ("connected", _("Boolean for connected state"), + _("Boolean value denoting whether a connection has " + "been established or not."), + FALSE, + G_PARAM_STATIC_STRINGS | G_PARAM_READABLE); + g_object_class_install_properties (object_class, X2GO_NET_N_PROPERTIES, net_obj_properties); } @@ -130,6 +138,7 @@ static void x2goclient_network_init (X2GoClientNetwork * const self) { priv->socket = NULL; priv->options = NULL; priv->session_path = NULL; + priv->connected = FALSE; } static void x2goclient_network_dispose (GObject * const object) { @@ -203,6 +212,9 @@ static void x2goclient_network_set_property (GObject * const object, guint prop_ g_clear_object (&(priv->options)); priv->options = g_value_dup_object (value); break; + case (X2GO_NET_PROP_CONNECTED): + priv->connected = g_value_get_boolean (value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, param_spec); break; @@ -223,6 +235,9 @@ static void x2goclient_network_get_property (GObject * const object, const guint case (X2GO_NET_PROP_SESSION_PATH): g_value_set_string (value, priv->session_path); break; + case (X2GO_NET_PROP_CONNECTED): + g_value_set_boolean (value, priv->connected); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, param_spec); break; -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/libx2goclient.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository libx2goclient. commit 5ce70da17ab8d1cf5de3d8aa4dbeb7040c3079d8 Author: Mihai Moldovan <ionic@ionic.de> Date: Mon Aug 3 12:46:45 2020 +0200 src/x2goclient-network-ssh.c: use parent_connect function pointer in x2goclient_network_ssh_connect (). --- src/x2goclient-network-ssh.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/x2goclient-network-ssh.c b/src/x2goclient-network-ssh.c index 74740f7..af5682e 100644 --- a/src/x2goclient-network-ssh.c +++ b/src/x2goclient-network-ssh.c @@ -757,7 +757,7 @@ gboolean x2goclient_network_ssh_connect (X2GoClientNetworkSSH * const self, GErr X2GoClientNetwork *parent = X2GOCLIENT_NETWORK (self); X2GoClientNetworkClass *parent_class = X2GOCLIENT_NETWORK_GET_CLASS (parent); - ret = parent_class->connect (parent, gerr); + ret = parent_class->parent_connect (parent, gerr); return (ret); } -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/libx2goclient.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository libx2goclient. commit 88174ed8a2896e3bcd03029b131ac75cb41a5b32 Author: Mihai Moldovan <ionic@ionic.de> Date: Mon Aug 3 11:23:38 2020 +0200 src/x2goclient-network.c: make x2goclient_network_connect () idempotent via the connected instance variable. --- src/x2goclient-network.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/x2goclient-network.c b/src/x2goclient-network.c index 40afb8e..811d6e9 100644 --- a/src/x2goclient-network.c +++ b/src/x2goclient-network.c @@ -181,12 +181,19 @@ gboolean x2goclient_network_connect (X2GoClientNetwork * const self, GError ** c gboolean ret = FALSE; X2GoClientNetworkClass *class = X2GOCLIENT_NETWORK_GET_CLASS (self); + X2GoClientNetworkPrivate *priv = x2goclient_network_get_instance_private (self); g_return_val_if_fail (X2GOCLIENT_IS_NETWORK (self), ret); g_return_val_if_fail (((NULL == gerr) || (NULL == *gerr)), ret); g_return_val_if_fail (class->connect, ret); - ret = class->connect (self, gerr); + ret = priv->connected; + + if (!(ret)) { + ret = class->connect (self, gerr); + + priv->connected = ret; + } return (ret); } -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/libx2goclient.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository libx2goclient. commit b98389b0713cb46cd50a6c45fbe0358f9fb3dbf6 Author: Mihai Moldovan <ionic@ionic.de> Date: Thu Jul 30 12:06:26 2020 +0200 src/x2goclient-network-ssh.c: don't assign NULL to a (g)boolean. This should have been FALSE, naturally. --- src/x2goclient-network-ssh.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/x2goclient-network-ssh.c b/src/x2goclient-network-ssh.c index e833ead..7344546 100644 --- a/src/x2goclient-network-ssh.c +++ b/src/x2goclient-network-ssh.c @@ -175,7 +175,7 @@ static void x2goclient_network_ssh_init (X2GoClientNetworkSSH * const self) { self->control_path = NULL; self->master_conn = NULL; - self->active_master_conn = NULL; + self->active_master_conn = FALSE; } X2GoClientNetworkSSH* x2goclient_network_ssh_new (const char * const session_path) { -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/libx2goclient.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository libx2goclient. commit 387254cdc3c8f06d943ba7bc9795bf701396bf42 Author: Mihai Moldovan <ionic@ionic.de> Date: Fri Jul 31 11:59:54 2020 +0200 src/x2goclient-network-ssh.c: fix x2goclient_network_ssh_log_std_str (): actual decrease the size counter. Previously, the function didn't do that (unless the size was INT_MAX), so the loop never stopped... until the program crashed due to illegal memory accesses. --- src/x2goclient-network-ssh.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/x2goclient-network-ssh.c b/src/x2goclient-network-ssh.c index e639bd8..635aecf 100644 --- a/src/x2goclient-network-ssh.c +++ b/src/x2goclient-network-ssh.c @@ -936,7 +936,6 @@ static void x2goclient_network_ssh_log_std_str (const gchar * const str, const g if (INT_MAX < str_size_work) { cur_len = INT_MAX; - str_size_work -= INT_MAX; } const char *fmt = ">>>%.*s<<<"; @@ -953,6 +952,7 @@ static void x2goclient_network_ssh_log_std_str (const gchar * const str, const g * Be extra careful here. */ str_work += cur_len; + str_size_work -= cur_len; cont = TRUE; } -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/libx2goclient.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository libx2goclient. commit 27f6fa5d9f2360635465186ad30321ce72f88bd3 Author: Mihai Moldovan <ionic@ionic.de> Date: Fri Jul 31 11:08:27 2020 +0200 src/test/sshtest.c: add locale.h header, needed for setlocale () and friends. Fixes a compile error that was previously hidden by compiler optimizations. --- src/test/sshtest.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/sshtest.c b/src/test/sshtest.c index 21c23b1..1e5c21d 100644 --- a/src/test/sshtest.c +++ b/src/test/sshtest.c @@ -24,6 +24,7 @@ #include <stdio.h> #include <stdlib.h> +#include <locale.h> #include <libintl.h> -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/libx2goclient.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository libx2goclient. commit fcb526e1347e8a9d7b2f59350bc6e4e461e8bc48 Author: Mihai Moldovan <ionic@ionic.de> Date: Thu Jul 30 11:59:03 2020 +0200 src/x2goclient-network-ssh.c: split out appending host (and, if applicable, port) to an GPtrArray to a new function called x2goclient_network_ssh_sshcmd_add_host_port (). Just a code move, really, but we'll need that later on. --- src/x2goclient-network-ssh.c | 181 +++++++++++++++++++++++-------------------- 1 file changed, 98 insertions(+), 83 deletions(-) diff --git a/src/x2goclient-network-ssh.c b/src/x2goclient-network-ssh.c index 9f11df6..e833ead 100644 --- a/src/x2goclient-network-ssh.c +++ b/src/x2goclient-network-ssh.c @@ -136,6 +136,7 @@ static gboolean x2goclient_network_ssh_fetch_openssh_version (X2GoClientNetworkS static void x2goclient_network_ssh_log_std_str (const gchar * const str, const gsize str_size, const _Bool select_stderr); static gboolean x2goclient_network_ssh_gptrarray_to_string (GPtrArray * const arr, const gchar * const prelude, gchar ** const ret_str); 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 void x2goclient_network_ssh_class_init (X2GoClientNetworkSSHClass * const klass) { @@ -783,90 +784,8 @@ static gboolean x2goclient_network_ssh_parent_connect (X2GoClientNetwork * const GPtrArray *ssh_cmd = g_ptr_array_new_with_free_func (&x2goclient_clear_strings); g_ptr_array_add (ssh_cmd, g_strdup ("ssh")); - GSocketAddress *sock_addr = NULL; - if (ret) { - g_object_get (G_OBJECT (self), "socket", &sock_addr, NULL); - - if (!(sock_addr)) { - g_set_error_literal (gerr, X2GOCLIENT_NETWORK_SSH_ERROR, X2GOCLIENT_NETWORK_SSH_ERROR_CONNECT_SOCK_ADDR_NULL, "No end point to connect to."); - ret = FALSE; - } - } - - if (ret) { - if (G_IS_UNIX_SOCKET_ADDRESS (sock_addr)) { - GUnixSocketAddress *unix_sock_addr = G_UNIX_SOCKET_ADDRESS (sock_addr); - - /* - * Tiny problem here: abstract sockets won't work. - * Since program arguments can't contain NULL bytes due to being C - * strings and every abstract socket already has to start with a NULL - * byte, we'll be just adding an empty argument here. - * - * Maybe there will be a way to do that correctly, some day. - */ - g_ptr_array_add (ssh_cmd, g_strdup (g_unix_socket_address_get_path (unix_sock_addr))); - } - else if (G_IS_INET_SOCKET_ADDRESS (sock_addr)) { - GInetSocketAddress *inet_sock_addr = G_INET_SOCKET_ADDRESS (sock_addr); - GInetAddress *inet_addr = g_inet_socket_address_get_address (inet_sock_addr); - guint16 port = g_inet_socket_address_get_port (inet_sock_addr); - - if (!(inet_addr)) { - g_set_error_literal (gerr, X2GOCLIENT_NETWORK_SSH_ERROR, X2GOCLIENT_NETWORK_SSH_ERROR_CONNECT_INET_ADDR_NULL, "Internet socket address is undefined, cannot connect to an unknown remote IP host."); - ret = FALSE; - } - else { - g_ptr_array_add (ssh_cmd, g_inet_address_to_string (inet_addr)); - - /* - * Handle port parameter, unless it's 0, which means to use the default - * value. - */ - if (port) { - g_ptr_array_add (ssh_cmd, g_strdup ("-p")); - g_ptr_array_add (ssh_cmd, g_strdup_printf ("%d", port)); - } - } - } - else if (G_IS_NATIVE_SOCKET_ADDRESS (sock_addr)) { - GNativeSocketAddress *native_sock_addr = G_NATIVE_SOCKET_ADDRESS (sock_addr); - - g_assert (sizeof (sockaddr_ho) == g_socket_address_get_native_size (sock_addr)); - - sockaddr_ho tmp_sockaddr = { 0 }; - - /* Fetch data. */ - GError *tmp_err = NULL; - g_socket_address_to_native (sock_addr, &tmp_sockaddr, sizeof (sockaddr_ho), &tmp_err); - - if (tmp_err) { - g_set_error (gerr, X2GOCLIENT_NETWORK_SSH_ERROR, X2GOCLIENT_NETWORK_SSH_ERROR_CONNECT_NATIVE_FETCH, "Unable to convert native socket address object to sockaddr struct: %s", tmp_err->message); - g_clear_error (&tmp_err); - ret = FALSE; - } - - if (ret) { - g_ptr_array_add (ssh_cmd, g_strdup (tmp_sockaddr.sho_addr)); - - /* - * Handle port parameter, unless it's 0, which means to use the default - * value. - */ - if (tmp_sockaddr.sho_port) { - g_ptr_array_add (ssh_cmd, g_strdup ("-p")); - g_ptr_array_add (ssh_cmd, g_strdup_printf ("%d", tmp_sockaddr.sho_port)); - } - } - } - else { - g_set_error_literal (gerr, X2GOCLIENT_NETWORK_SSH_ERROR, X2GOCLIENT_NETWORK_SSH_ERROR_CONNECT_SOCK_ADDR_UNKNOWN, "Unknown data in socket property, can't connect."); - ret = FALSE; - } - - g_clear_object (&sock_addr); - sock_addr = NULL; + ret = x2goclient_network_ssh_sshcmd_add_host_port (self, ssh_cmd, gerr); } if (ret) { @@ -1268,3 +1187,99 @@ static void x2goclient_network_ssh_gptrarray_print_debug (GPtrArray * const arr, g_log (NULL, G_LOG_LEVEL_DEBUG, "Unable to print out %s, internal error (the string likely was too big).", real_desc); } } + +static gboolean x2goclient_network_ssh_sshcmd_add_host_port (X2GoClientNetworkSSH * const self, GPtrArray * const ssh_cmd, GError ** const gerr) { + gboolean ret = FALSE; + + g_return_val_if_fail (X2GOCLIENT_IS_NETWORK_SSH (self), ret); + g_return_val_if_fail (ssh_cmd, ret); + g_return_val_if_fail (((NULL == gerr) || (NULL == *gerr)), ret); + + ret = TRUE; + + GSocketAddress *sock_addr = NULL; + + g_object_get (G_OBJECT (self), "socket", &sock_addr, NULL); + + if (!(sock_addr)) { + g_set_error_literal (gerr, X2GOCLIENT_NETWORK_SSH_ERROR, X2GOCLIENT_NETWORK_SSH_ERROR_CONNECT_SOCK_ADDR_NULL, "No end point to connect to."); + ret = FALSE; + } + + if (ret) { + if (G_IS_UNIX_SOCKET_ADDRESS (sock_addr)) { + GUnixSocketAddress *unix_sock_addr = G_UNIX_SOCKET_ADDRESS (sock_addr); + + /* + * Tiny problem here: abstract sockets won't work. + * Since program arguments can't contain NULL bytes due to being C + * strings and every abstract socket already has to start with a NULL + * byte, we'll be just adding an empty argument here. + * + * Maybe there will be a way to do that correctly, some day. + */ + g_ptr_array_add (ssh_cmd, g_strdup (g_unix_socket_address_get_path (unix_sock_addr))); + } + else if (G_IS_INET_SOCKET_ADDRESS (sock_addr)) { + GInetSocketAddress *inet_sock_addr = G_INET_SOCKET_ADDRESS (sock_addr); + GInetAddress *inet_addr = g_inet_socket_address_get_address (inet_sock_addr); + guint16 port = g_inet_socket_address_get_port (inet_sock_addr); + + if (!(inet_addr)) { + g_set_error_literal (gerr, X2GOCLIENT_NETWORK_SSH_ERROR, X2GOCLIENT_NETWORK_SSH_ERROR_CONNECT_INET_ADDR_NULL, "Internet socket address is undefined, cannot connect to an unknown remote IP host."); + ret = FALSE; + } + else { + g_ptr_array_add (ssh_cmd, g_inet_address_to_string (inet_addr)); + + /* + * Handle port parameter, unless it's 0, which means to use the default + * value. + */ + if (port) { + g_ptr_array_add (ssh_cmd, g_strdup ("-p")); + g_ptr_array_add (ssh_cmd, g_strdup_printf ("%d", port)); + } + } + } + else if (G_IS_NATIVE_SOCKET_ADDRESS (sock_addr)) { + GNativeSocketAddress *native_sock_addr = G_NATIVE_SOCKET_ADDRESS (sock_addr); + + g_assert (sizeof (sockaddr_ho) == g_socket_address_get_native_size (sock_addr)); + + sockaddr_ho tmp_sockaddr = { 0 }; + + /* Fetch data. */ + GError *tmp_err = NULL; + g_socket_address_to_native (sock_addr, &tmp_sockaddr, sizeof (sockaddr_ho), &tmp_err); + + if (tmp_err) { + g_set_error (gerr, X2GOCLIENT_NETWORK_SSH_ERROR, X2GOCLIENT_NETWORK_SSH_ERROR_CONNECT_NATIVE_FETCH, "Unable to convert native socket address object to sockaddr struct: %s", tmp_err->message); + g_clear_error (&tmp_err); + ret = FALSE; + } + + if (ret) { + g_ptr_array_add (ssh_cmd, g_strdup (tmp_sockaddr.sho_addr)); + + /* + * Handle port parameter, unless it's 0, which means to use the default + * value. + */ + if (tmp_sockaddr.sho_port) { + g_ptr_array_add (ssh_cmd, g_strdup ("-p")); + g_ptr_array_add (ssh_cmd, g_strdup_printf ("%d", tmp_sockaddr.sho_port)); + } + } + } + else { + g_set_error_literal (gerr, X2GOCLIENT_NETWORK_SSH_ERROR, X2GOCLIENT_NETWORK_SSH_ERROR_CONNECT_SOCK_ADDR_UNKNOWN, "Unknown data in socket property, can't connect."); + ret = FALSE; + } + + g_clear_object (&sock_addr); + sock_addr = NULL; + } + + return (ret); +} -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/libx2goclient.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository libx2goclient. commit 285eeb3dc232745bc775e10fc26dc8f2b5b11588 Author: Mihai Moldovan <ionic@ionic.de> Date: Fri Jul 31 11:19:53 2020 +0200 src/x2goclient-network-ssh.c: re-order finalization. Destruction is a delicate matter and we actually have things depend on each other now, so make sure that we get rid of data in the correct order, which also means destroying properties last. --- src/x2goclient-network-ssh.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/x2goclient-network-ssh.c b/src/x2goclient-network-ssh.c index 6e85e16..e639bd8 100644 --- a/src/x2goclient-network-ssh.c +++ b/src/x2goclient-network-ssh.c @@ -212,6 +212,21 @@ static void x2goclient_network_ssh_dispose (GObject * const object) { static void x2goclient_network_ssh_finalize (GObject * const object) { X2GoClientNetworkSSH *self = X2GOCLIENT_NETWORK_SSH (object); + /* + * The order of finalization is pretty important. + * + * We'll need data such as the session path for termination of the master + * connection, so make sure that the dependencies are set up correctly here. + */ + + if (!(x2goclient_network_ssh_kill_subprocesses (self))) { + g_log (NULL, G_LOG_LEVEL_CRITICAL, "Some subprocesses were not terminated correctly!"); + } + + g_free (self->control_path); + self->control_path = NULL; + + /* Properties. */ if (self->openssh_version) { g_boxed_free (X2GOCLIENT_TYPE_OPENSSH_VERSION, self->openssh_version); @@ -223,14 +238,6 @@ static void x2goclient_network_ssh_finalize (GObject * const object) { self->openssh_bugs = NULL; } - - g_free (self->control_path); - self->control_path = NULL; - - if (!(x2goclient_network_ssh_kill_subprocesses (self))) { - g_log (NULL, G_LOG_LEVEL_CRITICAL, "Some subprocesses were not terminated correctly!"); - } - (G_OBJECT_CLASS (x2goclient_network_ssh_parent_class))->finalize (object); } -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/libx2goclient.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository libx2goclient. commit d8ec4e0cc640252144d7c5444340374623d0e50f Author: Mihai Moldovan <ionic@ionic.de> Date: Thu Jul 30 14:39:48 2020 +0200 src/x2goclient-network-ssh.{c,h}: split out OpenSSH client process spawning into a separate function called x2goclient_network_ssh_start_sshcmd (). This is in preparation of spawning other OpenSSH client processes (like control processes for the master connection), so it's not a straight copy, but something more sophisticated. Also, the code is being reworked to not use an instance variable for the process but to keep it local, since we're in the process of changing this as well. --- src/x2goclient-network-ssh.c | 187 +++++++++++++++++++++++++++++-------------- src/x2goclient-network-ssh.h | 2 + 2 files changed, 130 insertions(+), 59 deletions(-) diff --git a/src/x2goclient-network-ssh.c b/src/x2goclient-network-ssh.c index 7344546..48a75a4 100644 --- a/src/x2goclient-network-ssh.c +++ b/src/x2goclient-network-ssh.c @@ -137,6 +137,7 @@ static void x2goclient_network_ssh_log_std_str (const gchar * const str, const g static gboolean x2goclient_network_ssh_gptrarray_to_string (GPtrArray * const arr, const gchar * const prelude, gchar ** const ret_str); 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 void x2goclient_network_ssh_class_init (X2GoClientNetworkSSHClass * const klass) { @@ -874,65 +875,7 @@ static gboolean x2goclient_network_ssh_parent_connect (X2GoClientNetwork * const x2goclient_network_ssh_gptrarray_print_debug (ssh_cmd, "Would try to connect via:", "OpenSSH client command"); g_log (NULL, G_LOG_LEVEL_DEBUG, "Launching!"); - GError *ssh_err = NULL; - GSubprocessFlags flags = G_SUBPROCESS_FLAGS_STDOUT_PIPE; - - if (self->openssh_bugs->backgrounding_keeps_stderr) { - flags |= G_SUBPROCESS_FLAGS_STDERR_SILENCE; - } - else { - flags |= G_SUBPROCESS_FLAGS_STDERR_PIPE; - } - - self->master_conn = g_subprocess_newv ((const gchar* const*)(ssh_cmd->pdata), flags, &ssh_err); - - ret = (self->master_conn != NULL); - - if (ret) { - g_log (NULL, G_LOG_LEVEL_DEBUG, "Process started/executed successfully!"); - - if (ssh_err) { - g_log (NULL, G_LOG_LEVEL_WARNING, "Successful execution, but ssh_err set? Weird, here's the message: %s", ssh_err->message); - } - - GCancellable *master_conn_comm_cancel = g_cancellable_new (); - g_clear_error (&ssh_err); - GBytes *ssh_stdout = NULL, *ssh_stderr = NULL; - if (!(g_subprocess_communicate (self->master_conn, NULL, master_conn_comm_cancel, &ssh_stdout, &ssh_stderr, &ssh_err))) { - g_log (NULL, G_LOG_LEVEL_CRITICAL, "Communication with master connection subprocess failed: %s", ssh_err->message); - } - else { - gsize ssh_stdout_size = 0, ssh_stderr_size = 0; - - const gchar *ssh_stdout_str = NULL, *ssh_stderr_str = NULL; - if (ssh_stdout) { - ssh_stdout_str = g_bytes_get_data (ssh_stdout, &ssh_stdout_size); - } - else { - g_log (NULL, G_LOG_LEVEL_WARNING, "Master connection does not have stdout pipe attached, but we expect it to be available. Ignoring output on stdout."); - } - - if (ssh_stderr) { - ssh_stderr_str = g_bytes_get_data (ssh_stderr, &ssh_stderr_size); - } - else if (!(self->openssh_bugs->backgrounding_keeps_stderr)) { - g_log (NULL, G_LOG_LEVEL_WARNING, "Master connection does not have stderr pipe attached, but we expect it to be available. Ignoring output on stderr."); - } - - x2goclient_network_ssh_log_std_str (ssh_stdout_str, ssh_stdout_size, 0); - x2goclient_network_ssh_log_std_str (ssh_stderr_str, ssh_stderr_size, 1); - - g_bytes_unref (ssh_stdout); - g_bytes_unref (ssh_stderr); - } - - g_clear_error (&ssh_err); - } - else { - g_log (NULL, G_LOG_LEVEL_CRITICAL, "Process didn't execute/start successfully!\nError:\n>>>%s<<<", ssh_err->message); - } - - g_clear_error (&ssh_err); + self->active_master_conn = ret = x2goclient_network_ssh_start_sshcmd (self, ssh_cmd, gerr, TRUE); } g_free (session_path); @@ -1283,3 +1226,129 @@ static gboolean x2goclient_network_ssh_sshcmd_add_host_port (X2GoClientNetworkSS return (ret); } + +static gboolean x2goclient_network_ssh_start_sshcmd (X2GoClientNetworkSSH * const self, const GPtrArray * const ssh_cmd, GError ** const gerr, const gboolean master) { + gboolean ret = FALSE; + + g_return_val_if_fail (X2GOCLIENT_IS_NETWORK_SSH (self), ret); + g_return_val_if_fail (ssh_cmd, ret); + g_return_val_if_fail (((NULL == gerr) || (NULL == *gerr)), ret); + + ret = TRUE; + + GError *proc_err = NULL; + GSubprocessFlags flags = G_SUBPROCESS_FLAGS_STDOUT_PIPE; + + if ((master) && (self->openssh_bugs->backgrounding_keeps_stderr)) { + flags |= G_SUBPROCESS_FLAGS_STDERR_SILENCE; + } + else { + flags |= G_SUBPROCESS_FLAGS_STDERR_PIPE; + } + + GSubprocess *proc = g_subprocess_newv ((const gchar* const*)(ssh_cmd->pdata), flags, &proc_err); + + ret = (proc != NULL); + + if (ret) { + g_log (NULL, G_LOG_LEVEL_DEBUG, "OpenSSH client process started/executed successfully!"); + + if (proc_err) { + g_log (NULL, G_LOG_LEVEL_WARNING, "Successful execution, but ssh_err set? Weird, here's the message: %s", proc_err->message); + } + + GCancellable *proc_comm_cancel = g_cancellable_new (); + g_clear_error (&proc_err); + GBytes *proc_stdout = NULL, *proc_stderr = NULL; + if (!(g_subprocess_communicate (proc, NULL, proc_comm_cancel, &proc_stdout, &proc_stderr, &proc_err))) { + const gchar *desc = "master connection"; + + if (!(master)) { + desc = "control command"; + } + + g_propagate_prefixed_error (gerr, proc_err, "Communication with %s subprocess failed: ", desc); + + if (!(gerr)) { + g_log (NULL, G_LOG_LEVEL_WARNING, "Communication with %s subprocess failed: %s", desc, proc_err->message); + } + + ret = FALSE; + } + else { + /* Okay, everything seems to have worked out correctly, read the data. */ + gsize proc_stdout_size = 0, proc_stderr_size = 0; + const gchar *proc_stdout_str = NULL, *proc_stderr_str = NULL; + + const gchar *desc = "Master connection"; + + if (!(master)) { + desc = "Control command"; + } + + if (proc_stdout) { + proc_stdout_str = g_bytes_get_data (proc_stdout, &proc_stdout_size); + } + else { + g_log (NULL, G_LOG_LEVEL_WARNING, "%s does not have stdout pipe attached, but we expect it to be available. Ignoring output on stdout.", desc); + } + + if (proc_stderr) { + proc_stderr_str = g_bytes_get_data (proc_stderr, &proc_stderr_size); + } + else if ((!(master)) || (!(self->openssh_bugs->backgrounding_keeps_stderr))) { + g_log (NULL, G_LOG_LEVEL_WARNING, "%s does not have stderr pipe attached, but we expect it to be available. Ignoring output on stderr.", desc); + } + + x2goclient_network_ssh_log_std_str (proc_stdout_str, proc_stdout_size, 0); + x2goclient_network_ssh_log_std_str (proc_stderr_str, proc_stderr_size, 1); + + g_bytes_unref (proc_stdout); + g_bytes_unref (proc_stderr); + + /* This should be true, but I guess it doesn't hurt to check. + * + * Also, this should really be something like gassert (), but that + * doesn't exist and the existing warning and assertion + * functions/macros are not up to the task (since they return from + * the calling function, leaving objects around). + * + * assert () itself likewise is not useful in this case because such + * assertions can be turned off. + */ + if (!(g_subprocess_get_if_exited (proc))) { + g_set_error (gerr, X2GOCLIENT_NETWORK_SSH_ERROR, X2GOCLIENT_NETWORK_SSH_ERROR_PROC_COMMUNICATE_TRUE_RETVAL_UNAVAILABLE, "%s spawned successfully, but exit status not available.", desc); + + if (!(gerr)) { + g_log (NULL, G_LOG_LEVEL_WARNING, "%s spawned successfully, but exit status not available.", desc); + } + + ret = FALSE; + } + else { + /* Check process return value. */ + const gint exit_status = g_subprocess_get_exit_status (proc); + + ret = (!(exit_status)); + + if (!(ret)) { + g_set_error (gerr, X2GOCLIENT_NETWORK_SSH_ERROR, X2GOCLIENT_NETWORK_SSH_ERROR_PROC_RETVAL_NONZERO, "%s failed to execute successfully, return value: %d.", desc, exit_status); + + if (!(gerr)) { + g_log (NULL, G_LOG_LEVEL_WARNING, "%s failed to execute successfully, return value: %d.", desc, exit_status); + } + } + } + } + } + else { + g_log (NULL, G_LOG_LEVEL_CRITICAL, "Process didn't execute/start successfully!\nError:\n>>>%s<<<", proc_err->message); + } + + g_object_unref (proc); + proc = NULL; + + g_clear_error (&proc_err); + + return (ret); +} diff --git a/src/x2goclient-network-ssh.h b/src/x2goclient-network-ssh.h index 5fa346d..690d550 100644 --- a/src/x2goclient-network-ssh.h +++ b/src/x2goclient-network-ssh.h @@ -67,6 +67,8 @@ enum { X2GOCLIENT_NETWORK_SSH_ERROR_CONNECT_NATIVE_FETCH, X2GOCLIENT_NETWORK_SSH_ERROR_CONNECT_SOCK_ADDR_UNKNOWN, X2GOCLIENT_NETWORK_SSH_ERROR_CONNECT_OPTIONS_INVALID, + X2GOCLIENT_NETWORK_SSH_ERROR_PROC_COMMUNICATE_TRUE_RETVAL_UNAVAILABLE, + X2GOCLIENT_NETWORK_SSH_ERROR_PROC_RETVAL_NONZERO, }; -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/libx2goclient.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository libx2goclient. commit ca3938f5b06c0b21760c10d9ceae6cfec32402b9 Author: Mihai Moldovan <ionic@ionic.de> Date: Mon Aug 3 12:45:37 2020 +0200 src/x2goclient-network.{c,h}: add new private parent_connect function pointer, to be used for x2goclient_network_connect (). --- src/x2goclient-network.c | 2 ++ src/x2goclient-network.h | 1 + 2 files changed, 3 insertions(+) diff --git a/src/x2goclient-network.c b/src/x2goclient-network.c index 811d6e9..83f51b1 100644 --- a/src/x2goclient-network.c +++ b/src/x2goclient-network.c @@ -130,6 +130,8 @@ static void x2goclient_network_class_init (X2GoClientNetworkClass * const klass) G_PARAM_STATIC_STRINGS | G_PARAM_READABLE); g_object_class_install_properties (object_class, X2GO_NET_N_PROPERTIES, net_obj_properties); + + klass->parent_connect = &x2goclient_network_connect; } static void x2goclient_network_init (X2GoClientNetwork * const self) { diff --git a/src/x2goclient-network.h b/src/x2goclient-network.h index cf96c35..5e0c15d 100644 --- a/src/x2goclient-network.h +++ b/src/x2goclient-network.h @@ -59,6 +59,7 @@ struct _X2GoClientNetworkClass { /*< private >*/ GSocketAddress* (*parse_sockspec) (X2GoClientNetwork * const self, const GString * const sockspec); + gboolean (*parent_connect) (X2GoClientNetwork * const self, GError ** const gerr); /* We might need a lot more functions... */ gpointer padding[50]; -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/libx2goclient.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository libx2goclient. commit 8feeaae7d2ae5371352910493078c9c1be9c4f1f Author: Mihai Moldovan <ionic@ionic.de> Date: Mon Sep 7 23:46:35 2020 +0200 src/x2goclient-network-ssh.c: actually assign data to check_thread instance variable. --- src/x2goclient-network-ssh.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/x2goclient-network-ssh.c b/src/x2goclient-network-ssh.c index eb83c29..c67b67e 100644 --- a/src/x2goclient-network-ssh.c +++ b/src/x2goclient-network-ssh.c @@ -1470,7 +1470,7 @@ static gboolean x2goclient_network_ssh_start_check_timeout (X2GoClientNetworkSSH g_mutex_lock (&(self->check_thread_mutex)); self->check_thread_context = g_main_context_new (); g_mutex_unlock (&(self->check_thread_mutex)); - g_thread_new ("check_thread", &x2goclient_network_ssh_check_timeout_thread_main, g_main_context_ref (self->check_thread_context)); + self->check_thread = g_thread_new ("check_thread", &x2goclient_network_ssh_check_timeout_thread_main, g_main_context_ref (self->check_thread_context)); x2goclient_network_ssh_start_check_timeout_invoke (self, gerr); -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/libx2goclient.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository libx2goclient. commit 8ea258e2414bc30cec10096b829671d316746c59 Author: Mihai Moldovan <ionic@ionic.de> Date: Mon Sep 14 06:23:37 2020 +0200 src/test/sshtest.c: sleep for 30 seconds after connection has been established, then tear everything down. --- src/test/sshtest.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/test/sshtest.c b/src/test/sshtest.c index 07e9ff6..f8fc78a 100644 --- a/src/test/sshtest.c +++ b/src/test/sshtest.c @@ -25,6 +25,7 @@ #include <stdio.h> #include <stdlib.h> #include <locale.h> +#include <unistd.h> #include <libintl.h> @@ -112,6 +113,9 @@ int main (const int argc, const char * const * const argv) { conn_ret = x2goclient_network_ssh_connect (net_ssh, NULL); g_printf ("Connection status: %s.\n", (conn_ret) ? "true" : "false"); + /* Let ssh connection live for a few seconds, give or take. */ + sleep (30); + g_clear_object (&net_ssh); return (ret); -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/libx2goclient.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository libx2goclient. commit 007bfa828a6b0c1fd60ea513a908450783698628 Author: Mihai Moldovan <ionic@ionic.de> Date: Mon Aug 3 12:49:45 2020 +0200 src/test/sshtest.c: try to connect a second time to see if the function is really idempotent now. --- src/test/sshtest.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/test/sshtest.c b/src/test/sshtest.c index fca6bf5..07e9ff6 100644 --- a/src/test/sshtest.c +++ b/src/test/sshtest.c @@ -100,9 +100,17 @@ int main (const int argc, const char * const * const argv) { g_object_get (G_OBJECT (net_ssh), "connected", &conn_ret, NULL); g_printf ("Current connection status (again): %d\n", (int) (conn_ret)); + /* Actually connect. */ g_printf ("Trying to connect...\n"); conn_ret = x2goclient_network_ssh_connect (net_ssh, NULL); g_printf ("Connection status: %s.\n", (conn_ret) ? "true" : "false"); + g_object_get (G_OBJECT (net_ssh), "connected", &conn_ret, NULL); + g_printf ("Current connection status (via getter): %d\n", (int) (conn_ret)); + + /* Connect again, shouldn't cause anything to change. */ + g_printf ("Trying to connect again...\n"); + conn_ret = x2goclient_network_ssh_connect (net_ssh, NULL); + g_printf ("Connection status: %s.\n", (conn_ret) ? "true" : "false"); g_clear_object (&net_ssh); -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/libx2goclient.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository libx2goclient. commit ddeb5313ffa880e392d1fb103102dc21a9a0864b Author: Mihai Moldovan <ionic@ionic.de> Date: Wed Aug 5 14:26:33 2020 +0200 src/x2goclient-network.c: add getter and setters for {write,read}-only properties. Even though the glib system will disallow access to these properties, it doesn't hurt to have the infrastructure available in case this ever changes. --- src/x2goclient-network.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/x2goclient-network.c b/src/x2goclient-network.c index 2ce92a6..d076817 100644 --- a/src/x2goclient-network.c +++ b/src/x2goclient-network.c @@ -212,6 +212,10 @@ static void x2goclient_network_set_property (GObject * const object, guint prop_ priv->socket_spec = g_value_dup_boxed (value); priv->socket = x2goclient_network_parse_sockspec (self, priv->socket_spec); break; + case (X2GO_NET_PROP_SOCKET): + g_clear_object (&(priv->socket)); + priv->socket = g_value_dup_object (value); + break; case (X2GO_NET_PROP_OPTIONS): g_clear_object (&(priv->options)); priv->options = g_value_dup_object (value); @@ -235,6 +239,9 @@ static void x2goclient_network_get_property (GObject * const object, const guint X2GoClientNetworkPrivate *priv = x2goclient_network_get_instance_private (self); switch (prop_id) { + case (X2GO_NET_PROP_SOCKET_SPEC): + g_value_set_boxed (value, priv->socket_spec); + break; case (X2GO_NET_PROP_SOCKET): g_value_set_object (value, priv->socket); break; -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/libx2goclient.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository libx2goclient. commit 115cda27322e6a335af016eac924e7dd9119c79c Author: Mihai Moldovan <ionic@ionic.de> Date: Mon Sep 7 23:46:54 2020 +0200 src/x2goclient-network-ssh.c: fix typo in debug message. --- src/x2goclient-network-ssh.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/x2goclient-network-ssh.c b/src/x2goclient-network-ssh.c index c67b67e..dff177d 100644 --- a/src/x2goclient-network-ssh.c +++ b/src/x2goclient-network-ssh.c @@ -1558,7 +1558,7 @@ static gboolean x2goclient_network_ssh_check_timeout (const gpointer data) { 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"); + x2goclient_network_ssh_gptrarray_print_debug (ssh_cmd, "Checking master connection status via:", "OpenSSH client command"); g_log (NULL, G_LOG_LEVEL_DEBUG, "Launching!"); ret = x2goclient_network_ssh_start_sshcmd (self, ssh_cmd, NULL, FALSE); -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/libx2goclient.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository libx2goclient. commit 54e91eed4cb4e0b9d602ae3509f4d9dd09f3197b Author: Mihai Moldovan <ionic@ionic.de> Date: Mon Aug 31 22:33:25 2020 +0200 src/x2goclient-network-ssh.c: move check timeout to a separate thread, add synchronization via a mutex. We cannot execute a timeout in the main (or, for that matter, callingg) thread, since that would require a running main loop. However, libx2goclient is supposed to be used by other applications and we cannot usefully force them into starting a glib main loop. Additionally, that would make executing any other code almost impossible, so that won't fly either way. Instead, spawn a different thread for this timer (timeout in glib-parlance) and synchronize access to instance variables (and, by extension, the newly added ones for the thread and the like). Also, make sure that the last check can run out correctly at object finalization time. --- src/x2goclient-network-ssh.c | 169 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 153 insertions(+), 16 deletions(-) diff --git a/src/x2goclient-network-ssh.c b/src/x2goclient-network-ssh.c index 56e1cd3..eb83c29 100644 --- a/src/x2goclient-network-ssh.c +++ b/src/x2goclient-network-ssh.c @@ -115,12 +115,21 @@ struct _X2GoClientNetworkSSH { char *control_path; gboolean active_master_conn; - guint check_timeout; + GSource *check_timeout_source; + GMutex check_thread_mutex; + GThread *check_thread; + GMainContext *check_thread_context; }; G_DEFINE_TYPE (X2GoClientNetworkSSH, x2goclient_network_ssh, X2GOCLIENT_TYPE_NETWORK); +struct x2goclient_network_ssh_check_timeout_data { + X2GoClientNetworkSSH *self; + GError **gerr; +}; + + /* See src/x2goclient-network.c regarding abbreviations. */ enum { X2GO_NET_SSH_PROP_OPENSSH_VERSION = 1, @@ -149,8 +158,12 @@ 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 void x2goclient_network_ssh_check_timeout_data_free (struct x2goclient_network_ssh_check_timeout_data *data); +static gpointer x2goclient_network_ssh_check_timeout_thread_main (const gpointer user_data); static gboolean x2goclient_network_ssh_start_check_timeout (X2GoClientNetworkSSH * const self, GError ** const gerr); - +static void x2goclient_network_ssh_start_check_timeout_invoke (X2GoClientNetworkSSH * const self, GError ** const gerr); +static gboolean x2goclient_network_ssh_start_check_timeout_idle_unwrap (const gpointer user_data); +static gboolean x2goclient_network_ssh_start_check_timeout_real (X2GoClientNetworkSSH * const self, GError ** const gerr); static gboolean x2goclient_network_ssh_check_timeout (const gpointer self); @@ -190,7 +203,10 @@ static void x2goclient_network_ssh_init (X2GoClientNetworkSSH * const self) { self->control_path = NULL; self->active_master_conn = FALSE; - self->check_timeout = 0; + self->check_timeout_source = NULL; + g_mutex_init (&(self->check_thread_mutex)); + self->check_thread = NULL; + self->check_thread_context = NULL; } X2GoClientNetworkSSH* x2goclient_network_ssh_new (const char * const session_path) { @@ -235,12 +251,26 @@ 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); - } + /* Remove timeout source. */ + g_mutex_lock (&(self->check_thread_mutex)); + if (self->check_timeout_source) { + g_source_destroy (self->check_timeout_source); + g_source_unref (self->check_timeout_source); + self->check_timeout_source = NULL; } - self->check_timeout = 0; + g_mutex_unlock (&(self->check_thread_mutex)); + + /* Let last event run out and thread terminate. */ + (void) g_thread_join (self->check_thread); + self->check_thread = NULL; + + /* + * Context should be gone by now, implicitly through the thread's main + * method, so let's just get rid of the pointer. + */ + self->check_thread_context = NULL; + + g_mutex_clear (&(self->check_thread_mutex)); if (!(x2goclient_network_ssh_kill_subprocesses (self))) { g_log (NULL, G_LOG_LEVEL_CRITICAL, "Some subprocesses were not terminated correctly!"); @@ -726,7 +756,10 @@ static gboolean x2goclient_network_ssh_kill_subprocesses (X2GoClientNetworkSSH * g_return_val_if_fail (X2GOCLIENT_IS_NETWORK_SSH (self), ret); + g_mutex_lock (&(self->check_thread_mutex)); if (self->active_master_conn) { + g_mutex_unlock (&(self->check_thread_mutex)); + /* Cleanup, if necessary. */ g_log (NULL, G_LOG_LEVEL_DEBUG, "Master connection cleanup required."); @@ -735,7 +768,9 @@ static gboolean x2goclient_network_ssh_kill_subprocesses (X2GoClientNetworkSSH * /* Add control path options. */ g_ptr_array_add (ssh_cmd, g_strdup ("-o")); + g_mutex_lock (&(self->check_thread_mutex)); g_ptr_array_add (ssh_cmd, g_strdup_printf ("ControlPath=\"%s\"", self->control_path)); + g_mutex_unlock (&(self->check_thread_mutex)); /* Add master socket command. */ g_ptr_array_add (ssh_cmd, g_strdup ("-O")); @@ -752,9 +787,14 @@ static gboolean x2goclient_network_ssh_kill_subprocesses (X2GoClientNetworkSSH * g_log (NULL, G_LOG_LEVEL_DEBUG, "Launching!"); ret = x2goclient_network_ssh_start_sshcmd (self, ssh_cmd, NULL, FALSE); + g_mutex_lock (&(self->check_thread_mutex)); self->active_master_conn = (!(ret)); + g_mutex_unlock (&(self->check_thread_mutex)); } } + else { + g_mutex_unlock (&(self->check_thread_mutex)); + } return (ret); } @@ -797,7 +837,9 @@ static gboolean x2goclient_network_ssh_parent_connect (X2GoClientNetwork * const GString *tmp_string = g_string_new (session_path); g_string_append (tmp_string, "/ssh/control"); + g_mutex_lock (&(self->check_thread_mutex)); self->control_path = g_string_free (tmp_string, FALSE); + g_mutex_unlock (&(self->check_thread_mutex)); gchar *dirname = g_path_get_dirname (self->control_path); errno = 0; @@ -837,7 +879,9 @@ static gboolean x2goclient_network_ssh_parent_connect (X2GoClientNetwork * const g_log (NULL, G_LOG_LEVEL_INFO, "Fetched OpenSSH version: [ Major: %d, Minor: %d, Patch: %d, Additional Data: '%s' ]", self->openssh_version->major, self->openssh_version->minor, self->openssh_version->patch, self->openssh_version->addon); /* Update/populate bugs structure. */ + g_mutex_lock (&(self->check_thread_mutex)); ret = x2goclient_openssh_bugs_update (self->openssh_bugs, self->openssh_version, gerr); + g_mutex_unlock (&(self->check_thread_mutex)); } if (ret) { @@ -903,7 +947,10 @@ static gboolean x2goclient_network_ssh_parent_connect (X2GoClientNetwork * const x2goclient_network_ssh_gptrarray_print_debug (ssh_cmd, "Would try to connect via:", "OpenSSH client command"); g_log (NULL, G_LOG_LEVEL_DEBUG, "Launching!"); - self->active_master_conn = ret = x2goclient_network_ssh_start_sshcmd (self, ssh_cmd, gerr, TRUE); + ret = x2goclient_network_ssh_start_sshcmd (self, ssh_cmd, gerr, TRUE); + g_mutex_lock (&(self->check_thread_mutex)); + self->active_master_conn = ret; + g_mutex_unlock (&(self->check_thread_mutex)); } if (ret) { @@ -936,8 +983,10 @@ static gboolean x2goclient_network_ssh_fetch_openssh_version (X2GoClientNetworkS * it), so we'll have to duplicate a bit of code and can't use the * GObject property setter directly. */ + g_mutex_lock (&(self->check_thread_mutex)); x2goclient_openssh_version_free (self->openssh_version); self->openssh_version = version; + g_mutex_unlock (&(self->check_thread_mutex)); ret = TRUE; } @@ -1385,23 +1434,103 @@ static gboolean x2goclient_network_ssh_start_sshcmd (X2GoClientNetworkSSH * cons return (ret); } +static void x2goclient_network_ssh_check_timeout_data_free (struct x2goclient_network_ssh_check_timeout_data *data) { + /* No need to clear any data within the structure. */ + g_free (data); +} + +static gpointer x2goclient_network_ssh_check_timeout_thread_main (const gpointer user_data) { + gpointer ret = NULL; + + GMainContext *main_context = user_data; + GMainLoop *main_loop; + + /* Make given main context the default one for this thread. */ + g_main_context_push_thread_default (main_context); + + /* Add new main loop and execute it. */ + main_loop = g_main_loop_new (main_context, FALSE); + g_main_loop_run (main_loop); + + /* Clean up everything after g_main_loop_run () returned. */ + g_main_loop_unref (main_loop); + + g_main_context_pop_thread_default (main_context); + g_main_context_unref (main_context); + + 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); + g_mutex_lock (&(self->check_thread_mutex)); + self->check_thread_context = g_main_context_new (); + g_mutex_unlock (&(self->check_thread_mutex)); + g_thread_new ("check_thread", &x2goclient_network_ssh_check_timeout_thread_main, g_main_context_ref (self->check_thread_context)); - ret = (!(!(check_id))); + x2goclient_network_ssh_start_check_timeout_invoke (self, gerr); - if (ret) { - self->check_timeout = check_id; + ret = TRUE; + + return (ret); +} + +static void x2goclient_network_ssh_start_check_timeout_invoke (X2GoClientNetworkSSH * const self, GError ** const gerr) { + g_return_if_fail (X2GOCLIENT_IS_NETWORK_SSH (self)); + g_return_if_fail (((NULL == gerr) || (NULL == *gerr))); + + struct x2goclient_network_ssh_check_timeout_data *data = g_new0 (struct x2goclient_network_ssh_check_timeout_data, 1); + data->self = self; + data->gerr = gerr; + + g_main_context_invoke_full (self->check_thread_context, G_PRIORITY_DEFAULT, + &x2goclient_network_ssh_start_check_timeout_idle_unwrap, + data, (GDestroyNotify) x2goclient_network_ssh_check_timeout_data_free); +} + +static gboolean x2goclient_network_ssh_start_check_timeout_idle_unwrap (const gpointer user_data) { + gboolean ret = G_SOURCE_CONTINUE; + + const struct x2goclient_network_ssh_check_timeout_data *data = user_data; + + g_return_val_if_fail (X2GOCLIENT_IS_NETWORK_SSH (data->self), ret); + g_return_val_if_fail (((NULL == data->gerr) || (NULL == *(data->gerr))), ret); + + if (x2goclient_network_ssh_start_check_timeout_real (data->self, data->gerr)) { + ret = G_SOURCE_REMOVE; } return (ret); } +static gboolean x2goclient_network_ssh_start_check_timeout_real (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); + + g_mutex_lock (&(self->check_thread_mutex)); + + /* Add source. */ + self->check_timeout_source = g_timeout_source_new (50); + + /* Bind check function to timeout source. */ + g_source_set_callback (self->check_timeout_source, &x2goclient_network_ssh_check_timeout, self, NULL); + + /* Bind timeout source to thread context. */ + guint check_id = g_source_attach (self->check_timeout_source, self->check_thread_context); + + g_mutex_unlock (&(self->check_thread_mutex)); + + ret = (!(!(check_id))); + + return (ret); +} + static gboolean x2goclient_network_ssh_check_timeout (const gpointer data) { gboolean ret = FALSE; @@ -1414,7 +1543,9 @@ static gboolean x2goclient_network_ssh_check_timeout (const gpointer data) { /* Add control path options. */ g_ptr_array_add (ssh_cmd, g_strdup ("-o")); + g_mutex_lock (&(self->check_thread_mutex)); g_ptr_array_add (ssh_cmd, g_strdup_printf ("ControlPath=\"%s\"", self->control_path)); + g_mutex_unlock (&(self->check_thread_mutex)); /* Add master socket command. */ g_ptr_array_add (ssh_cmd, g_strdup ("-O")); @@ -1434,11 +1565,17 @@ static gboolean x2goclient_network_ssh_check_timeout (const gpointer data) { } if (!(ret)) { - /* We'll return FALSE, so make sure to reset the instance variable. */ - self->check_timeout = 0; + /* We'll return FALSE, so make sure to delete the source. */ + g_mutex_lock (&(self->check_thread_mutex)); + if (self->check_timeout_source) { + g_source_destroy (self->check_timeout_source); + g_source_unref (self->check_timeout_source); + self->check_timeout_source = NULL; + } - /* Also, mark the master connection is terminated/gone. */ + /* Also, mark the master connection as terminated/gone. */ self->active_master_conn = FALSE; + g_mutex_unlock (&(self->check_thread_mutex)); } return (ret); -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/libx2goclient.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository libx2goclient. commit c8853faa12e582e0584eed330d2054993bc4e972 Author: Mihai Moldovan <ionic@ionic.de> Date: Wed Aug 5 15:37:03 2020 +0200 src/x2goclient-network-ssh.c: use connect-function property to fetch parent connect function. This includes a rather odd typedef for the parent connect function (proto)type, which is explained in a comment. --- src/x2goclient-network-ssh.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/x2goclient-network-ssh.c b/src/x2goclient-network-ssh.c index af5682e..56e1cd3 100644 --- a/src/x2goclient-network-ssh.c +++ b/src/x2goclient-network-ssh.c @@ -63,6 +63,17 @@ struct _X2GoClientNetworkOptionsSSH { G_DEFINE_TYPE (X2GoClientNetworkOptionsSSH, x2goclient_network_options_ssh, X2GOCLIENT_TYPE_NETWORK_OPTIONS); + +/* + * This is a bit unsafe and odd, but we need a function pointer (proto)type + * for later use. + * + * It probably makes sense to keep it as generic as possible, though, to + * improve maintainability. + */ +typedef gboolean (*parent_connect_type) (void * const self, void * const gerr); + + static void x2goclient_network_options_ssh_class_init (X2GoClientNetworkOptionsSSHClass * const klass) { } @@ -757,7 +768,14 @@ gboolean x2goclient_network_ssh_connect (X2GoClientNetworkSSH * const self, GErr X2GoClientNetwork *parent = X2GOCLIENT_NETWORK (self); X2GoClientNetworkClass *parent_class = X2GOCLIENT_NETWORK_GET_CLASS (parent); - ret = parent_class->parent_connect (parent, gerr); + /* Fetch parent's connect function. */ + parent_connect_type parent_connect = NULL; + g_object_get (G_OBJECT (self), "connect-function", &parent_connect, NULL); + g_assert (parent_connect); + + if (parent_connect) { + ret = parent_connect (parent, gerr); + } return (ret); } -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/libx2goclient.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository libx2goclient. commit 7e61eea51fc5090dd590962e15c0a5bc925eb13e Author: Mihai Moldovan <ionic@ionic.de> Date: Mon Sep 14 06:17:04 2020 +0200 src/x2goclient-network-ssh.c: change timeout check to 3000 ms (3 seconds) while debugging. Also, add notes to revert that after debugging and to make it non-static at some later time (to account for things like round-trip times if the control socket is non-local). --- src/x2goclient-network-ssh.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/x2goclient-network-ssh.c b/src/x2goclient-network-ssh.c index dff177d..40fa0de 100644 --- a/src/x2goclient-network-ssh.c +++ b/src/x2goclient-network-ssh.c @@ -1516,7 +1516,22 @@ static gboolean x2goclient_network_ssh_start_check_timeout_real (X2GoClientNetwo g_mutex_lock (&(self->check_thread_mutex)); /* Add source. */ - self->check_timeout_source = g_timeout_source_new (50); + /* FIXME: revert back to 50 ms after debugging. */ + /* FIXME: is a static value the right way to go here? + * Checking if the master connection is still alive every 50 ms is + * fine IFF the connection is local (i.e., a local UNIX socket). + * However, since we want to eventually forward UNIX sockets (one of + * the reasons for using OpenSSH instead of other libraries), a UNIX + * socket might not be local and it's not entirely unthinkable that + * we'll eventually forward even control UNIX sockets. + * In such a case, even though communication with the socket looks + * transparent to everything else, it will still incur round-trip + * times that might exceed our default value of 50 ms, which isn't a + * big problem per se, but wasting CPU and network resources. + * We'd be fine running the check every 5 round trips, so a static + * value is not that great, really. + */ + self->check_timeout_source = g_timeout_source_new (3000); /* Bind check function to timeout source. */ g_source_set_callback (self->check_timeout_source, &x2goclient_network_ssh_check_timeout, self, NULL); -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/libx2goclient.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository libx2goclient. commit 1a1e7d0ed0ded0580c36e462f6e0ae6a0960163f Author: Mihai Moldovan <ionic@ionic.de> Date: Wed Sep 16 05:42:12 2020 +0200 src/x2goclient-network-ssh.c: check timeout is not an idle source, rename unwrapping function to x2goclient_network_ssh_start_check_timeout_unwrap. --- src/x2goclient-network-ssh.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/x2goclient-network-ssh.c b/src/x2goclient-network-ssh.c index eb6d3fd..9eb96ae 100644 --- a/src/x2goclient-network-ssh.c +++ b/src/x2goclient-network-ssh.c @@ -162,7 +162,7 @@ static void x2goclient_network_ssh_check_timeout_data_free (struct x2goclient_ne static gpointer x2goclient_network_ssh_check_timeout_thread_main (const gpointer user_data); static gboolean x2goclient_network_ssh_start_check_timeout (X2GoClientNetworkSSH * const self, GError ** const gerr); static void x2goclient_network_ssh_start_check_timeout_invoke (X2GoClientNetworkSSH * const self, GError ** const gerr); -static gboolean x2goclient_network_ssh_start_check_timeout_idle_unwrap (const gpointer user_data); +static gboolean x2goclient_network_ssh_start_check_timeout_unwrap (const gpointer user_data); static gboolean x2goclient_network_ssh_start_check_timeout_real (X2GoClientNetworkSSH * const self, GError ** const gerr); static gboolean x2goclient_network_ssh_check_timeout (const gpointer self); @@ -1488,11 +1488,11 @@ static void x2goclient_network_ssh_start_check_timeout_invoke (X2GoClientNetwork data->gerr = gerr; g_main_context_invoke_full (self->check_thread_context, G_PRIORITY_DEFAULT, - &x2goclient_network_ssh_start_check_timeout_idle_unwrap, + &x2goclient_network_ssh_start_check_timeout_unwrap, data, (GDestroyNotify) x2goclient_network_ssh_check_timeout_data_free); } -static gboolean x2goclient_network_ssh_start_check_timeout_idle_unwrap (const gpointer user_data) { +static gboolean x2goclient_network_ssh_start_check_timeout_unwrap (const gpointer user_data) { gboolean ret = G_SOURCE_CONTINUE; const struct x2goclient_network_ssh_check_timeout_data *data = user_data; -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/libx2goclient.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository libx2goclient. commit 3d8d50f014d8c486f28876490d54ba968a48b12f Author: Mihai Moldovan <ionic@ionic.de> Date: Wed Aug 5 14:17:00 2020 +0200 src/x2goclient-network.c: reorder properties in setter to keep original order. --- src/x2goclient-network.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/x2goclient-network.c b/src/x2goclient-network.c index 83f51b1..2ce92a6 100644 --- a/src/x2goclient-network.c +++ b/src/x2goclient-network.c @@ -212,15 +212,15 @@ static void x2goclient_network_set_property (GObject * const object, guint prop_ priv->socket_spec = g_value_dup_boxed (value); priv->socket = x2goclient_network_parse_sockspec (self, priv->socket_spec); break; + case (X2GO_NET_PROP_OPTIONS): + g_clear_object (&(priv->options)); + priv->options = g_value_dup_object (value); + break; case (X2GO_NET_PROP_SESSION_PATH): g_free (priv->session_path); priv->session_path = NULL; priv->session_path = g_value_dup_string (value); break; - case (X2GO_NET_PROP_OPTIONS): - g_clear_object (&(priv->options)); - priv->options = g_value_dup_object (value); - break; case (X2GO_NET_PROP_CONNECTED): priv->connected = g_value_get_boolean (value); break; -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/libx2goclient.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository libx2goclient. commit 7ee08cf186d31789e6c496f199ee96d04c6847d5 Author: Mihai Moldovan <ionic@ionic.de> Date: Wed Aug 5 14:55:33 2020 +0200 src/x2goclient-network.{c,h}: make parent_connection function pointer a read-only property called connect-function acting on an instance private called connect_function, add getter and setter. This makes it way safer to use, especially since it can now be truly immutable, only set once in this class's initialization. --- src/x2goclient-network.c | 18 ++++++++++++++++-- src/x2goclient-network.h | 1 - 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/x2goclient-network.c b/src/x2goclient-network.c index d076817..6ba5b24 100644 --- a/src/x2goclient-network.c +++ b/src/x2goclient-network.c @@ -55,6 +55,7 @@ typedef struct X2GoClientNetworkPrivate_ { X2GoClientNetworkOptions *options; gchar *session_path; /* Will eventually be replaced with a session object, probably. */ gboolean connected; + gboolean (*connect_func) (X2GoClientNetwork * const self, GError ** const gerr); } X2GoClientNetworkPrivate; G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (X2GoClientNetwork, x2goclient_network, G_TYPE_OBJECT); @@ -73,6 +74,7 @@ enum { X2GO_NET_PROP_OPTIONS, X2GO_NET_PROP_SESSION_PATH, X2GO_NET_PROP_CONNECTED, + X2GO_NET_PROP_CONN_FUNC, X2GO_NET_N_PROPERTIES }; @@ -129,9 +131,12 @@ static void x2goclient_network_class_init (X2GoClientNetworkClass * const klass) FALSE, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE); - g_object_class_install_properties (object_class, X2GO_NET_N_PROPERTIES, net_obj_properties); + net_obj_properties[X2GO_NET_PROP_CONN_FUNC] = g_param_spec_pointer ("connect-function", _("Pointer to this instance's connect function"), + _("A pointer to the instance's connect function. " + "This is supposed to be immutable."), + G_PARAM_STATIC_STRINGS | G_PARAM_READABLE); - klass->parent_connect = &x2goclient_network_connect; + g_object_class_install_properties (object_class, X2GO_NET_N_PROPERTIES, net_obj_properties); } static void x2goclient_network_init (X2GoClientNetwork * const self) { @@ -141,6 +146,7 @@ static void x2goclient_network_init (X2GoClientNetwork * const self) { priv->options = NULL; priv->session_path = NULL; priv->connected = FALSE; + priv->connect_func = &x2goclient_network_connect; } static void x2goclient_network_dispose (GObject * const object) { @@ -162,6 +168,8 @@ static void x2goclient_network_finalize (GObject * const object) { g_free (priv->session_path); priv->session_path = NULL; + priv->connect_func = NULL; + (G_OBJECT_CLASS (x2goclient_network_parent_class))->finalize (object); } @@ -228,6 +236,9 @@ static void x2goclient_network_set_property (GObject * const object, guint prop_ case (X2GO_NET_PROP_CONNECTED): priv->connected = g_value_get_boolean (value); break; + case (X2GO_NET_PROP_CONN_FUNC): + priv->connect_func = g_value_get_pointer (value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, param_spec); break; @@ -254,6 +265,9 @@ static void x2goclient_network_get_property (GObject * const object, const guint case (X2GO_NET_PROP_CONNECTED): g_value_set_boolean (value, priv->connected); break; + case (X2GO_NET_PROP_CONN_FUNC): + g_value_set_pointer (value, priv->connect_func); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, param_spec); break; diff --git a/src/x2goclient-network.h b/src/x2goclient-network.h index 5e0c15d..cf96c35 100644 --- a/src/x2goclient-network.h +++ b/src/x2goclient-network.h @@ -59,7 +59,6 @@ struct _X2GoClientNetworkClass { /*< private >*/ GSocketAddress* (*parse_sockspec) (X2GoClientNetwork * const self, const GString * const sockspec); - gboolean (*parent_connect) (X2GoClientNetwork * const self, GError ** const gerr); /* We might need a lot more functions... */ gpointer padding[50]; -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/libx2goclient.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository libx2goclient. commit 67c9306b4d0b23ccdc35943bee170cd4988e44b6 Author: Mihai Moldovan <ionic@ionic.de> Date: Wed Sep 16 05:42:52 2020 +0200 src/x2goclient-network-ssh.c: add parenthesis to cast, non-functional. --- src/x2goclient-network-ssh.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/x2goclient-network-ssh.c b/src/x2goclient-network-ssh.c index 9eb96ae..6b8b149 100644 --- a/src/x2goclient-network-ssh.c +++ b/src/x2goclient-network-ssh.c @@ -1489,7 +1489,7 @@ static void x2goclient_network_ssh_start_check_timeout_invoke (X2GoClientNetwork g_main_context_invoke_full (self->check_thread_context, G_PRIORITY_DEFAULT, &x2goclient_network_ssh_start_check_timeout_unwrap, - data, (GDestroyNotify) x2goclient_network_ssh_check_timeout_data_free); + data, (GDestroyNotify) (&x2goclient_network_ssh_check_timeout_data_free)); } static gboolean x2goclient_network_ssh_start_check_timeout_unwrap (const gpointer user_data) { -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/libx2goclient.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository libx2goclient. commit 8e4cad6b0fe9967f2deaeed0b85adfa60c0b9351 Author: Mihai Moldovan <ionic@ionic.de> Date: Wed Sep 16 05:25:48 2020 +0200 src/x2goclient-network-ssh.c: make parameter to x2goclient_network_ssh_check_timeout_data_free const )not const-data). --- src/x2goclient-network-ssh.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/x2goclient-network-ssh.c b/src/x2goclient-network-ssh.c index 40fa0de..eb6d3fd 100644 --- a/src/x2goclient-network-ssh.c +++ b/src/x2goclient-network-ssh.c @@ -158,7 +158,7 @@ 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 void x2goclient_network_ssh_check_timeout_data_free (struct x2goclient_network_ssh_check_timeout_data *data); +static void x2goclient_network_ssh_check_timeout_data_free (struct x2goclient_network_ssh_check_timeout_data * const data); static gpointer x2goclient_network_ssh_check_timeout_thread_main (const gpointer user_data); static gboolean x2goclient_network_ssh_start_check_timeout (X2GoClientNetworkSSH * const self, GError ** const gerr); static void x2goclient_network_ssh_start_check_timeout_invoke (X2GoClientNetworkSSH * const self, GError ** const gerr); @@ -1434,7 +1434,7 @@ static gboolean x2goclient_network_ssh_start_sshcmd (X2GoClientNetworkSSH * cons return (ret); } -static void x2goclient_network_ssh_check_timeout_data_free (struct x2goclient_network_ssh_check_timeout_data *data) { +static void x2goclient_network_ssh_check_timeout_data_free (struct x2goclient_network_ssh_check_timeout_data * const data) { /* No need to clear any data within the structure. */ g_free (data); } -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/libx2goclient.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository libx2goclient. commit 9ba06519e055dc9552182985e68bbbcc21e9370a Author: Mihai Moldovan <ionic@ionic.de> Date: Thu Sep 17 10:58:28 2020 +0200 src/test/sshtest.c: only try to connect again if the first connection succeeded. --- src/test/sshtest.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/test/sshtest.c b/src/test/sshtest.c index f8fc78a..1a3294f 100644 --- a/src/test/sshtest.c +++ b/src/test/sshtest.c @@ -108,13 +108,15 @@ int main (const int argc, const char * const * const argv) { g_object_get (G_OBJECT (net_ssh), "connected", &conn_ret, NULL); g_printf ("Current connection status (via getter): %d\n", (int) (conn_ret)); - /* Connect again, shouldn't cause anything to change. */ - g_printf ("Trying to connect again...\n"); - conn_ret = x2goclient_network_ssh_connect (net_ssh, NULL); - g_printf ("Connection status: %s.\n", (conn_ret) ? "true" : "false"); - - /* Let ssh connection live for a few seconds, give or take. */ - sleep (30); + if (conn_ret) { + /* Connect again, shouldn't cause anything to change. */ + g_printf ("Trying to connect again...\n"); + conn_ret = x2goclient_network_ssh_connect (net_ssh, NULL); + g_printf ("Connection status: %s.\n", (conn_ret) ? "true" : "false"); + + /* Let ssh connection live for a few seconds, give or take. */ + sleep (30); + } g_clear_object (&net_ssh); -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/libx2goclient.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository libx2goclient. commit 1a452780e97fba2ac7a80900097cb9f99dd6e01d Author: Mihai Moldovan <ionic@ionic.de> Date: Thu Sep 17 12:02:08 2020 +0200 src/x2goclient-network-ssh.c: initialize main loop pointer for good measure. It's going away, but we'd still better do this. --- src/x2goclient-network-ssh.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/x2goclient-network-ssh.c b/src/x2goclient-network-ssh.c index 082ddc0..bfdce29 100644 --- a/src/x2goclient-network-ssh.c +++ b/src/x2goclient-network-ssh.c @@ -1454,7 +1454,7 @@ static void x2goclient_network_ssh_check_timeout_data_free (struct x2goclient_ne static gpointer x2goclient_network_ssh_check_timeout_thread_main (const gpointer user_data) { gpointer ret = NULL; - GMainLoop *main_loop; + GMainLoop *main_loop = NULL; X2GoClientNetworkSSH *self = user_data; g_return_val_if_fail (X2GOCLIENT_IS_NETWORK_SSH (self), ret); -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/libx2goclient.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository libx2goclient. commit 108c6b480b172d2c9971fa5a1c51e98b2bb94b60 Author: Mihai Moldovan <ionic@ionic.de> Date: Thu Sep 17 11:06:42 2020 +0200 src/x2goclient-openssh-bugs.c: bump version requirement for stderr closing to 8.5+. --- src/x2goclient-openssh-bugs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/x2goclient-openssh-bugs.c b/src/x2goclient-openssh-bugs.c index 1c7fa45..da59144 100644 --- a/src/x2goclient-openssh-bugs.c +++ b/src/x2goclient-openssh-bugs.c @@ -73,7 +73,7 @@ gboolean x2goclient_openssh_bugs_update (X2GoClientOpenSSHBugs * const self, con *self = (const X2GoClientOpenSSHBugs) { 0 }; if (8 >= version->major) { - if (2 >= version->minor) { + if (4 >= version->minor) { self->backgrounding_keeps_stderr = TRUE; } } -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/libx2goclient.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository libx2goclient. commit f89c2dccf442b4ac49a455b248072309ae61f97a Author: Mihai Moldovan <ionic@ionic.de> Date: Fri Sep 18 01:44:50 2020 +0200 src/x2goclient-network-ssh.c: add comment only. --- src/x2goclient-network-ssh.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/x2goclient-network-ssh.c b/src/x2goclient-network-ssh.c index d0e9a95..607c41e 100644 --- a/src/x2goclient-network-ssh.c +++ b/src/x2goclient-network-ssh.c @@ -1495,6 +1495,7 @@ static gboolean x2goclient_network_ssh_start_check_timeout (X2GoClientNetworkSSH g_return_val_if_fail (((NULL == gerr) || (NULL == *gerr)), ret); g_mutex_lock (&(self->check_thread_mutex)); + /* Create main context. */ self->check_thread_context = g_main_context_new (); /* Create new main loop. */ -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/libx2goclient.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository libx2goclient. commit b6d34d01c14f4c68be30c42fa648457b85af2e45 Author: Mihai Moldovan <ionic@ionic.de> Date: Thu Sep 17 11:59:59 2020 +0200 src/x2goclient-network-ssh.c: let x2goclient_network_ssh_finalize () make more use of the mutex. While doing so, keep the mutex clear while joining the check thread. Otherwise, we'll run into a nasty deadlock: - main thread takes lock - main thread kills check thread's main loop (currently not done, TBD) - main thread waits for check thread termination (join) - check thread tries to acquire lock after main loop termination to continue executing/cleaning up and terminating its main function - both threads wait forever. --- src/x2goclient-network-ssh.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/x2goclient-network-ssh.c b/src/x2goclient-network-ssh.c index daa0605..082ddc0 100644 --- a/src/x2goclient-network-ssh.c +++ b/src/x2goclient-network-ssh.c @@ -258,11 +258,20 @@ static void x2goclient_network_ssh_finalize (GObject * const object) { g_source_unref (self->check_timeout_source); self->check_timeout_source = NULL; } - g_mutex_unlock (&(self->check_thread_mutex)); /* Let last event run out and thread terminate. */ if (self->check_thread) { + /* + * Keep the mutex clear while joining the thread. + * + * Otherwise, the thread's main function won't continue to execute (and + * finish) after its main loop (correctly) terminated. + */ + g_mutex_unlock (&(self->check_thread_mutex)); + (void) g_thread_join (self->check_thread); + + g_mutex_lock (&(self->check_thread_mutex)); self->check_thread = NULL; } @@ -271,6 +280,7 @@ static void x2goclient_network_ssh_finalize (GObject * const object) { * method, so let's just get rid of the pointer. */ self->check_thread_context = NULL; + g_mutex_unlock (&(self->check_thread_mutex)); g_mutex_clear (&(self->check_thread_mutex)); -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/libx2goclient.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository libx2goclient. commit fc378873b96bb9673b4460dc85e14aa956c38534 Author: Mihai Moldovan <ionic@ionic.de> Date: Thu Sep 17 11:39:39 2020 +0200 src/x2goclient-network-ssh.c: pass self instead of the main context to check thread main function. We'll eventually need this later on. Doing that sadly also means that we have to protect it through the mutex, including locking and unlocking calls in the check thread's main function. --- src/x2goclient-network-ssh.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/x2goclient-network-ssh.c b/src/x2goclient-network-ssh.c index 1ddc299..daa0605 100644 --- a/src/x2goclient-network-ssh.c +++ b/src/x2goclient-network-ssh.c @@ -1444,21 +1444,31 @@ static void x2goclient_network_ssh_check_timeout_data_free (struct x2goclient_ne static gpointer x2goclient_network_ssh_check_timeout_thread_main (const gpointer user_data) { gpointer ret = NULL; - GMainContext *main_context = user_data; GMainLoop *main_loop; + X2GoClientNetworkSSH *self = user_data; + g_return_val_if_fail (X2GOCLIENT_IS_NETWORK_SSH (self), ret); + + g_mutex_lock (&(self->check_thread_mutex)); /* Make given main context the default one for this thread. */ - g_main_context_push_thread_default (main_context); + g_main_context_push_thread_default (self->check_thread_context); + g_mutex_unlock (&(self->check_thread_mutex)); /* Add new main loop and execute it. */ main_loop = g_main_loop_new (main_context, FALSE); g_main_loop_run (main_loop); + g_mutex_lock (&(self->check_thread_mutex)); /* Clean up everything after g_main_loop_run () returned. */ g_main_loop_unref (main_loop); - g_main_context_pop_thread_default (main_context); - g_main_context_unref (main_context); + /* Unmap context. */ + g_main_context_pop_thread_default (self->check_thread_context); + + /* Destroy context. */ + g_main_context_unref (self->check_thread_context); + self->check_thread_context = NULL; + g_mutex_unlock (&(self->check_thread_mutex)); return (ret); } @@ -1471,8 +1481,10 @@ static gboolean x2goclient_network_ssh_start_check_timeout (X2GoClientNetworkSSH g_mutex_lock (&(self->check_thread_mutex)); self->check_thread_context = g_main_context_new (); + + /* Create and start thread. */ + self->check_thread = g_thread_new ("check_thread", &x2goclient_network_ssh_check_timeout_thread_main, self); g_mutex_unlock (&(self->check_thread_mutex)); - self->check_thread = g_thread_new ("check_thread", &x2goclient_network_ssh_check_timeout_thread_main, g_main_context_ref (self->check_thread_context)); x2goclient_network_ssh_start_check_timeout_invoke (self, gerr); -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/libx2goclient.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository libx2goclient. commit 69202fa73ab06742c75aaa424bcfb3eb8e6888e3 Author: Mihai Moldovan <ionic@ionic.de> Date: Thu Sep 17 11:17:16 2020 +0200 src/x2goclient-network-ssh.c: check thread pointer before joining check thread. --- src/x2goclient-network-ssh.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/x2goclient-network-ssh.c b/src/x2goclient-network-ssh.c index 6b8b149..1ddc299 100644 --- a/src/x2goclient-network-ssh.c +++ b/src/x2goclient-network-ssh.c @@ -261,8 +261,10 @@ static void x2goclient_network_ssh_finalize (GObject * const object) { g_mutex_unlock (&(self->check_thread_mutex)); /* Let last event run out and thread terminate. */ - (void) g_thread_join (self->check_thread); - self->check_thread = NULL; + if (self->check_thread) { + (void) g_thread_join (self->check_thread); + self->check_thread = NULL; + } /* * Context should be gone by now, implicitly through the thread's main -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/libx2goclient.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository libx2goclient. commit 849144365bdb3d36ee246757e0bfe0c8572c5200 Author: Mihai Moldovan <ionic@ionic.de> Date: Fri Sep 18 01:45:40 2020 +0200 src/x2goclient-network-ssh.c: add debugging output for check thread main function. --- src/x2goclient-network-ssh.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/x2goclient-network-ssh.c b/src/x2goclient-network-ssh.c index 607c41e..d130cac 100644 --- a/src/x2goclient-network-ssh.c +++ b/src/x2goclient-network-ssh.c @@ -1469,9 +1469,12 @@ static gpointer x2goclient_network_ssh_check_timeout_thread_main (const gpointer g_main_context_push_thread_default (self->check_thread_context); g_mutex_unlock (&(self->check_thread_mutex)); + g_log (NULL, G_LOG_LEVEL_DEBUG, "Starting main loop in main function in check timeout thread."); /* Execute main loop. */ g_main_loop_run (self->check_thread_loop); + g_log (NULL, G_LOG_LEVEL_DEBUG, "Main loop of check timeout thread terminated."); + g_mutex_lock (&(self->check_thread_mutex)); /* Clean up everything after g_main_loop_run () returned. */ g_main_loop_unref (self->check_thread_loop); @@ -1485,6 +1488,8 @@ static gpointer x2goclient_network_ssh_check_timeout_thread_main (const gpointer self->check_thread_context = NULL; g_mutex_unlock (&(self->check_thread_mutex)); + g_log (NULL, G_LOG_LEVEL_DEBUG, "Terminating main function of check timeout thread."); + return (ret); } -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/libx2goclient.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository libx2goclient. commit 5157e75a20f454eec8927509b8efd146d063520b Author: Mihai Moldovan <ionic@ionic.de> Date: Fri Sep 18 01:42:46 2020 +0200 src/x2goclient-network-ssh.c: make check thread main loop an instance variable. This allows us to modify/control it from other places too (like the main thread that creates master connection). This is especially interesting if anything destroys the connection object, since we we'll need to terminate the check thread as well in this case. --- src/x2goclient-network-ssh.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/x2goclient-network-ssh.c b/src/x2goclient-network-ssh.c index bfdce29..d0e9a95 100644 --- a/src/x2goclient-network-ssh.c +++ b/src/x2goclient-network-ssh.c @@ -119,6 +119,7 @@ struct _X2GoClientNetworkSSH { GMutex check_thread_mutex; GThread *check_thread; GMainContext *check_thread_context; + GMainLoop *check_thread_loop; }; G_DEFINE_TYPE (X2GoClientNetworkSSH, x2goclient_network_ssh, X2GOCLIENT_TYPE_NETWORK); @@ -207,6 +208,7 @@ static void x2goclient_network_ssh_init (X2GoClientNetworkSSH * const self) { g_mutex_init (&(self->check_thread_mutex)); self->check_thread = NULL; self->check_thread_context = NULL; + self->check_thread_loop = NULL; } X2GoClientNetworkSSH* x2goclient_network_ssh_new (const char * const session_path) { @@ -253,6 +255,10 @@ static void x2goclient_network_ssh_finalize (GObject * const object) { /* Remove timeout source. */ g_mutex_lock (&(self->check_thread_mutex)); + if (self->check_thread_loop) { + g_main_context_invoke_full (self->check_thread_context, G_PRIORITY_DEFAULT_IDLE, G_SOURCE_FUNC (&g_main_loop_quit), self->check_thread_loop, NULL); + } + if (self->check_timeout_source) { g_source_destroy (self->check_timeout_source); g_source_unref (self->check_timeout_source); @@ -1454,7 +1460,6 @@ static void x2goclient_network_ssh_check_timeout_data_free (struct x2goclient_ne static gpointer x2goclient_network_ssh_check_timeout_thread_main (const gpointer user_data) { gpointer ret = NULL; - GMainLoop *main_loop = NULL; X2GoClientNetworkSSH *self = user_data; g_return_val_if_fail (X2GOCLIENT_IS_NETWORK_SSH (self), ret); @@ -1464,13 +1469,13 @@ static gpointer x2goclient_network_ssh_check_timeout_thread_main (const gpointer g_main_context_push_thread_default (self->check_thread_context); g_mutex_unlock (&(self->check_thread_mutex)); - /* Add new main loop and execute it. */ - main_loop = g_main_loop_new (main_context, FALSE); - g_main_loop_run (main_loop); + /* Execute main loop. */ + g_main_loop_run (self->check_thread_loop); g_mutex_lock (&(self->check_thread_mutex)); /* Clean up everything after g_main_loop_run () returned. */ - g_main_loop_unref (main_loop); + g_main_loop_unref (self->check_thread_loop); + self->check_thread_loop = NULL; /* Unmap context. */ g_main_context_pop_thread_default (self->check_thread_context); @@ -1492,6 +1497,9 @@ static gboolean x2goclient_network_ssh_start_check_timeout (X2GoClientNetworkSSH g_mutex_lock (&(self->check_thread_mutex)); self->check_thread_context = g_main_context_new (); + /* Create new main loop. */ + self->check_thread_loop = g_main_loop_new (self->check_thread_context, FALSE); + /* Create and start thread. */ self->check_thread = g_thread_new ("check_thread", &x2goclient_network_ssh_check_timeout_thread_main, self); g_mutex_unlock (&(self->check_thread_mutex)); @@ -1614,6 +1622,9 @@ static gboolean x2goclient_network_ssh_check_timeout (const gpointer data) { /* Also, mark the master connection as terminated/gone. */ self->active_master_conn = FALSE; + + /* Finally, stop the main loop. */ + g_main_loop_quit (self->check_thread_loop); g_mutex_unlock (&(self->check_thread_mutex)); } -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/libx2goclient.git