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

x2go pushed a commit to branch bugfix/osx
in repository x2goclient.

commit acb2081e5fa1e4fa97f73ab933a143518f08931a
Author: Mihai Moldovan <io...@ionic.de>
Date:   Mon Mar 16 20:30:49 2015 +0100

    x2goclient.cpp: use setsid() on UNIX to become session and process group 
leader.
    
    If that fails, fork, terminate the parent and execute setsid() in the
    child process. Use fork_helper() to start the UNIX cleanup helper in a
    child process and continue with the main application in the parent.
---
 debian/changelog   |    4 ++++
 src/x2goclient.cpp |   43 ++++++++++++++++++++++++++++++++++++++++---
 2 files changed, 44 insertions(+), 3 deletions(-)

diff --git a/debian/changelog b/debian/changelog
index 4c29c4c..d3a758c 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -14,6 +14,10 @@ x2goclient (4.0.5.3-0x2go1) UNRELEASED; urgency=medium
     - x2goclient.cpp: wrap X2Go Client main function and use that.
     - x2goclient.cpp: add fork_helper() function to start up the UNIX cleanup
       helper.
+    - x2goclient.cpp: use setsid() on UNIX to become session and process group
+      leader. If that fails, fork, terminate the parent and execute setsid()
+      in the child process. Use fork_helper() to start the UNIX cleanup helper
+      in a child process and continue with the main application in the parent.
 
  -- X2Go Release Manager <git-ad...@x2go.org>  Mon, 19 Sep 2016 09:07:07 +0200
 
diff --git a/src/x2goclient.cpp b/src/x2goclient.cpp
index df15858..f56bed2 100644
--- a/src/x2goclient.cpp
+++ b/src/x2goclient.cpp
@@ -54,7 +54,44 @@ int fork_helper (int argc, char **argv) {
 }
 #endif /* defined (Q_OS_UNIX) */
 
-int main(int argc, char *argv[])
-{
-       return (wrap_x2go_main (argc, argv));
+int main (int argc, char **argv) {
+#ifdef Q_OS_UNIX
+  if (-1 == setsid ()) {
+    std::cerr << "Unable to create a new process session: " << std::strerror 
(errno) << "\n";
+
+    std::cerr << "Trying to fork." << std::endl;
+    pid_t tmp_pid = fork ();
+
+    /* Child. */
+    if (0 == tmp_pid) {
+        /* Trying to get a new session and become session + process group 
leader again. */
+        if (-1 == setsid ()) {
+          std::cerr << "Child was unable to create a new process session: " << 
std::strerror (errno) << "\n";
+          std::cerr << "Terminating. Please report a bug, refer to this 
documentation: http://wiki.x2go.org/doku.php/wiki:bugs"; << std::endl;
+
+          std::exit (EXIT_FAILURE);
+        }
+
+        /* By now, we should be session and group leader. */
+        return (fork_helper (argc, argv));
+    }
+    /* Error. */
+    else if (-1 == tmp_pid) {
+      std::cerr << "Error while forking: " << std::strerror (errno) << 
std::endl;
+      std::cerr << "Terminating. Please report a bug, refer to this 
documentation: http://wiki.x2go.org/doku.php/wiki:bugs"; << std::endl;
+
+      std::edit (EXIT_FAILURE);
+    }
+    /* Parent. Just die here. */
+    else {
+      std::exit (EXIT_SUCCESS);
+    }
+  }
+  else {
+    /* setsid() worked. Starting helper and main program. */
+    return (fork_helper (argc, argv));
+  }
+#else /* defined (Q_OS_UNIX) */
+  return (wrap_x2go_main (argc, argv));
+#endif /* defined (Q_OS_UNIX) */
 }

--
Alioth's /srv/git/code.x2go.org/x2goclient.git//..//_hooks_/post-receive-email 
on /srv/git/code.x2go.org/x2goclient.git
_______________________________________________
x2go-commits mailing list
x2go-commits@lists.x2go.org
http://lists.x2go.org/listinfo/x2go-commits

Reply via email to