From d3399fd7856000f81030563d9c5eb01539399625 Mon Sep 17 00:00:00 2001 From: Christian Hergert Date: Thu, 18 Apr 2019 21:52:49 -0700 Subject: [PATCH] utils: force exit host commands when flatpak-builder exits If we are spawning applications on the host using the Development service, then we want those commands to exit when the flatpak-builder process exits, as can happen from Ctrl^C or kill(). By using a static FlatpakHostCommandFlags we only ever check this a single time and then each subsequent request will do the right thing. --- src/builder-flatpak-utils.h | 1 + src/builder-utils.c | 24 ++++++++++++++++++++++-- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/builder-flatpak-utils.h b/src/builder-flatpak-utils.h index 4d878d98..86631002 100644 --- a/src/builder-flatpak-utils.h +++ b/src/builder-flatpak-utils.h @@ -33,6 +33,7 @@ typedef enum { FLATPAK_HOST_COMMAND_FLAGS_CLEAR_ENV = 1 << 0, + FLATPAK_HOST_COMMAND_FLAGS_WATCH_BUS = 1 << 1, } FlatpakHostCommandFlags; typedef void (*FlatpakLoadUriProgress) (guint64 downloaded_bytes, diff --git a/src/builder-utils.c b/src/builder-utils.c index 37de88c9..bc35cc92 100644 --- a/src/builder-utils.c +++ b/src/builder-utils.c @@ -1619,6 +1619,7 @@ builder_host_spawnv (GFile *dir, GError **error, const gchar * const *argv) { + static FlatpakHostCommandFlags cmd_flags = FLATPAK_HOST_COMMAND_FLAGS_CLEAR_ENV | FLATPAK_HOST_COMMAND_FLAGS_WATCH_BUS; guint32 client_pid; GVariantBuilder *fd_builder = g_variant_builder_new (G_VARIANT_TYPE("a{uh}")); GVariantBuilder *env_builder = g_variant_builder_new (G_VARIANT_TYPE("a{ss}")); @@ -1634,11 +1635,15 @@ builder_host_spawnv (GFile *dir, g_autofree gchar *commandline = NULL; g_autoptr(GOutputStream) out = NULL; g_autoptr(GFile) cwd = NULL; + g_autoptr(GError) local_error = NULL; glnx_fd_close int blocking_stdin_fd = -1; int pipefd[2]; int stdin_fd; int i; + if (error == NULL) + error = &local_error; + if (dir == NULL) { g_autofree char *current_dir = g_get_current_dir (); @@ -1740,6 +1745,7 @@ builder_host_spawnv (GFile *dir, sigterm_id = g_unix_signal_add (SIGTERM, sigterm_handler, &data); sigint_id = g_unix_signal_add (SIGINT, sigint_handler, &data); +try_again: ret = g_dbus_connection_call_with_unix_fd_list_sync (connection, "org.freedesktop.Flatpak", "/org/freedesktop/Flatpak/Development", @@ -1750,14 +1756,28 @@ builder_host_spawnv (GFile *dir, argv, g_variant_builder_end (fd_builder), g_variant_builder_end (env_builder), - FLATPAK_HOST_COMMAND_FLAGS_CLEAR_ENV), + cmd_flags), G_VARIANT_TYPE ("(u)"), G_DBUS_CALL_FLAGS_NONE, -1, fd_list, NULL, NULL, error); if (ret == NULL) - return FALSE; + { + /* If we are talking to a session-helper that is pre-1.2 we wont have + * access to FLATPAK_HOST_COMMAND_FLAGS_WATCH_BUS and will get an + * invalid-args reply. Try again without the flag. + */ + if ((cmd_flags & FLATPAK_HOST_COMMAND_FLAGS_WATCH_BUS) != 0 && + g_error_matches (*error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS)) + { + cmd_flags &= ~FLATPAK_HOST_COMMAND_FLAGS_WATCH_BUS; + g_clear_error (error); + goto try_again; + } + + return FALSE; + } g_variant_get (ret, "(u)", &client_pid);