diff --git a/src/runtime.c b/src/runtime.c index 7ba1ff9d9edcbc3cb20385acb61db182137adf08..296faeedf306926e7667ccb5647ed59ae1135177 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -564,8 +564,8 @@ try_bind_dri (PvRuntime *self, { g_autoptr(FlatpakBwrap) temp_bwrap = NULL; g_autofree gchar *expr = NULL; - g_autofree gchar *host_dri = NULL; - g_autofree gchar *dest_dri = NULL; + g_autoptr(GDir) dir = NULL; + const char *member; expr = g_strdup_printf ("only-dependencies:if-exists:path-match:%s/dri/*.so", libdir); @@ -589,28 +589,34 @@ try_bind_dri (PvRuntime *self, g_clear_pointer (&temp_bwrap, flatpak_bwrap_free); - /* TODO: If we're already in a container, rely on /run/host - * already being mounted, so we don't need to re-enter a container - * here. */ - host_dri = g_build_filename ("/run/host", libdir, "dri", NULL); - dest_dri = g_build_filename (arch->libdir_on_host, "dri", NULL); - temp_bwrap = flatpak_bwrap_new (NULL); - flatpak_bwrap_add_args (temp_bwrap, - self->bubblewrap, - "--ro-bind", "/", "/", - "--tmpfs", "/run", - "--ro-bind", "/", "/run/host", - "--bind", self->overrides, self->overrides, - "sh", "-c", - "ln -fns \"$1\"/* \"$2\"", - "sh", /* $0 */ - host_dri, - dest_dri, - NULL); - flatpak_bwrap_finish (temp_bwrap); + dir = g_dir_open (dri, 0, error); - if (!pv_bwrap_run_sync (temp_bwrap, NULL, error)) + if (dir == NULL) return FALSE; + + for (member = g_dir_read_name (dir); + member != NULL; + member = g_dir_read_name (dir)) + { + g_autofree gchar *target = g_build_filename ("/run/host", dri, + member, NULL); + g_autofree gchar *dest = g_build_filename (arch->libdir_on_host, + "dri", member, NULL); + + g_debug ("Creating symbolic link \"%s\" -> \"%s\" for \"%s\" DRI driver", + dest, target, arch->tuple); + + /* Delete an existing symlink if any, like ln -f */ + if (unlink (dest) != 0 && errno != ENOENT) + return glnx_throw_errno_prefix (error, + "Unable to remove \"%s\"", + dest); + + if (symlink (target, dest) != 0) + return glnx_throw_errno_prefix (error, + "Unable to create symlink \"%s\" -> \"%s\"", + dest, target); + } } if (g_file_test (s2tc, G_FILE_TEST_EXISTS))