From 4bd9ee4b14bae965c46d6319b3975021099c9595 Mon Sep 17 00:00:00 2001
From: Simon McVittie <smcv@collabora.com>
Date: Mon, 18 May 2020 13:53:56 +0100
Subject: [PATCH] runtime: Pass the RuntimeArchitecture to bind_icd

Signed-off-by: Simon McVittie <smcv@collabora.com>
---
 src/runtime.c | 81 +++++++++++++++++++--------------------------------
 1 file changed, 30 insertions(+), 51 deletions(-)

diff --git a/src/runtime.c b/src/runtime.c
index e70bbc645..fac72b5bd 100644
--- a/src/runtime.c
+++ b/src/runtime.c
@@ -159,6 +159,20 @@ runtime_architecture_init (RuntimeArchitecture *self,
   return TRUE;
 }
 
+static gboolean
+runtime_architecture_check_valid (RuntimeArchitecture *self)
+{
+  g_return_val_if_fail (self->multiarch_index < G_N_ELEMENTS (libquals), FALSE);
+  g_return_val_if_fail (self->tuple == multiarch_tuples[self->multiarch_index], FALSE);
+  g_return_val_if_fail (self->capsule_capture_libs_basename != NULL, FALSE);
+  g_return_val_if_fail (self->capsule_capture_libs != NULL, FALSE);
+  g_return_val_if_fail (self->libdir_on_host != NULL, FALSE);
+  g_return_val_if_fail (self->libdir_in_container != NULL, FALSE);
+  g_return_val_if_fail (self->libqual == libquals[self->multiarch_index], FALSE);
+  g_return_val_if_fail (self->ld_so != NULL, FALSE);
+  return TRUE;
+}
+
 static void
 runtime_architecture_clear (RuntimeArchitecture *self)
 {
@@ -810,11 +824,8 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC (IcdDetails, icd_details_free)
  */
 static gboolean
 bind_icd (PvRuntime *self,
-          gsize multiarch_index,
+          RuntimeArchitecture *arch,
           gsize sequence_number,
-          const char *capsule_capture_libs,
-          const char *libdir_on_host,
-          const char *libdir_in_container,
           const char *subdir,
           IcdDetails *details,
           GError **error)
@@ -826,14 +837,13 @@ bind_icd (PvRuntime *self,
   g_autofree gchar *seq_str = NULL;
   const char *mode;
   g_autoptr(FlatpakBwrap) temp_bwrap = NULL;
+  gsize multiarch_index;
 
-  g_return_val_if_fail (capsule_capture_libs != NULL, FALSE);
-  g_return_val_if_fail (libdir_on_host != NULL, FALSE);
+  g_return_val_if_fail (runtime_architecture_check_valid (arch), FALSE);
   g_return_val_if_fail (subdir != NULL, FALSE);
-  g_return_val_if_fail (multiarch_index < G_N_ELEMENTS (multiarch_tuples) - 1,
-                        FALSE);
   g_return_val_if_fail (details != NULL, FALSE);
   g_return_val_if_fail (details->resolved_library != NULL, FALSE);
+  multiarch_index = arch->multiarch_index;
   g_return_val_if_fail (details->kinds[multiarch_index] == ICD_KIND_NONEXISTENT,
                         FALSE);
   g_return_val_if_fail (details->paths_in_container[multiarch_index] == NULL,
@@ -851,11 +861,11 @@ bind_icd (PvRuntime *self,
       if (sequence_number != G_MAXSIZE)
         {
           seq_str = g_strdup_printf ("%" G_GSIZE_FORMAT, sequence_number);
-          on_host = g_build_filename (libdir_on_host, subdir, seq_str, NULL);
+          on_host = g_build_filename (arch->libdir_on_host, subdir, seq_str, NULL);
         }
       else
         {
-          on_host = g_build_filename (libdir_on_host, subdir, NULL);
+          on_host = g_build_filename (arch->libdir_on_host, subdir, NULL);
         }
 
       g_debug ("Ensuring %s exists", on_host);
@@ -881,10 +891,11 @@ bind_icd (PvRuntime *self,
 
   temp_bwrap = pv_bwrap_copy (self->container_access_adverb);
   flatpak_bwrap_add_args (temp_bwrap,
-                          capsule_capture_libs,
+                          arch->capsule_capture_libs,
                           "--container", self->container_access,
                           "--link-target", "/run/host",
-                          "--dest", on_host == NULL ? libdir_on_host : on_host,
+                          "--dest",
+                            on_host == NULL ? arch->libdir_on_host : on_host,
                           "--provider", "/",
                           pattern,
                           NULL);
@@ -910,10 +921,10 @@ bind_icd (PvRuntime *self,
 
   temp_bwrap = pv_bwrap_copy (self->container_access_adverb);
   flatpak_bwrap_add_args (temp_bwrap,
-                          capsule_capture_libs,
+                          arch->capsule_capture_libs,
                           "--container", self->container_access,
                           "--link-target", "/run/host",
-                          "--dest", libdir_on_host,
+                          "--dest", arch->libdir_on_host,
                           "--provider", "/",
                           dependency_pattern,
                           NULL);
@@ -927,7 +938,7 @@ bind_icd (PvRuntime *self,
   if (details->kinds[multiarch_index] == ICD_KIND_ABSOLUTE)
     {
       g_assert (on_host != NULL);
-      details->paths_in_container[multiarch_index] = g_build_filename (libdir_in_container,
+      details->paths_in_container[multiarch_index] = g_build_filename (arch->libdir_in_container,
                                                                        subdir,
                                                                        seq_str ? seq_str : "",
                                                                        glnx_basename (details->resolved_library),
@@ -1381,15 +1392,7 @@ pv_runtime_use_host_graphics_stack (PvRuntime *self,
               details->resolved_library = srt_egl_icd_resolve_library_path (icd);
               g_assert (details->resolved_library != NULL);
 
-              if (!bind_icd (self,
-                             arch->multiarch_index,
-                             j,
-                             arch->capsule_capture_libs,
-                             arch->libdir_on_host,
-                             arch->libdir_in_container,
-                             "glvnd",
-                             details,
-                             error))
+              if (!bind_icd (self, arch, j, "glvnd", details, error))
                 return FALSE;
             }
 
@@ -1407,15 +1410,7 @@ pv_runtime_use_host_graphics_stack (PvRuntime *self,
               details->resolved_library = srt_vulkan_icd_resolve_library_path (icd);
               g_assert (details->resolved_library != NULL);
 
-              if (!bind_icd (self,
-                             arch->multiarch_index,
-                             j,
-                             arch->capsule_capture_libs,
-                             arch->libdir_on_host,
-                             arch->libdir_in_container,
-                             "vulkan",
-                             details,
-                             error))
+              if (!bind_icd (self, arch, j, "vulkan", details, error))
                 return FALSE;
             }
 
@@ -1434,15 +1429,7 @@ pv_runtime_use_host_graphics_stack (PvRuntime *self,
               /* We avoid using the sequence number for VDPAU because they can only
                * be located in a single directory, so by definition we can't have
                * collisions */
-              if (!bind_icd (self,
-                             arch->multiarch_index,
-                             G_MAXSIZE,
-                             arch->capsule_capture_libs,
-                             arch->libdir_on_host,
-                             arch->libdir_in_container,
-                             "vdpau",
-                             details,
-                             error))
+              if (!bind_icd (self, arch, G_MAXSIZE, "vdpau", details, error))
                 return FALSE;
             }
 
@@ -1466,15 +1453,7 @@ pv_runtime_use_host_graphics_stack (PvRuntime *self,
               g_assert (details->resolved_library != NULL);
               g_assert (g_path_is_absolute (details->resolved_library));
 
-              if (!bind_icd (self,
-                             arch->multiarch_index,
-                             j,
-                             arch->capsule_capture_libs,
-                             arch->libdir_on_host,
-                             arch->libdir_in_container,
-                             "dri",
-                             details,
-                             error))
+              if (!bind_icd (self, arch, j, "dri", details, error))
                 return FALSE;
 
               g_ptr_array_add (va_api_icd_details, g_steal_pointer (&details));
-- 
GitLab