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