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

Merge branch 'wip/smcv/move-utilities' into 'master'

utils: Move some utility functions here

See merge request steam/pressure-vessel!29
parents 944ab8a9 1eb08d57
No related branches found
No related tags found
No related merge requests found
......@@ -173,3 +173,80 @@ pv_is_same_file (const gchar *a,
&& a_buffer.st_dev == b_buffer.st_dev
&& a_buffer.st_ino == b_buffer.st_ino);
}
void
pv_search_path_append (GString *search_path,
const gchar *item)
{
if (item == NULL || item[0] == '\0')
return;
if (search_path->len != 0)
g_string_append (search_path, ":");
g_string_append (search_path, item);
}
gchar *
pv_capture_output (const char * const * argv,
GError **error)
{
gsize len;
gint wait_status;
g_autofree gchar *output = NULL;
g_autofree gchar *errors = NULL;
gsize i;
g_autoptr(GString) command = g_string_new ("");
for (i = 0; argv[i] != NULL; i++)
{
g_autofree gchar *quoted = g_shell_quote (argv[i]);
g_string_append_printf (command, " %s", quoted);
}
g_debug ("run:%s", command->str);
if (!g_spawn_sync (NULL, /* cwd */
(char **) argv,
NULL, /* env */
G_SPAWN_SEARCH_PATH,
NULL, NULL, /* child setup */
&output,
&errors,
&wait_status,
error))
return NULL;
g_printerr ("%s", errors);
if (!g_spawn_check_exit_status (wait_status, error))
return NULL;
len = strlen (output);
/* Emulate shell $() */
if (len > 0 && output[len - 1] == '\n')
output[len - 1] = '\0';
g_debug ("-> %s", output);
return g_steal_pointer (&output);
}
/*
* Returns: (transfer none): The first key in @table in iteration order,
* or %NULL if @table is empty.
*/
gpointer
pv_hash_table_get_arbitrary_key (GHashTable *table)
{
GHashTableIter iter;
gpointer key = NULL;
g_hash_table_iter_init (&iter, table);
if (g_hash_table_iter_next (&iter, &key, NULL))
return key;
else
return NULL;
}
......@@ -34,3 +34,11 @@ void pv_get_current_dirs (gchar **cwd_p,
gboolean pv_is_same_file (const gchar *a,
const gchar *b);
void pv_search_path_append (GString *search_path,
const gchar *item);
gchar *pv_capture_output (const char * const * argv,
GError **error);
gpointer pv_hash_table_get_arbitrary_key (GHashTable *table);
......@@ -78,19 +78,6 @@ find_executable_dir (GError **error)
return g_path_get_dirname (target);
}
static void
search_path_append (GString *search_path,
const gchar *item)
{
if (item == NULL || item[0] == '\0')
return;
if (search_path->len != 0)
g_string_append (search_path, ":");
g_string_append (search_path, item);
}
static gchar *
find_bwrap (const char *tools_dir)
{
......@@ -197,53 +184,6 @@ check_bwrap (const char *tools_dir)
return NULL;
}
static gchar *
capture_output (const char * const * argv,
GError **error)
{
gsize len;
gint wait_status;
g_autofree gchar *output = NULL;
g_autofree gchar *errors = NULL;
gsize i;
g_autoptr(GString) command = g_string_new ("");
for (i = 0; argv[i] != NULL; i++)
{
g_autofree gchar *quoted = g_shell_quote (argv[i]);
g_string_append_printf (command, " %s", quoted);
}
g_debug ("run:%s", command->str);
if (!g_spawn_sync (NULL, /* cwd */
(char **) argv,
NULL, /* env */
G_SPAWN_SEARCH_PATH,
NULL, NULL, /* child setup */
&output,
&errors,
&wait_status,
error))
return NULL;
g_printerr ("%s", errors);
if (!g_spawn_check_exit_status (wait_status, error))
return NULL;
len = strlen (output);
/* Emulate shell $() */
if (len > 0 && output[len - 1] == '\n')
output[len - 1] = '\0';
g_debug ("-> %s", output);
return g_steal_pointer (&output);
}
static gboolean
try_bind_dri (FlatpakBwrap *bwrap,
FlatpakBwrap *mount_runtime_on_scratch,
......@@ -441,7 +381,7 @@ ensure_locales (gboolean on_host,
g_debug ("%s is non-empty", locales);
locpath = g_string_new ("/overrides/locales");
search_path_append (locpath, g_getenv ("LOCPATH"));
pv_search_path_append (locpath, g_getenv ("LOCPATH"));
flatpak_bwrap_add_args (bwrap,
"--setenv", "LOCPATH", locpath->str,
NULL);
......@@ -639,22 +579,6 @@ bind_icd (gsize multiarch_index,
return TRUE;
}
/*
* Returns: (transfer none): The first key in @table in iteration order, or %NULL if @table is empty.
*/
static gpointer
pv_hash_table_get_arbitrary_key (GHashTable *table)
{
GHashTableIter iter;
gpointer key = NULL;
g_hash_table_iter_init (&iter, table);
if (g_hash_table_iter_next (&iter, &key, NULL))
return key;
else
return NULL;
}
static gboolean
bind_runtime (FlatpakBwrap *bwrap,
const char *tools_dir,
......@@ -877,7 +801,7 @@ bind_runtime (FlatpakBwrap *bwrap,
/* This has the side-effect of testing whether we can run binaries
* for this architecture on the host system. */
ld_so = capture_output (argv, NULL);
ld_so = pv_capture_output (argv, NULL);
if (ld_so != NULL)
{
......@@ -913,8 +837,8 @@ bind_runtime (FlatpakBwrap *bwrap,
NULL);
flatpak_bwrap_finish (temp_bwrap);
ld_so_in_runtime = capture_output ((const char * const *) temp_bwrap->argv->pdata,
NULL);
ld_so_in_runtime = pv_capture_output ((const char * const *) temp_bwrap->argv->pdata,
NULL);
g_clear_pointer (&temp_bwrap, flatpak_bwrap_free);
......@@ -928,7 +852,7 @@ bind_runtime (FlatpakBwrap *bwrap,
any_architecture_works = TRUE;
g_debug ("Container path: %s -> %s", ld_so, ld_so_in_runtime);
search_path_append (dri_path, this_dri_path_in_container);
pv_search_path_append (dri_path, this_dri_path_in_container);
g_mkdir_with_parents (libdir_on_host, 0755);
g_mkdir_with_parents (this_dri_path_on_host, 0755);
......@@ -1394,7 +1318,7 @@ bind_runtime (FlatpakBwrap *bwrap,
error))
return FALSE;
search_path_append (egl_path, json_in_container);
pv_search_path_append (egl_path, json_in_container);
}
else if (details->kinds[i] == ICD_KIND_SONAME)
{
......@@ -1416,7 +1340,7 @@ bind_runtime (FlatpakBwrap *bwrap,
flatpak_bwrap_add_args (bwrap,
"--ro-bind", json_on_host, json_in_container,
NULL);
search_path_append (egl_path, json_in_container);
pv_search_path_append (egl_path, json_in_container);
}
}
......@@ -1468,7 +1392,7 @@ bind_runtime (FlatpakBwrap *bwrap,
error))
return FALSE;
search_path_append (vulkan_path, json_in_container);
pv_search_path_append (vulkan_path, json_in_container);
}
else if (details->kinds[i] == ICD_KIND_SONAME)
{
......@@ -1490,7 +1414,7 @@ bind_runtime (FlatpakBwrap *bwrap,
flatpak_bwrap_add_args (bwrap,
"--ro-bind", json_on_host, json_in_container,
NULL);
search_path_append (vulkan_path, json_in_container);
pv_search_path_append (vulkan_path, json_in_container);
}
}
......@@ -2444,7 +2368,7 @@ main (int argc,
g_debug ("Checking bwrap features...");
bwrap_help_argv[0] = bwrap_executable;
bwrap_help = capture_output (bwrap_help_argv, error);
bwrap_help = pv_capture_output (bwrap_help_argv, error);
if (bwrap_help == NULL)
goto out;
......@@ -2492,8 +2416,8 @@ main (int argc,
if (runtime_lock == NULL)
goto out;
search_path_append (bin_path, "/overrides/bin");
search_path_append (bin_path, g_getenv ("PATH"));
pv_search_path_append (bin_path, "/overrides/bin");
pv_search_path_append (bin_path, g_getenv ("PATH"));
flatpak_bwrap_add_args (bwrap,
"--setenv", "PATH",
bin_path->str,
......@@ -2512,7 +2436,7 @@ main (int argc,
ld_path = g_build_filename ("/overrides", "lib",
multiarch_tuples[i], NULL);
search_path_append (ld_library_path, ld_path);
pv_search_path_append (ld_library_path, ld_path);
}
/* This would be filtered out by a setuid bwrap, so we have to go
......@@ -2598,14 +2522,14 @@ main (int argc,
/* When using a runtime we can't write to /usr/ or /libQUAL/,
* so redirect this preloaded module to the corresponding
* location in /run/host. */
search_path_append (adjusted_ld_preload, in_run_host);
pv_search_path_append (adjusted_ld_preload, in_run_host);
}
else
{
flatpak_bwrap_add_args (bwrap,
"--ro-bind", preload, preload,
NULL);
search_path_append (adjusted_ld_preload, preload);
pv_search_path_append (adjusted_ld_preload, preload);
}
}
else
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment