diff --git a/src/runtime.c b/src/runtime.c index 1b3e81aadcd802cc5cbd17b4e346a4206cd8d4cf..a0824acd22b99a27d6ba9d077d0e57e88e773912 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -1638,6 +1638,7 @@ typedef enum { TAKE_FROM_HOST_FLAGS_IF_DIR = (1 << 0), TAKE_FROM_HOST_FLAGS_IF_EXISTS = (1 << 1), + TAKE_FROM_HOST_FLAGS_IF_CONTAINER_COMPATIBLE = (1 << 2), TAKE_FROM_HOST_FLAGS_NONE = 0 } TakeFromHostFlags; @@ -1706,6 +1707,43 @@ pv_runtime_take_from_host (PvRuntime *self, { /* We can't edit the runtime in-place, so tell bubblewrap to mount * a new version over the top */ + + if (flags & TAKE_FROM_HOST_FLAGS_IF_CONTAINER_COMPATIBLE) + { + g_autofree gchar *dest = NULL; + + if (g_str_has_prefix (dest_in_container, "/usr/")) + dest = g_build_filename (self->runtime_usr, + dest_in_container + strlen ("/usr/"), + NULL); + else + dest = g_build_filename (self->runtime_files, + dest_in_container, + NULL); + + if (g_file_test (source_in_host, G_FILE_TEST_IS_DIR)) + { + if (!g_file_test (dest, G_FILE_TEST_IS_DIR)) + { + g_warning ("Not mounting \"%s\" over non-directory file or " + "nonexistent path \"%s\"", + source_in_host, dest); + return TRUE; + } + } + else + { + if (!(g_file_test (dest, G_FILE_TEST_EXISTS) && + g_file_test (dest, G_FILE_TEST_IS_DIR))) + { + g_warning ("Not mounting \"%s\" over directory or " + "nonexistent path \"%s\"", + source_in_host, dest); + return TRUE; + } + } + } + flatpak_bwrap_add_args (bwrap, "--ro-bind", source_in_host, dest_in_container, NULL); @@ -1743,7 +1781,6 @@ pv_runtime_use_host_graphics_stack (PvRuntime *self, g_free, NULL); g_autoptr(GHashTable) gconv_from_host = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); - g_autofree gchar *libdrm_data_in_runtime = NULL; g_autofree gchar *best_libdrm_data_from_host = NULL; GHashTableIter iter; const gchar *gconv_path; @@ -2353,14 +2390,14 @@ pv_runtime_use_host_graphics_stack (PvRuntime *self, best_libdrm_data_from_host = g_strdup (pv_hash_table_get_arbitrary_key (libdrm_data_from_host)); } - libdrm_data_in_runtime = g_build_filename (self->runtime_usr, "share", "libdrm", NULL); - - if (best_libdrm_data_from_host != NULL && - g_file_test (libdrm_data_in_runtime, G_FILE_TEST_IS_DIR)) + if (best_libdrm_data_from_host != NULL) { - flatpak_bwrap_add_args (bwrap, - "--ro-bind", best_libdrm_data_from_host, "/usr/share/libdrm", - NULL); + if (!pv_runtime_take_from_host (self, bwrap, + best_libdrm_data_from_host, + "/usr/share/libdrm", + TAKE_FROM_HOST_FLAGS_IF_CONTAINER_COMPATIBLE, + error)) + return FALSE; } g_debug ("Setting up EGL ICD JSON...");