From 0ce708e10d1e9e6829da4c20ec282a911cd20c28 Mon Sep 17 00:00:00 2001 From: Simon McVittie <smcv@collabora.com> Date: Mon, 5 Oct 2020 19:19:44 +0100 Subject: [PATCH] adverb: Factor out run_helper_sync We can use this to run other helpers, such as ldconfig. Signed-off-by: Simon McVittie <smcv@collabora.com> --- pressure-vessel/adverb.c | 82 ++++++++++++++++++++++++++-------------- 1 file changed, 54 insertions(+), 28 deletions(-) diff --git a/pressure-vessel/adverb.c b/pressure-vessel/adverb.c index 4551ce1e4..21f5b5896 100644 --- a/pressure-vessel/adverb.c +++ b/pressure-vessel/adverb.c @@ -352,6 +352,52 @@ opt_lock_file_cb (const char *name, return TRUE; } +static gboolean +run_helper_sync (const char *cwd, + const char * const *argv, + const char * const *envp, + gchar **child_stdout, + gchar **child_stderr, + int *wait_status, + GError **error) +{ + sigset_t mask; + sigset_t old_mask; + gboolean ret; + + g_return_val_if_fail (argv != NULL, FALSE); + g_return_val_if_fail (argv[0] != NULL, FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + if (envp == NULL) + envp = global_original_environ; + + sigemptyset (&mask); + sigemptyset (&old_mask); + sigaddset (&mask, SIGCHLD); + + /* Unblock SIGCHLD in case g_spawn_sync() needs it in some version */ + if (pthread_sigmask (SIG_UNBLOCK, &mask, &old_mask) != 0) + return glnx_throw_errno_prefix (error, "pthread_sigmask"); + + /* We use LEAVE_DESCRIPTORS_OPEN to work around a deadlock in older GLib, + * see flatpak_close_fds_workaround */ + ret = g_spawn_sync (cwd, + (gchar **) argv, + (gchar **) envp, + G_SPAWN_LEAVE_DESCRIPTORS_OPEN, + child_setup_cb, NULL, + child_stdout, + child_stderr, + wait_status, + error); + + if (pthread_sigmask (SIG_SETMASK, &old_mask, NULL) != 0 && ret) + return glnx_throw_errno_prefix (error, "pthread_sigmask"); + + return ret; +} + static gboolean generate_locales (gchar **locpath_out, GError **error) @@ -364,17 +410,10 @@ generate_locales (gchar **locpath_out, g_autofree gchar *pvlg = NULL; g_autofree gchar *this_path = NULL; g_autofree gchar *this_dir = NULL; - gboolean ret; - sigset_t mask; - sigset_t old_mask; g_return_val_if_fail (locpath_out == NULL || *locpath_out == NULL, FALSE); g_return_val_if_fail (error == NULL || *error == NULL, FALSE); - sigemptyset (&mask); - sigemptyset (&old_mask); - sigaddset (&mask, SIGCHLD); - temp_dir = g_dir_make_tmp ("pressure-vessel-locales-XXXXXX", error); if (temp_dir == NULL) @@ -389,7 +428,7 @@ generate_locales (gchar **locpath_out, this_dir = g_path_get_dirname (this_path); pvlg = g_build_filename (this_dir, "pressure-vessel-locale-gen", NULL); - const char *locale_gen_argv[] = + const char * const locale_gen_argv[] = { pvlg, "--output-dir", temp_dir, @@ -397,26 +436,13 @@ generate_locales (gchar **locpath_out, NULL }; - /* Unblock SIGCHLD in case g_spawn_sync() needs it in some version */ - if (pthread_sigmask (SIG_UNBLOCK, &mask, &old_mask) != 0) - return glnx_throw_errno_prefix (error, "pthread_sigmask"); - - /* We use LEAVE_DESCRIPTORS_OPEN to work around a deadlock in older GLib, - * see flatpak_close_fds_workaround */ - ret = g_spawn_sync (NULL, /* cwd */ - (gchar **) locale_gen_argv, - (gchar **) global_original_environ, - G_SPAWN_LEAVE_DESCRIPTORS_OPEN, - child_setup_cb, NULL, - &child_stdout, - &child_stderr, - &wait_status, - error); - - if (pthread_sigmask (SIG_SETMASK, &old_mask, NULL) != 0 && ret) - return glnx_throw_errno_prefix (error, "pthread_sigmask"); - - if (!ret) + if (!run_helper_sync (NULL, + locale_gen_argv, + NULL, + &child_stdout, + &child_stderr, + &wait_status, + error)) { if (error != NULL) glnx_prefix_error (error, "Cannot run pressure-vessel-locale-gen"); -- GitLab