[X2Go-Commits] [x2goserver] 02/02: Detect the exit of rootless applications that forked to background on application execution. (Fixes: #122).

git-admin at x2go.org git-admin at x2go.org
Mon Jun 30 12:51:39 CEST 2014


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

x2go pushed a commit to branch release/4.0.1.x
in repository x2goserver.

commit c3afe1c154dfeb0ba052f7506f0cadc5f6c62871
Author: Mike Gabriel <mike.gabriel at das-netzwerkteam.de>
Date:   Mon Jun 30 12:50:15 2014 +0200

    Detect the exit of rootless applications that forked to background on application execution. (Fixes: #122).
---
 debian/changelog              |    2 ++
 x2goserver/bin/x2goruncommand |   43 +++++++++++++++++++++++++----------------
 2 files changed, 28 insertions(+), 17 deletions(-)

diff --git a/debian/changelog b/debian/changelog
index fd13717..cf009c5 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -49,6 +49,8 @@ x2goserver (4.0.1.16-0x2go1) UNRELEASED; urgency=low
     - Provide support for client-side choice of clipboard security. (Fixes:
       #524).
     - Use more quotes in x2goruncommand.
+    - Detect the exit of rootless applications that forked to background on
+      application execution. (Fixes: #122).
   * debian/control, x2goserver.spec:
     + Update versioned D: x2goagent (>= 3.5.0.25). This assures that X2Go
       works with poly-instantiated /tmp directories.
diff --git a/x2goserver/bin/x2goruncommand b/x2goserver/bin/x2goruncommand
index 3e8dfab..e7dcd42 100755
--- a/x2goserver/bin/x2goruncommand
+++ b/x2goserver/bin/x2goruncommand
@@ -173,10 +173,12 @@ elif [ "$cmd" == "TRINITY" ]; then
 fi
 
 if [ "$cmd" == "WWWBROWSER" ]; then
-	if [ -e "/usr/bin/firefox" ]; then
-		cmd="/usr/bin/firefox"
+	if [ -e "/usr/bin/firefox.real" ]; then
+		cmd="/usr/bin/firefox.real"
 	elif  [ -e "/usr/bin/iceweasel" ]; then
 		cmd="/usr/bin/iceweasel"
+	elif  [ -e "/usr/bin/firefox" ]; then
+		cmd="/usr/bin/firefox"
 	elif  [ -e "/usr/bin/abrowser" ]; then
 		cmd="/usr/bin/abrowser"
 	elif  [ -e "/usr/bin/konqueror" ]; then
@@ -209,17 +211,12 @@ if [ "$cmd" == "OFFICE" ]; then
 fi
 
 if [ "$cmd" == "TERMINAL" ]; then
-	IMEXIT="true"
 	if [ -e "/usr/bin/konsole" ]; then
 		cmd="/usr/bin/konsole"
-		# KDE4 konsole behaves differently from other terminals
-		IMEXIT="false"
 	elif  [ -e "/usr/bin/mate-terminal" ]; then
 		cmd="/usr/bin/mate-terminal"
 	elif  [ -e "/usr/bin/gnome-terminal" ]; then
 		cmd="/usr/bin/gnome-terminal"
-		# GNOME terminal starting with 3.8 also immediately exits
-		IMEXIT="false"
 	elif  [ -e "/usr/bin/lxterminal" ]; then
 		cmd="/usr/bin/lxterminal"
 	elif  [ -e "/usr/bin/rxvt" ]; then
@@ -236,7 +233,6 @@ EXEC_WRAPPER=""
 BNAME=`basename "$EXEC"`
 if [ "$BNAME" == "rdesktop" ]
 then
-	IMEXIT="true"
 	if type padsp >/dev/null; then
 		EXEC_WRAPPER="padsp"
 		args=" -r sound:local"
@@ -248,7 +244,7 @@ fi
 
 if [ "$X2GO_SESS_TYPE" == "P" ]
 then
-	IMEXIT="false"
+	IMEXIT="true"
 	EXEC="/bin/true"
 	X2GO_SESS_TYPE="R"
 fi
@@ -268,16 +264,29 @@ if [ "$EXEC" != "" ] && [ -x "$EXEC" ]; then
 		XSESSION_EXEC="$cmd" STARTUP="/usr/bin/env LD_LIBRARY_PATH=${LD_LIBRARY_PATH} ${STARTUP}" /etc/x2go/Xsession
 	} || {
 		"$X2GO_LIB_PATH/x2gosyslog" "$0" "debug" "executing command \"$cmd$args\"..."
-		$EXEC_WRAPPER $cmd$args
+
+		# This is gonna be a nasty trick now...
+		# Most applications run in foreground (fine!), but some fork to background (urgghh... e.g. konsole, iceweasel, etc.).
+		# By capturing their STDOUT, we force the process to remain in (sort of) foreground until the process has finished.
+		# This works fabulously with all applications that don't cleanly close their file descriptors (which is probably
+		# 99% of all applications out there...).
+
+		STDOUT=`$EXEC_WRAPPER $cmd$args`
+
+		if [  "$X2GO_SESS_TYPE" == "R" ] && [ "$IMEXIT" == "true" ]; then
+
+			# applications that managed to quit immediately, we catch here by waiting as long as x2goagent exists
+
+			"$X2GO_LIB_PATH/x2gosyslog" "$0" "debug" "waiting for x2goagent (PID: $X2GO_AGENT_PID) to finish"
+			while [ -d "/proc/$X2GO_AGENT_PID" ]; do
+				sleep 1
+			done
+			"$X2GO_LIB_PATH/x2gosyslog" "$0" "debug" "x2goagent (PID: $X2GO_AGENT_PID) has finished"
+		else
+			"$X2GO_LIB_PATH/x2gosyslog" "$0" "debug" "command $EXEC has finished"
+		fi
 	}
 
-	#### some applications can quit immediately, we will wait here as long as x2goagent exists
-	if [  "$X2GO_SESS_TYPE" == "R" ] && [ "$IMEXIT" == "false" ]; then
-		"$X2GO_LIB_PATH/x2gosyslog" "$0" "debug" "command $EXEC forked to background, waiting for agent to finish"
-		while [ -d "/proc/$X2GO_AGENT_PID" ]; do
-			sleep 1
-		done
-	fi
 	# if we reach here the possibility of a successful command execution is rather high
 	successful_run=true
 

--
Alioth's /srv/git/_hooks_/post-receive-email on /srv/git/code.x2go.org/x2goserver.git


More information about the x2go-commits mailing list