From 321cd06591facd5b34fb5eaac9f364849980c371 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Marczykowski-G=C3=B3recki?= Date: Mon, 5 Mar 2018 23:37:42 +0100 Subject: [PATCH] Fix waiting for application exit in qubesagent.xdg.launch This is especially important for qubes-desktop-run used inside DispVM. The DesktopAppInfo.launch() method returns after just launching the application. In DispVM case it worked by a coincidence - because the launched application was keeping stdin/out open, which also prevented DispVM killing. Use DesktopAppInfo.launch_uris_as_manager which at least allows to learn PIDs of spawned processes, to track them manually. This still doesn't fix gnome-terminal issue, or any other application using either DBus activation, or any other client-server model. But at least fix basic apps like firefox and xterm. Fixes QubesOS/qubes-issues#3213 --- qubesagent/xdg.py | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/qubesagent/xdg.py b/qubesagent/xdg.py index 7e884bf..73a9b36 100755 --- a/qubesagent/xdg.py +++ b/qubesagent/xdg.py @@ -1,9 +1,15 @@ #!/usr/bin/python from gi.repository import Gio +from gi.repository import GLib import sys +import os -def launch(desktop, *files): +def pid_callback(launcher, pid, pid_list): + pid_list.append(pid) + +def launch(desktop, *files, **kwargs): + wait = kwargs.pop('wait', True) launcher = Gio.DesktopAppInfo.new_from_filename(desktop) try: import dbus @@ -18,10 +24,17 @@ def launch(desktop, *files): bus.start_service_by_name(service_id) except dbus.DBusException: pass - return launcher.launch(files, None) except ImportError: pass - launcher.launch(files, None) + if wait: + pid_list = [] + flags = GLib.SpawnFlags.SEARCH_PATH | GLib.SpawnFlags.DO_NOT_REAP_CHILD + launcher.launch_uris_as_manager(files, None, flags, None, None, + pid_callback, pid_list) + for pid in pid_list: + os.waitpid(pid, 0) + else: + launcher.launch(files, None) if __name__ == "__main__": launch(*sys.argv[1:])