From 7e51d489960fb6c246814d1cde78ce2f720fc964 Mon Sep 17 00:00:00 2001 From: Simon McVittie <smcv@collabora.com> Date: Mon, 12 Aug 2019 19:13:58 +0100 Subject: [PATCH] Add srt_system_info_set_environ() Signed-off-by: Simon McVittie <smcv@collabora.com> --- steam-runtime-tools/system-info.c | 54 ++++++++++++++++++++++++++++++- steam-runtime-tools/system-info.h | 3 ++ 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/steam-runtime-tools/system-info.c b/steam-runtime-tools/system-info.c index 4f9d63a63..0b6179d1c 100644 --- a/steam-runtime-tools/system-info.c +++ b/steam-runtime-tools/system-info.c @@ -77,6 +77,8 @@ struct _SrtSystemInfo GObject parent; /* "" if we have tried and failed to auto-detect */ gchar *expectations; + /* Fake environment variables, or %NULL to use the real environment */ + gchar **env; Tristate can_write_uinput; /* (element-type Abi) */ GPtrArray *abis; @@ -200,6 +202,7 @@ srt_system_info_finalize (GObject *object) g_clear_pointer (&self->abis, g_ptr_array_unref); g_free (self->expectations); + g_strfreev (self->env); G_OBJECT_CLASS (srt_system_info_parent_class)->finalize (object); } @@ -348,6 +351,15 @@ library_compare (SrtLibrary *a, SrtLibrary *b) return g_strcmp0 (srt_library_get_soname (a), srt_library_get_soname (b)); } +static gchar ** +get_environ (SrtSystemInfo *self) +{ + if (self->env != NULL) + return self->env; + else + return environ; +} + static gboolean ensure_expectations (SrtSystemInfo *self) { @@ -357,7 +369,7 @@ ensure_expectations (SrtSystemInfo *self) const char *sysroot = "/"; gchar *def; - runtime = g_getenv ("STEAM_RUNTIME"); + runtime = g_environ_getenv (get_environ (self), "STEAM_RUNTIME"); if (runtime != NULL && runtime[0] == '/') sysroot = runtime; @@ -657,3 +669,43 @@ srt_system_info_check_library (SrtSystemInfo *self, return ret; } + +/* + * Forget whether we can load libraries. + */ +static void +forget_libraries (SrtSystemInfo *self) +{ + gsize i; + + for (i = 0; i < self->abis->len; i++) + { + Abi *abi = g_ptr_array_index (self->abis, i); + + g_hash_table_remove_all (abi->cached_results); + abi->cached_combined_issues = SRT_LIBRARY_ISSUES_NONE; + abi->libraries_cache_available = FALSE; + } +} + +/** + * srt_system_info_set_environ: + * @self: The #SrtSystemInfo + * @env: (nullable) (array zero-terminated=1) (element-type filename) (transfer none): An + * array of environment variables + * + * Use @env instead of the real environment variable block `environ` + * when locating the Steam Runtime. + * + * If @env is %NULL, go back to using the real environment variables. + */ +void +srt_system_info_set_environ (SrtSystemInfo *self, + gchar * const *env) +{ + g_return_if_fail (SRT_IS_SYSTEM_INFO (self)); + + forget_libraries (self); + g_strfreev (self->env); + self->env = g_strdupv ((gchar **) env); +} diff --git a/steam-runtime-tools/system-info.h b/steam-runtime-tools/system-info.h index 6213b2d14..33b6132b3 100644 --- a/steam-runtime-tools/system-info.h +++ b/steam-runtime-tools/system-info.h @@ -58,3 +58,6 @@ SrtLibraryIssues srt_system_info_check_library (SrtSystemInfo *self, const gchar *multiarch_tuple, const gchar *soname, SrtLibrary **more_details_out); + +void srt_system_info_set_environ (SrtSystemInfo *self, + gchar * const *env); -- GitLab