[X2Go-Commits] [libx2goclient] 08/11: src/x2goclient-network-ssh.{c, h}: initial ssh command call construction.

git-admin at x2go.org git-admin at x2go.org
Sat Aug 31 23:29:02 CEST 2019


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

x2go pushed a commit to branch master
in repository libx2goclient.

commit f919a4b85f4de20ead19cb2dd41087fd74f9666b
Author: Mihai Moldovan <ionic at ionic.de>
Date:   Sat Aug 31 21:50:59 2019 +0200

    src/x2goclient-network-ssh.{c,h}: initial ssh command call construction.
    
    Currently creates something like [ssh] [host] [[-p] [port]].
---
 src/x2goclient-network-ssh.c | 99 +++++++++++++++++++++++++++++++++++++++++---
 src/x2goclient-network-ssh.h |  6 ++-
 2 files changed, 99 insertions(+), 6 deletions(-)

diff --git a/src/x2goclient-network-ssh.c b/src/x2goclient-network-ssh.c
index fa9612c..94374c3 100644
--- a/src/x2goclient-network-ssh.c
+++ b/src/x2goclient-network-ssh.c
@@ -592,18 +592,107 @@ static gboolean x2goclient_network_ssh_parent_connect (X2GoClientNetwork *parent
   g_free (dirname);
   dirname = NULL;
 
-  GArray *ssh_cmd = g_array_new (TRUE, TRUE, sizeof (gchar*));
-  g_array_set_clear_func (ssh_cmd, &x2goclient_clear_strings);
-  (void) g_array_append_vals (ssh_cmd, "ssh", 1);
+  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) {
-    ret = FALSE;
+    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 (struct sockaddr_ho) == g_socket_address_get_native_size (sock_addr));
+
+      struct sockaddr_ho tmp_sockaddr = { 0 };
+
+      /* Fetch data. */
+      GError *tmp_err = NULL;
+      g_socket_address_to_native (sock_addr, &tmp_sockaddr, sizeof (struct 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;
+  }
+
+  if (ret) {
+    g_printf ("Would try to connect via:");
+    for (gsize i = 0; i < ssh_cmd->len; ++i) {
+      g_printf (" [%s]", (gchar *)g_ptr_array_index (ssh_cmd, i));
+    }
+    g_printf ("\n");
   }
 
   g_free (session_path);
   session_path = NULL;
 
-  g_array_unref (ssh_cmd);
+  g_ptr_array_unref (ssh_cmd);
   ssh_cmd = NULL;
 
   return (ret);
diff --git a/src/x2goclient-network-ssh.h b/src/x2goclient-network-ssh.h
index 6c88c0e..dcb83f8 100644
--- a/src/x2goclient-network-ssh.h
+++ b/src/x2goclient-network-ssh.h
@@ -51,7 +51,11 @@ enum {
   X2GOCLIENT_NETWORK_SSH_ERROR_IPV6_CONV,
   X2GOCLIENT_NETWORK_SSH_ERROR_IPV4_CONV,
   X2GOCLIENT_NETWORK_SSH_ERROR_ALIAS_CONV,
-  X2GOCLIENT_NETWORK_SSH_ERROR_CONNECT_DIR_CREATE
+  X2GOCLIENT_NETWORK_SSH_ERROR_CONNECT_DIR_CREATE,
+  X2GOCLIENT_NETWORK_SSH_ERROR_CONNECT_SOCK_ADDR_NULL,
+  X2GOCLIENT_NETWORK_SSH_ERROR_CONNECT_INET_ADDR_NULL,
+  X2GOCLIENT_NETWORK_SSH_ERROR_CONNECT_NATIVE_FETCH,
+  X2GOCLIENT_NETWORK_SSH_ERROR_CONNECT_SOCK_ADDR_UNKNOWN,
 };
 
 

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


More information about the x2go-commits mailing list