From d7d8244593d18b17007bfc6ff5c8f19766a4020a Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Fri, 10 Jun 2022 17:23:48 -0700 Subject: [PATCH] Thunks: Support pressure-vessel prefixes Instead of duplicating prefixes in the ThunksDB json file even more, just do a prefix replacement when the thunks database is being parsed. Changes the JSON overlay arrays over to @PREFIX@ and reduce the duplication. Adds support for the pressure-vessel prefix `/usr/lib/pressure-vessel/overrides/lib` This gets thunks ready for running under pressure-vessel, once vulkan thunking switches from device libraries to the vulkan loader it should just work. --- Data/ThunksDB.json | 248 +++++------------- Source/Tests/LinuxSyscalls/FileManagement.cpp | 36 ++- 2 files changed, 96 insertions(+), 188 deletions(-) diff --git a/Data/ThunksDB.json b/Data/ThunksDB.json index 8974843c9..5e1a206de 100644 --- a/Data/ThunksDB.json +++ b/Data/ThunksDB.json @@ -6,18 +6,10 @@ "X11" ], "Overlay": [ - "/usr/lib/x86_64-linux-gnu/libGL.so", - "/usr/lib/x86_64-linux-gnu/libGL.so.1", - "/usr/lib/x86_64-linux-gnu/libGL.so.1.2.0", - "/usr/lib/x86_64-linux-gnu/libGL.so.1.7.0", - "/usr/local/lib/x86_64-linux-gnu/libGL.so", - "/usr/local/lib/x86_64-linux-gnu/libGL.so.1", - "/usr/local/lib/x86_64-linux-gnu/libGL.so.1.2.0", - "/usr/local/lib/x86_64-linux-gnu/libGL.so.1.7.0", - "/lib/x86_64-linux-gnu/libGL.so", - "/lib/x86_64-linux-gnu/libGL.so.1", - "/lib/x86_64-linux-gnu/libGL.so.1.2.0", - "/lib/x86_64-linux-gnu/libGL.so.1.7.0" + "@PREFIX_LIB@/x86_64-linux-gnu/libGL.so", + "@PREFIX_LIB@/x86_64-linux-gnu/libGL.so.1", + "@PREFIX_LIB@/x86_64-linux-gnu/libGL.so.1.2.0", + "@PREFIX_LIB@/x86_64-linux-gnu/libGL.so.1.7.0" ] }, "GLESv2": { @@ -26,29 +18,17 @@ "X11" ], "Overlay": [ - "/usr/lib/x86_64-linux-gnu/libGLESv2.so", - "/usr/lib/x86_64-linux-gnu/libGLESv2.so.2", - "/usr/lib/x86_64-linux-gnu/libGLESv2.so.2.0.0", - "/usr/local/lib/x86_64-linux-gnu/libGLESv2.so", - "/usr/local/lib/x86_64-linux-gnu/libGLESv2.so.2", - "/usr/local/lib/x86_64-linux-gnu/libGLESv2.so.2.0.0", - "/lib/x86_64-linux-gnu/libGLESv2.so", - "/lib/x86_64-linux-gnu/libGLESv2.so.2", - "/lib/x86_64-linux-gnu/libGLESv2.so.2.0.0" + "@PREFIX_LIB@/x86_64-linux-gnu/libGLESv2.so", + "@PREFIX_LIB@/x86_64-linux-gnu/libGLESv2.so.2", + "@PREFIX_LIB@/x86_64-linux-gnu/libGLESv2.so.2.0.0" ] }, "X11": { "Library": "libX11-guest.so", "Overlay": [ - "/usr/lib/x86_64-linux-gnu/libX11.so", - "/usr/lib/x86_64-linux-gnu/libX11.so.6", - "/usr/lib/x86_64-linux-gnu/libX11.so.6.4.0", - "/usr/local/lib/x86_64-linux-gnu/libX11.so", - "/usr/local/lib/x86_64-linux-gnu/libX11.so.6", - "/usr/local/lib/x86_64-linux-gnu/libX11.so.6.4.0", - "/lib/x86_64-linux-gnu/libX11.so", - "/lib/x86_64-linux-gnu/libX11.so.6", - "/lib/x86_64-linux-gnu/libX11.so.6.4.0" + "@PREFIX_LIB@/x86_64-linux-gnu/libX11.so", + "@PREFIX_LIB@/x86_64-linux-gnu/libX11.so.6", + "@PREFIX_LIB@/x86_64-linux-gnu/libX11.so.6.4.0" ] }, "Vulkan-radeon": { @@ -57,9 +37,7 @@ "xcb" ], "Overlay": [ - "/usr/lib/x86_64-linux-gnu/libvulkan_radeon.so", - "/usr/local/lib/x86_64-linux-gnu/libvulkan_radeon.so", - "/lib/x86_64-linux-gnu/libvulkan_radeon.so" + "@PREFIX_LIB@/x86_64-linux-gnu/libvulkan_radeon.so" ], "Comment": [ "Vulkan library relies on xcb, otherwise it crashes with jemalloc" @@ -71,9 +49,7 @@ "xcb" ], "Overlay": [ - "/usr/lib/x86_64-linux-gnu/libvulkan_lvp.so", - "/usr/local/lib/x86_64-linux-gnu/libvulkan_lvp.so", - "/lib/x86_64-linux-gnu/libvulkan_lvp.so" + "@PREFIX_LIB@/x86_64-linux-gnu/libvulkan_lvp.so" ] }, "Vulkan-freedreno": { @@ -82,9 +58,7 @@ "xcb" ], "Overlay": [ - "/usr/lib/x86_64-linux-gnu/libvulkan_freedreno.so", - "/usr/local/lib/x86_64-linux-gnu/libvulkan_freedreno.so", - "/lib/x86_64-linux-gnu/libvulkan_freedreno.so" + "@PREFIX_LIB@/x86_64-linux-gnu/libvulkan_freedreno.so" ] }, "Vulkan-intel": { @@ -93,9 +67,7 @@ "xcb" ], "Overlay": [ - "/usr/lib/x86_64-linux-gnu/libvulkan_intel.so", - "/usr/local/lib/x86_64-linux-gnu/libvulkan_intel.so", - "/lib/x86_64-linux-gnu/libvulkan_intel.so" + "@PREFIX_LIB@/x86_64-linux-gnu/libvulkan_intel.so" ] }, "Vulkan-panfrost": { @@ -104,9 +76,7 @@ "xcb" ], "Overlay": [ - "/usr/lib/x86_64-linux-gnu/libvulkan_panfrost.so", - "/usr/local/lib/x86_64-linux-gnu/libvulkan_panfrost.so", - "/lib/x86_64-linux-gnu/libvulkan_panfrost.so" + "@PREFIX_LIB@/x86_64-linux-gnu/libvulkan_panfrost.so" ] }, "Vulkan-nvidia": { @@ -115,9 +85,7 @@ "xcb" ], "Overlay": [ - "/usr/lib/x86_64-linux-gnu/libGLX_nvidia.so.0", - "/usr/local/lib/x86_64-linux-gnu/libGLX_nvidia.so.0", - "/lib/x86_64-linux-gnu/libGLX_nvidia.so.0" + "@PREFIX_LIB@/x86_64-linux-gnu/libGLX_nvidia.so.0" ], "Comment": [ "Not currently wired up" @@ -129,219 +97,127 @@ "xcb" ], "Overlay": [ - "/usr/lib/x86_64-linux-gnu/libvulkan_virtio.so", - "/usr/local/lib/x86_64-linux-gnu/libvulkan_virtio.so", - "/lib/x86_64-linux-gnu/libvulkan_virtio.so" + "@PREFIX_LIB@/x86_64-linux-gnu/libvulkan_virtio.so" ] }, "xcb": { "Library": "libxcb-guest.so", "Overlay": [ - "/usr/lib/x86_64-linux-gnu/libxcb.so", - "/usr/lib/x86_64-linux-gnu/libxcb.so.1", - "/usr/lib/x86_64-linux-gnu/libxcb.so.1.1.0", - "/usr/local/lib/x86_64-linux-gnu/libxcb.so", - "/usr/local/lib/x86_64-linux-gnu/libxcb.so.1", - "/usr/local/lib/x86_64-linux-gnu/libxcb.so.1.1.0", - "/lib/x86_64-linux-gnu/libxcb.so", - "/lib/x86_64-linux-gnu/libxcb.so.1", - "/lib/x86_64-linux-gnu/libxcb.so.1.1.0" + "@PREFIX_LIB@/x86_64-linux-gnu/libxcb.so", + "@PREFIX_LIB@/x86_64-linux-gnu/libxcb.so.1", + "@PREFIX_LIB@/x86_64-linux-gnu/libxcb.so.1.1.0" ] }, "xcb-dri2": { "Library": "libxcb_dri2-guest.so", "Overlay": [ - "/usr/lib/x86_64-linux-gnu/libxcb-dri2.so", - "/usr/lib/x86_64-linux-gnu/libxcb-dri2.so.0", - "/usr/lib/x86_64-linux-gnu/libxcb-dri2.so.0.0.0", - "/usr/local/lib/x86_64-linux-gnu/libxcb-dri2.so", - "/usr/local/lib/x86_64-linux-gnu/libxcb-dri2.so.0", - "/usr/local/lib/x86_64-linux-gnu/libxcb-dri2.so.0.0.0", - "/lib/x86_64-linux-gnu/libxcb-dri2.so", - "/lib/x86_64-linux-gnu/libxcb-dri2.so.0", - "/lib/x86_64-linux-gnu/libxcb-dri2.so.0.0.0" + "@PREFIX_LIB@/x86_64-linux-gnu/libxcb-dri2.so", + "@PREFIX_LIB@/x86_64-linux-gnu/libxcb-dri2.so.0", + "@PREFIX_LIB@/x86_64-linux-gnu/libxcb-dri2.so.0.0.0" ] }, "xcb-dri3": { "Library": "libxcb_dri3-guest.so", "Overlay": [ - "/usr/lib/x86_64-linux-gnu/libxcb-dri3.so", - "/usr/lib/x86_64-linux-gnu/libxcb-dri3.so.0", - "/usr/lib/x86_64-linux-gnu/libxcb-dri3.so.0.0.0", - "/usr/local/lib/x86_64-linux-gnu/libxcb-dri3.so", - "/usr/local/lib/x86_64-linux-gnu/libxcb-dri3.so.0", - "/usr/local/lib/x86_64-linux-gnu/libxcb-dri3.so.0.0.0", - "/lib/x86_64-linux-gnu/libxcb-dri3.so", - "/lib/x86_64-linux-gnu/libxcb-dri3.so.0", - "/lib/x86_64-linux-gnu/libxcb-dri3.so.0.0.0" + "@PREFIX_LIB@/x86_64-linux-gnu/libxcb-dri3.so", + "@PREFIX_LIB@/x86_64-linux-gnu/libxcb-dri3.so.0", + "@PREFIX_LIB@/x86_64-linux-gnu/libxcb-dri3.so.0.0.0" ] }, "xcb-xfixes": { "Library": "libxcb_xfixes-guest.so", "Overlay": [ - "/usr/lib/x86_64-linux-gnu/libxcb-xfixes.so", - "/usr/lib/x86_64-linux-gnu/libxcb-xfixes.so.0", - "/usr/lib/x86_64-linux-gnu/libxcb-xfixes.so.0.0.0", - "/usr/local/lib/x86_64-linux-gnu/libxcb-xfixes.so", - "/usr/local/lib/x86_64-linux-gnu/libxcb-xfixes.so.0", - "/usr/local/lib/x86_64-linux-gnu/libxcb-xfixes.so.0.0.0", - "/lib/x86_64-linux-gnu/libxcb-xfixes.so", - "/lib/x86_64-linux-gnu/libxcb-xfixes.so.0", - "/lib/x86_64-linux-gnu/libxcb-xfixes.so.0.0.0" + "@PREFIX_LIB@/x86_64-linux-gnu/libxcb-xfixes.so", + "@PREFIX_LIB@/x86_64-linux-gnu/libxcb-xfixes.so.0", + "@PREFIX_LIB@/x86_64-linux-gnu/libxcb-xfixes.so.0.0.0" ] }, "xcb-shm": { "Library": "libxcb_shm-guest.so", "Overlay": [ - "/usr/lib/x86_64-linux-gnu/libxcb-shm.so", - "/usr/lib/x86_64-linux-gnu/libxcb-shm.so.0", - "/usr/lib/x86_64-linux-gnu/libxcb-shm.so.0.0.0", - "/usr/local/lib/x86_64-linux-gnu/libxcb-shm.so", - "/usr/local/lib/x86_64-linux-gnu/libxcb-shm.so.0", - "/usr/local/lib/x86_64-linux-gnu/libxcb-shm.so.0.0.0", - "/lib/x86_64-linux-gnu/libxcb-shm.so", - "/lib/x86_64-linux-gnu/libxcb-shm.so.0", - "/lib/x86_64-linux-gnu/libxcb-shm.so.0.0.0" + "@PREFIX_LIB@/x86_64-linux-gnu/libxcb-shm.so", + "@PREFIX_LIB@/x86_64-linux-gnu/libxcb-shm.so.0", + "@PREFIX_LIB@/x86_64-linux-gnu/libxcb-shm.so.0.0.0" ] }, "xcb-sync": { "Library": "libxcb_sync-guest.so", "Overlay": [ - "/usr/lib/x86_64-linux-gnu/libxcb-sync.so", - "/usr/lib/x86_64-linux-gnu/libxcb-sync.so.1", - "/usr/lib/x86_64-linux-gnu/libxcb-sync.so.1.0.0", - "/usr/local/lib/x86_64-linux-gnu/libxcb-sync.so", - "/usr/local/lib/x86_64-linux-gnu/libxcb-sync.so.1", - "/usr/local/lib/x86_64-linux-gnu/libxcb-sync.so.1.0.0", - "/lib/x86_64-linux-gnu/libxcb-sync.so", - "/lib/x86_64-linux-gnu/libxcb-sync.so.1", - "/lib/x86_64-linux-gnu/libxcb-sync.so.1.0.0" + "@PREFIX_LIB@/x86_64-linux-gnu/libxcb-sync.so", + "@PREFIX_LIB@/x86_64-linux-gnu/libxcb-sync.so.1", + "@PREFIX_LIB@/x86_64-linux-gnu/libxcb-sync.so.1.0.0" ] }, "xcb-randr": { "Library": "libxcb_randr-guest.so", "Overlay": [ - "/usr/lib/x86_64-linux-gnu/libxcb-randr.so", - "/usr/lib/x86_64-linux-gnu/libxcb-randr.so.0", - "/usr/lib/x86_64-linux-gnu/libxcb-randr.so.0.1.0", - "/usr/local/lib/x86_64-linux-gnu/libxcb-randr.so", - "/usr/local/lib/x86_64-linux-gnu/libxcb-randr.so.0", - "/usr/local/lib/x86_64-linux-gnu/libxcb-randr.so.0.1.0", - "/lib/x86_64-linux-gnu/libxcb-randr.so", - "/lib/x86_64-linux-gnu/libxcb-randr.so.0", - "/lib/x86_64-linux-gnu/libxcb-randr.so.0.1.0" + "@PREFIX_LIB@/x86_64-linux-gnu/libxcb-randr.so", + "@PREFIX_LIB@/x86_64-linux-gnu/libxcb-randr.so.0", + "@PREFIX_LIB@/x86_64-linux-gnu/libxcb-randr.so.0.1.0" ] }, "xcb-present": { "Library": "libxcb_present-guest.so", "Overlay": [ - "/usr/lib/x86_64-linux-gnu/libxcb-present.so", - "/usr/lib/x86_64-linux-gnu/libxcb-present.so.0", - "/usr/lib/x86_64-linux-gnu/libxcb-present.so.0.0.0", - "/usr/local/lib/x86_64-linux-gnu/libxcb-present.so", - "/usr/local/lib/x86_64-linux-gnu/libxcb-present.so.0", - "/usr/local/lib/x86_64-linux-gnu/libxcb-present.so.0.0.0", - "/lib/x86_64-linux-gnu/libxcb-present.so", - "/lib/x86_64-linux-gnu/libxcb-present.so.0", - "/lib/x86_64-linux-gnu/libxcb-present.so.0.0.0" + "@PREFIX_LIB@/x86_64-linux-gnu/libxcb-present.so", + "@PREFIX_LIB@/x86_64-linux-gnu/libxcb-present.so.0", + "@PREFIX_LIB@/x86_64-linux-gnu/libxcb-present.so.0.0.0" ] }, "xcb-glx": { "Library": "libxcb_glx-guest.so", "Overlay": [ - "/usr/lib/x86_64-linux-gnu/libxcb-glx.so", - "/usr/lib/x86_64-linux-gnu/libxcb-glx.so.0", - "/usr/lib/x86_64-linux-gnu/libxcb-glx.so.0.0.0", - "/usr/local/lib/x86_64-linux-gnu/libxcb-glx.so", - "/usr/local/lib/x86_64-linux-gnu/libxcb-glx.so.0", - "/usr/local/lib/x86_64-linux-gnu/libxcb-glx.so.0.0.0", - "/lib/x86_64-linux-gnu/libxcb-glx.so", - "/lib/x86_64-linux-gnu/libxcb-glx.so.0", - "/lib/x86_64-linux-gnu/libxcb-glx.so.0.0.0" + "@PREFIX_LIB@/x86_64-linux-gnu/libxcb-glx.so", + "@PREFIX_LIB@/x86_64-linux-gnu/libxcb-glx.so.0", + "@PREFIX_LIB@/x86_64-linux-gnu/libxcb-glx.so.0.0.0" ] }, "xshmfence": { "Library": "libshmfence-guest.so", "Overlay": [ - "/usr/lib/x86_64-linux-gnu/libxshmfence.so", - "/usr/lib/x86_64-linux-gnu/libxshmfence.so.1", - "/usr/lib/x86_64-linux-gnu/libxshmfence.so.1.0.0", - "/usr/local/lib/x86_64-linux-gnu/libxshmfence.so", - "/usr/local/lib/x86_64-linux-gnu/libxshmfence.so.1", - "/usr/local/lib/x86_64-linux-gnu/libxshmfence.so.1.0.0", - "/lib/x86_64-linux-gnu/libxshmfence.so", - "/lib/x86_64-linux-gnu/libxshmfence.so.1", - "/lib/x86_64-linux-gnu/libxshmfence.so.1.0.0" + "@PREFIX_LIB@/x86_64-linux-gnu/libxshmfence.so", + "@PREFIX_LIB@/x86_64-linux-gnu/libxshmfence.so.1", + "@PREFIX_LIB@/x86_64-linux-gnu/libxshmfence.so.1.0.0" ] }, "drm": { "Library": "libdrm-guest.so", "Overlay": [ - "/usr/lib/x86_64-linux-gnu/libdrm.so", - "/usr/lib/x86_64-linux-gnu/libdrm.so.2", - "/usr/lib/x86_64-linux-gnu/libdrm.so.2.4.0", - "/usr/local/lib/x86_64-linux-gnu/libdrm.so", - "/usr/local/lib/x86_64-linux-gnu/libdrm.so.2", - "/usr/local/lib/x86_64-linux-gnu/libdrm.so.2.4.0", - "/lib/x86_64-linux-gnu/libdrm.so", - "/lib/x86_64-linux-gnu/libdrm.so.2", - "/lib/x86_64-linux-gnu/libdrm.so.2.4.0" + "@PREFIX_LIB@/x86_64-linux-gnu/libdrm.so", + "@PREFIX_LIB@/x86_64-linux-gnu/libdrm.so.2", + "@PREFIX_LIB@/x86_64-linux-gnu/libdrm.so.2.4.0" ] }, "asound": { "Library": "libasound-guest.so", "Overlay": [ - "/usr/lib/x86_64-linux-gnu/libasound.so", - "/usr/lib/x86_64-linux-gnu/libasound.so.2", - "/usr/lib/x86_64-linux-gnu/libasound.so.2.0.0", - "/usr/local/lib/x86_64-linux-gnu/libasound.so", - "/usr/local/lib/x86_64-linux-gnu/libasound.so.2", - "/usr/local/lib/x86_64-linux-gnu/libasound.so.2.0.0", - "/lib/x86_64-linux-gnu/libasound.so", - "/lib/x86_64-linux-gnu/libasound.so.2", - "/lib/x86_64-linux-gnu/libasound.so.2.0.0" + "@PREFIX_LIB@/x86_64-linux-gnu/libasound.so", + "@PREFIX_LIB@/x86_64-linux-gnu/libasound.so.2", + "@PREFIX_LIB@/x86_64-linux-gnu/libasound.so.2.0.0" ] }, "Xrender": { "Library": "libXrender-guest.so", "Overlay": [ - "/usr/lib/x86_64-linux-gnu/libXrender.so", - "/usr/lib/x86_64-linux-gnu/libXrender.so.1", - "/usr/lib/x86_64-linux-gnu/libXrender.so.1.3.0", - "/usr/local/lib/x86_64-linux-gnu/libXrender.so", - "/usr/local/lib/x86_64-linux-gnu/libXrender.so.1", - "/usr/local/lib/x86_64-linux-gnu/libXrender.so.1.3.0", - "/lib/x86_64-linux-gnu/libXrender.so", - "/lib/x86_64-linux-gnu/libXrender.so.1", - "/lib/x86_64-linux-gnu/libXrender.so.1.3.0" + "@PREFIX_LIB@/x86_64-linux-gnu/libXrender.so", + "@PREFIX_LIB@/x86_64-linux-gnu/libXrender.so.1", + "@PREFIX_LIB@/x86_64-linux-gnu/libXrender.so.1.3.0" ] }, "Xext": { "Library": "libXext-guest.so", "Overlay": [ - "/usr/lib/x86_64-linux-gnu/libXext.so", - "/usr/lib/x86_64-linux-gnu/libXext.so.6", - "/usr/lib/x86_64-linux-gnu/libXext.so.6.4.0", - "/usr/local/lib/x86_64-linux-gnu/libXext.so", - "/usr/local/lib/x86_64-linux-gnu/libXext.so.6", - "/usr/local/lib/x86_64-linux-gnu/libXext.so.6.4.0", - "/lib/x86_64-linux-gnu/libXext.so", - "/lib/x86_64-linux-gnu/libXext.so.6", - "/lib/x86_64-linux-gnu/libXext.so.6.4.0" + "@PREFIX_LIB@/x86_64-linux-gnu/libXext.so", + "@PREFIX_LIB@/x86_64-linux-gnu/libXext.so.6", + "@PREFIX_LIB@/x86_64-linux-gnu/libXext.so.6.4.0" ] }, "Xfixes": { "Library": "libXfixes-guest.so", "Overlay": [ - "/usr/lib/x86_64-linux-gnu/libXfixes.so", - "/usr/lib/x86_64-linux-gnu/libXfixes.so.3", - "/usr/lib/x86_64-linux-gnu/libXfixes.so.3.1.0", - "/usr/local/lib/x86_64-linux-gnu/libXfixes.so", - "/usr/local/lib/x86_64-linux-gnu/libXfixes.so.3", - "/usr/local/lib/x86_64-linux-gnu/libXfixes.so.3.1.0", - "/lib/x86_64-linux-gnu/libXfixes.so", - "/lib/x86_64-linux-gnu/libXfixes.so.3", - "/lib/x86_64-linux-gnu/libXfixes.so.3.1.0" + "@PREFIX_LIB@/x86_64-linux-gnu/libXfixes.so", + "@PREFIX_LIB@/x86_64-linux-gnu/libXfixes.so.3", + "@PREFIX_LIB@/x86_64-linux-gnu/libXfixes.so.3.1.0" ] }, "":{} diff --git a/Source/Tests/LinuxSyscalls/FileManagement.cpp b/Source/Tests/LinuxSyscalls/FileManagement.cpp index cb7620e96..eab1846ad 100644 --- a/Source/Tests/LinuxSyscalls/FileManagement.cpp +++ b/Source/Tests/LinuxSyscalls/FileManagement.cpp @@ -138,13 +138,45 @@ void FileManager::LoadThunkDatabase(bool Global) { } } else if (strcmp(ItemName, "Overlay") == 0) { + + auto AddWithReplacement = [DBObject](json_t const* Value) { + constexpr static std::array Prefixes = { + "/usr/lib", + "/usr/local/lib", + "/lib", + "/usr/lib/pressure-vessel/overrides/lib", + }; + + auto ReplacePrefix = [](std::string_view String, const char *Prefix, const char *NewPrefix) -> std::pair { + auto it = String.find(Prefix); + if (it != String.size()) { + size_t SizeOfOldPrefix = strlen(Prefix); + std::string Replacement {String}; + Replacement.replace(it, SizeOfOldPrefix, NewPrefix); + return std::make_pair(true, std::move(Replacement)); + } + else { + return std::make_pair(false, std::string(String)); + } + }; + + std::string NonModifiedLibraryItem {static_cast(json_getValue(Value))}; + for (auto& prefix : Prefixes) { + auto [has_prefix, modified_library_item] = ReplacePrefix(NonModifiedLibraryItem, "@PREFIX_LIB@", prefix); + DBObject->second.Overlays.emplace_back(std::move(modified_library_item)); + if (!has_prefix) { + break; + } + } + }; + jsonType_t PropertyType = json_getType(LibraryItem); if (PropertyType == JSON_TEXT) { - DBObject->second.Overlays.emplace_back(json_getValue(LibraryItem)); + AddWithReplacement(LibraryItem); } else if (PropertyType == JSON_ARRAY) { for (json_t const* Overlay = json_getChild(LibraryItem); Overlay != nullptr; Overlay = json_getSibling(Overlay)) { - DBObject->second.Overlays.emplace_back(json_getValue(Overlay)); + AddWithReplacement(Overlay); } } }