[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