Skip to content
Snippets Groups Projects
Commit 0ce708e1 authored by Simon McVittie's avatar Simon McVittie
Browse files

adverb: Factor out run_helper_sync


We can use this to run other helpers, such as ldconfig.

Signed-off-by: default avatarSimon McVittie <smcv@collabora.com>
parent 2067b1a0
Branches
Tags
1 merge request!149Progress towards regenerating ld.so.cache (T14481)
Pipeline #4709 passed
...@@ -352,6 +352,52 @@ opt_lock_file_cb (const char *name, ...@@ -352,6 +352,52 @@ opt_lock_file_cb (const char *name,
return TRUE; 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 static gboolean
generate_locales (gchar **locpath_out, generate_locales (gchar **locpath_out,
GError **error) GError **error)
...@@ -364,17 +410,10 @@ generate_locales (gchar **locpath_out, ...@@ -364,17 +410,10 @@ generate_locales (gchar **locpath_out,
g_autofree gchar *pvlg = NULL; g_autofree gchar *pvlg = NULL;
g_autofree gchar *this_path = NULL; g_autofree gchar *this_path = NULL;
g_autofree gchar *this_dir = 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 (locpath_out == NULL || *locpath_out == NULL, FALSE);
g_return_val_if_fail (error == NULL || *error == 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); temp_dir = g_dir_make_tmp ("pressure-vessel-locales-XXXXXX", error);
if (temp_dir == NULL) if (temp_dir == NULL)
...@@ -389,7 +428,7 @@ generate_locales (gchar **locpath_out, ...@@ -389,7 +428,7 @@ generate_locales (gchar **locpath_out,
this_dir = g_path_get_dirname (this_path); this_dir = g_path_get_dirname (this_path);
pvlg = g_build_filename (this_dir, "pressure-vessel-locale-gen", NULL); pvlg = g_build_filename (this_dir, "pressure-vessel-locale-gen", NULL);
const char *locale_gen_argv[] = const char * const locale_gen_argv[] =
{ {
pvlg, pvlg,
"--output-dir", temp_dir, "--output-dir", temp_dir,
...@@ -397,26 +436,13 @@ generate_locales (gchar **locpath_out, ...@@ -397,26 +436,13 @@ generate_locales (gchar **locpath_out,
NULL NULL
}; };
/* Unblock SIGCHLD in case g_spawn_sync() needs it in some version */ if (!run_helper_sync (NULL,
if (pthread_sigmask (SIG_UNBLOCK, &mask, &old_mask) != 0) locale_gen_argv,
return glnx_throw_errno_prefix (error, "pthread_sigmask"); NULL,
&child_stdout,
/* We use LEAVE_DESCRIPTORS_OPEN to work around a deadlock in older GLib, &child_stderr,
* see flatpak_close_fds_workaround */ &wait_status,
ret = g_spawn_sync (NULL, /* cwd */ error))
(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 (error != NULL) if (error != NULL)
glnx_prefix_error (error, "Cannot run pressure-vessel-locale-gen"); glnx_prefix_error (error, "Cannot run pressure-vessel-locale-gen");
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment