From: Anonymous <wishes@to.remain> Relevant excerpt from Xserver(1) man page: /SIGUSR1/ This signal is used quite differently from either of the above. When the server starts, it checks to see if it has inherited SIGUSR1 as SIG_IGN instead of the usual SIG_DFL. In this case, the server sends a SIGUSR1 to its parent process after it has set up the various connection schemes. /Xdm/ uses this feature to recognize when connecting to the server is possible. With this patch KDM works correctly when launching Xspice instead of Xorg. Problem reported and patch provided by anonymous. --- scripts/Xspice | 45 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 40 insertions(+), 5 deletions(-) diff --git a/scripts/Xspice b/scripts/Xspice index b8a7b78..d2b2b81 100755 --- a/scripts/Xspice +++ b/scripts/Xspice @@ -22,7 +22,7 @@ import sys import tempfile import atexit import time -import signal +from signal import getsignal, signal, SIGTERM, SIGUSR1, SIGHUP from subprocess import Popen, PIPE def which(x): @@ -178,7 +178,12 @@ def launch(*args, **kw): cleanup_processes.append(p) return p -signal.signal(signal.SIGTERM, cleanup) +# Save signal values to reset them when starting X +saved_sigterm = getsignal(SIGTERM) +saved_sighup = getsignal(SIGHUP) +saved_sigusr1 = getsignal(SIGUSR1) + +signal(SIGTERM, cleanup) atexit.register(cleanup) if args.auto: @@ -279,7 +284,35 @@ if args.vdagent_enabled: if os.path.exists(f): os.unlink(f) cleanup_files.extend([args.vdagent_virtio_path, args.vdagent_uinput_path]) -xorg = launch(executable=args.xorg, args=exec_args + xorg_args) + +# X gives special meaning to SIGUSR1 and SIGHUP (SIGTERM is already handled) +xorg = None + +# SIGUSR1 needs to propagate to parent +def sigusr1(*args): + os.kill(os.getppid(), SIGUSR1) + +# SIGHUP needs to propagate to X +def sighup(*args): + if xorg is None: + return + # xorg.pid might not be valid anymore when a signal arrives after + # xorg.wait() returns, but the script did not yet exit + try: + os.kill(xorg.pid, SIGHUP) + except Exception: + pass + +def reset_handlers(): + signal(SIGTERM, saved_sigterm) + signal(SIGHUP, saved_sighup) + signal(SIGUSR1, saved_sigusr1) + +signal(SIGUSR1, sigusr1) +signal(SIGHUP, sighup) + +# use preexec_fn to reset the signal handlers for the X process back to the original values +xorg = launch(executable=args.xorg, args=exec_args + xorg_args, preexec_fn=reset_handlers) time.sleep(2) retpid,rc = os.waitpid(xorg.pid, os.WNOHANG) @@ -289,11 +322,13 @@ else: if args.vdagent_enabled and args.vdagent_launch: # XXX use systemd --user for this? vdagentd = launch(args=[args.vdagentd_exec, '-x', '-S', vdagentd_uds, - '-s', args.vdagent_virtio_path, '-u', args.vdagent_uinput_path]) + '-s', args.vdagent_virtio_path, '-u', args.vdagent_uinput_path], + preexec_fn=reset_handlers) time.sleep(1) # TODO wait for uinput pipe open for write vdagent = launch(args=[args.vdagent_exec, '-x', '-s', args.vdagent_virtio_path, '-S', - vdagentd_uds]) + vdagentd_uds], + preexec_fn=reset_handlers) if args.xsession: environ = os.environ os.spawnlpe(os.P_NOWAIT, args.xsession, environ) -- 1.8.4.2 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel