[X2Go-Commits] [libx2goclient] 02/04: src/x2goclient-network-ssh.c: actually spawn an SSH process.

git-admin at x2go.org git-admin at x2go.org
Mon Jan 13 23:58:50 CET 2020


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

x2go pushed a commit to branch master
in repository libx2goclient.

commit d674d5b6c43f5ef24fa04c6666c9b35e06fc56e5
Author: Mihai Moldovan <ionic at ionic.de>
Date:   Mon Nov 11 17:38:26 2019 +0100

    src/x2goclient-network-ssh.c: actually spawn an SSH process.
    
    Weirdly, g_spawn_sync () seems to not notice processes detaching (like
    ssh -f) and will just hang forever. That's weird, because the process
    itself is exiting correctly (after spawning a new child, naturally).
    
    We'll probably want to use something like GSubProcess later on anyway,
    so that's probably not a huge issue, but I wasn't able to find out why
    it's behaving like that for now.
---
 src/x2goclient-network-ssh.c | 58 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 58 insertions(+)

diff --git a/src/x2goclient-network-ssh.c b/src/x2goclient-network-ssh.c
index 41abff7..3b26cfd 100644
--- a/src/x2goclient-network-ssh.c
+++ b/src/x2goclient-network-ssh.c
@@ -680,12 +680,70 @@ static gboolean x2goclient_network_ssh_parent_connect (X2GoClientNetwork *parent
     sock_addr = NULL;
   }
 
+  if (ret) {
+    /* Add control path options. */
+    g_ptr_array_add (ssh_cmd, g_strdup ("-o"));
+    g_ptr_array_add (ssh_cmd, g_strdup ("ControlMaster=\"yes\""));
+    g_ptr_array_add (ssh_cmd, g_strdup ("-o"));
+    g_ptr_array_add (ssh_cmd, g_strdup ("ControlPersist=\"yes\""));
+    g_ptr_array_add (ssh_cmd, g_strdup ("-o"));
+    g_ptr_array_add (ssh_cmd, g_strdup_printf ("ControlPath=\"%s\"", self->control_path));
+
+    /* Force ssh process to background. */
+    g_ptr_array_add (ssh_cmd, g_strdup ("-f"));
+
+    /* Do not execute commands, we just want to have a master connection. */
+    g_ptr_array_add (ssh_cmd, g_strdup ("-N"));
+
+    /* We do not need a pseudo terminal. */
+    g_ptr_array_add (ssh_cmd, g_strdup ("-T"));
+
+    /* Let process terminate if it wasn't able to connect or set up sockets. */
+    g_ptr_array_add (ssh_cmd, g_strdup ("-o"));
+    g_ptr_array_add (ssh_cmd, g_strdup ("ExitOnForwardFailure=\"yes\""));
+
+    /* Try to call uptime. */
+    g_ptr_array_add (ssh_cmd, g_strdup ("uptime"));
+
+    /*
+     * Quite importantly, zero-terminate the array, as it will be used as
+     * argv!
+     */
+    g_ptr_array_add (ssh_cmd, 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_printf ("Launching!\n");
+    gint ssh_exit = -1;
+    gchar *ssh_stdout = NULL, *ssh_stderr = NULL;
+    GError *ssh_err = NULL;
+    ret = g_spawn_sync (NULL, (gchar**)(ssh_cmd->pdata), NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, &ssh_stdout, &ssh_stderr, &ssh_exit, &ssh_err);
+
+    if (ret) {
+      g_printf ("Process executed successfully!\nReturn value: %d\nStdout:\n>>>%s<<<\nStderr:\n>>>%s<<<\n", ssh_exit, ssh_stdout, ssh_stderr);
+
+      if (ssh_err) {
+        g_printf ("Successful execution, but ssh_err set? Weird, here's the message: %s", ssh_err->message);
+      }
+    }
+    else {
+      g_printf ("Process didn't execute successfully!\nError:\n>>>%s<<<\n", ssh_err->message);
+    }
+
+    g_free (ssh_stdout);
+    ssh_stdout = NULL;
+
+    g_free (ssh_stderr);
+    ssh_stderr = NULL;
+
+    g_free (ssh_err);
+    ssh_err = NULL;
   }
 
   g_free (session_path);

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