forked from Mirrors/flatpak-builder
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.auto
parent
d901d8202f
commit
d3399fd785
|
@ -33,6 +33,7 @@
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
FLATPAK_HOST_COMMAND_FLAGS_CLEAR_ENV = 1 << 0,
|
FLATPAK_HOST_COMMAND_FLAGS_CLEAR_ENV = 1 << 0,
|
||||||
|
FLATPAK_HOST_COMMAND_FLAGS_WATCH_BUS = 1 << 1,
|
||||||
} FlatpakHostCommandFlags;
|
} FlatpakHostCommandFlags;
|
||||||
|
|
||||||
typedef void (*FlatpakLoadUriProgress) (guint64 downloaded_bytes,
|
typedef void (*FlatpakLoadUriProgress) (guint64 downloaded_bytes,
|
||||||
|
|
|
@ -1619,6 +1619,7 @@ builder_host_spawnv (GFile *dir,
|
||||||
GError **error,
|
GError **error,
|
||||||
const gchar * const *argv)
|
const gchar * const *argv)
|
||||||
{
|
{
|
||||||
|
static FlatpakHostCommandFlags cmd_flags = FLATPAK_HOST_COMMAND_FLAGS_CLEAR_ENV | FLATPAK_HOST_COMMAND_FLAGS_WATCH_BUS;
|
||||||
guint32 client_pid;
|
guint32 client_pid;
|
||||||
GVariantBuilder *fd_builder = g_variant_builder_new (G_VARIANT_TYPE("a{uh}"));
|
GVariantBuilder *fd_builder = g_variant_builder_new (G_VARIANT_TYPE("a{uh}"));
|
||||||
GVariantBuilder *env_builder = g_variant_builder_new (G_VARIANT_TYPE("a{ss}"));
|
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_autofree gchar *commandline = NULL;
|
||||||
g_autoptr(GOutputStream) out = NULL;
|
g_autoptr(GOutputStream) out = NULL;
|
||||||
g_autoptr(GFile) cwd = NULL;
|
g_autoptr(GFile) cwd = NULL;
|
||||||
|
g_autoptr(GError) local_error = NULL;
|
||||||
glnx_fd_close int blocking_stdin_fd = -1;
|
glnx_fd_close int blocking_stdin_fd = -1;
|
||||||
int pipefd[2];
|
int pipefd[2];
|
||||||
int stdin_fd;
|
int stdin_fd;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
if (error == NULL)
|
||||||
|
error = &local_error;
|
||||||
|
|
||||||
if (dir == NULL)
|
if (dir == NULL)
|
||||||
{
|
{
|
||||||
g_autofree char *current_dir = g_get_current_dir ();
|
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);
|
sigterm_id = g_unix_signal_add (SIGTERM, sigterm_handler, &data);
|
||||||
sigint_id = g_unix_signal_add (SIGINT, sigint_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,
|
ret = g_dbus_connection_call_with_unix_fd_list_sync (connection,
|
||||||
"org.freedesktop.Flatpak",
|
"org.freedesktop.Flatpak",
|
||||||
"/org/freedesktop/Flatpak/Development",
|
"/org/freedesktop/Flatpak/Development",
|
||||||
|
@ -1750,14 +1756,28 @@ builder_host_spawnv (GFile *dir,
|
||||||
argv,
|
argv,
|
||||||
g_variant_builder_end (fd_builder),
|
g_variant_builder_end (fd_builder),
|
||||||
g_variant_builder_end (env_builder),
|
g_variant_builder_end (env_builder),
|
||||||
FLATPAK_HOST_COMMAND_FLAGS_CLEAR_ENV),
|
cmd_flags),
|
||||||
G_VARIANT_TYPE ("(u)"),
|
G_VARIANT_TYPE ("(u)"),
|
||||||
G_DBUS_CALL_FLAGS_NONE, -1,
|
G_DBUS_CALL_FLAGS_NONE, -1,
|
||||||
fd_list, NULL,
|
fd_list, NULL,
|
||||||
NULL, error);
|
NULL, error);
|
||||||
|
|
||||||
if (ret == NULL)
|
if (ret == NULL)
|
||||||
|
{
|
||||||
|
/* 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;
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
g_variant_get (ret, "(u)", &client_pid);
|
g_variant_get (ret, "(u)", &client_pid);
|
||||||
|
|
Loading…
Reference in New Issue