diff --git a/loader/loader.c b/loader/loader.c index a950ea1..9462d05 100644 --- a/loader/loader.c +++ b/loader/loader.c @@ -2671,6 +2671,94 @@ static VkResult loader_get_manifest_files( } } +#if !defined(_WIN32) + if (home_location && override == NULL) { + char *xdgconfdirs = secure_getenv("XDG_CONFIG_DIRS"); + char *xdgdatadirs = secure_getenv("XDG_DATA_DIRS"); + char *cur, *src = loc; + size_t src_size = strlen(src), rel_size = strlen(home_location); + size_t size = 0; + + if (src_size > 0) + size += src_size + 1; + + if (xdgconfdirs == NULL) + xdgconfdirs = "/etc/xdg"; + if (xdgdatadirs == NULL) + xdgdatadirs = "/usr/local/share:/usr/share"; + + for (char *x = xdgconfdirs; *x; ++x) + if (*x == PATH_SEPERATOR) size += rel_size; + size += strlen(xdgconfdirs) + rel_size + 1; + for (char *x = xdgdatadirs; *x; ++x) + if (*x == PATH_SEPERATOR) size += rel_size; + size += strlen(xdgdatadirs) + rel_size + 1; + +#if defined(LOCALPREFIX) + size += strlen(LOCALPREFIX "/" SYSCONFDIR) + rel_size + 1; + size += strlen(LOCALPREFIX "/" DATADIR) + rel_size + 1; +#endif + + loc = cur = loader_stack_alloc(size); + if (cur == NULL) { + loader_log(inst, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0, + "Out of memory can't get manifest files"); + res = VK_ERROR_OUT_OF_HOST_MEMORY; + goto out; + } + + if (src_size > 0) { + memcpy(cur, src, src_size); + cur += src_size; + *cur++ = PATH_SEPERATOR; + } + + src = xdgconfdirs; + for (char *x = src;; ++x) { + if (*x == PATH_SEPERATOR || *x == 0) { + size_t s = x - src; + memcpy(cur, src, s); cur += s; + memcpy(cur, home_location, rel_size); cur += rel_size; + *cur++ = PATH_SEPERATOR; + if (*x == 0) + break; + src = ++x; + } + } + +#if defined(LOCALPREFIX) + strcpy(cur, LOCALPREFIX "/" SYSCONFDIR); + cur += strlen(cur); + memcpy(cur, home_location, rel_size); cur += rel_size; + *cur++ = PATH_SEPERATOR; +#endif + + src = xdgdatadirs; + for (char *x = src;; ++x) { + if (*x == PATH_SEPERATOR || *x == 0) { + size_t s = x - src; + memcpy(cur, src, s); cur += s; + memcpy(cur, home_location, rel_size); cur += rel_size; + *cur++ = PATH_SEPERATOR; + if (*x == 0) + break; + src = ++x; + } + } + +#if defined(LOCALPREFIX) + strcpy(cur, LOCALPREFIX "/" DATADIR); + cur += strlen(cur); + memcpy(cur, home_location, rel_size); cur += rel_size; + *cur++ = PATH_SEPERATOR; +#endif + + loc[size - 1] = 0; + assert(cur == loc + size); + list_is_dirs = true; + } +#endif + // Print out the paths being searched if debugging is enabled loader_log(inst, VK_DEBUG_REPORT_DEBUG_BIT_EXT, 0, "Searching the following paths for manifest files: %s\n", loc); diff --git a/loader/vk_loader_platform.h b/loader/vk_loader_platform.h index 3a02640..70a2652 100644 --- a/loader/vk_loader_platform.h +++ b/loader/vk_loader_platform.h @@ -57,35 +57,10 @@ #define VULKAN_ILAYERCONF_DIR "implicit_layer.d" #define VULKAN_LAYER_DIR "layer" -#if defined(LOCALPREFIX) -#define LOCAL_DRIVERS_INFO \ - LOCALPREFIX "/" SYSCONFDIR VULKAN_DIR VULKAN_ICDCONF_DIR ":" \ - LOCALPREFIX "/" DATADIR VULKAN_DIR VULKAN_ICDCONF_DIR ":" -#define LOCAL_ELAYERS_INFO \ - LOCALPREFIX "/" SYSCONFDIR VULKAN_DIR VULKAN_ELAYERCONF_DIR ":" \ - LOCALPREFIX "/" DATADIR VULKAN_DIR VULKAN_ELAYERCONF_DIR ":" -#define LOCAL_ILAYERS_INFO \ - LOCALPREFIX "/" SYSCONFDIR VULKAN_DIR VULKAN_ILAYERCONF_DIR ":" \ - LOCALPREFIX "/" DATADIR VULKAN_DIR VULKAN_ILAYERCONF_DIR ":" -#else -#define LOCAL_DRIVERS_INFO -#define LOCAL_ELAYERS_INFO -#define LOCAL_ILAYERS_INFO -#endif - -#define DEFAULT_VK_DRIVERS_INFO \ - LOCAL_DRIVERS_INFO \ - "/" SYSCONFDIR VULKAN_DIR VULKAN_ICDCONF_DIR ":" \ - "/usr/" DATADIR VULKAN_DIR VULKAN_ICDCONF_DIR +#define DEFAULT_VK_DRIVERS_INFO "" #define DEFAULT_VK_DRIVERS_PATH "" -#define DEFAULT_VK_ELAYERS_INFO \ - LOCAL_ELAYERS_INFO \ - "/" SYSCONFDIR VULKAN_DIR VULKAN_ELAYERCONF_DIR ":" \ - "/usr/" DATADIR VULKAN_DIR VULKAN_ELAYERCONF_DIR -#define DEFAULT_VK_ILAYERS_INFO \ - LOCAL_ILAYERS_INFO \ - "/" SYSCONFDIR VULKAN_DIR VULKAN_ILAYERCONF_DIR ":" \ - "/usr/" DATADIR VULKAN_DIR VULKAN_ILAYERCONF_DIR +#define DEFAULT_VK_ELAYERS_INFO "" +#define DEFAULT_VK_ILAYERS_INFO "" #define DEFAULT_VK_LAYERS_PATH "" #if !defined(LAYERS_SOURCE_PATH) #define LAYERS_SOURCE_PATH NULL