From 8831c07d2b535c5b72420fed427eef466d76a231 Mon Sep 17 00:00:00 2001 From: Linus Dierheimer Date: Mon, 11 Apr 2022 17:41:21 +0200 Subject: [PATCH] Look for multiple versions of a library --- src/common/library.c | 38 ++++++++++++++++++++++++--- src/common/settings.c | 6 ++--- src/detection/displayserver/wayland.c | 2 +- src/detection/displayserver/xcb.c | 4 +-- src/detection/displayserver/xlib.c | 4 +-- src/detection/media.c | 2 +- src/logo/sixel/im6.c | 2 +- src/logo/sixel/im7.c | 2 +- src/modules/gpu.c | 4 +-- src/modules/packages.c | 2 +- 10 files changed, 48 insertions(+), 18 deletions(-) diff --git a/src/common/library.c b/src/common/library.c index 060af6d3f..8ba62bda0 100644 --- a/src/common/library.c +++ b/src/common/library.c @@ -2,6 +2,33 @@ #include +static void* libraryLoad(const char* path, int maxVersion) +{ + void* result = dlopen(path, RTLD_LAZY); + if(result != NULL) + return result; + + FFstrbuf pathbuf; + ffStrbufInitA(&pathbuf, 64); + ffStrbufAppendS(&pathbuf, path); + ffStrbufAppendC(&pathbuf, '.'); + + for(int i = maxVersion; i >= 0; --i) + { + uint32_t originalLength = pathbuf.length; + ffStrbufAppendF(&pathbuf, "%i", i); + + result = dlopen(pathbuf.chars, RTLD_LAZY); + if(result != NULL) + break; + + ffStrbufSubstrBefore(&pathbuf, originalLength); + } + + ffStrbufDestroy(&pathbuf); + return result; +} + void* ffLibraryLoad(const FFstrbuf* userProvidedName, ...) { if(userProvidedName->length > 0) @@ -11,12 +38,15 @@ void* ffLibraryLoad(const FFstrbuf* userProvidedName, ...) va_start(defaultNames, userProvidedName); void* result = NULL; - const char* name = va_arg(defaultNames, const char*); - while(result == NULL && name != NULL) + while(result == NULL) { - result = dlopen(name, RTLD_LAZY); - name = va_arg(defaultNames, const char*); + const char* path = va_arg(defaultNames, const char*); + if(path == NULL) + break; + + int maxVersion = va_arg(defaultNames, int); + result = libraryLoad(path, maxVersion); } va_end(defaultNames); diff --git a/src/common/settings.c b/src/common/settings.c index 9d571bd2e..d20c0c281 100644 --- a/src/common/settings.c +++ b/src/common/settings.c @@ -80,7 +80,7 @@ typedef struct GSettingsData static const GSettingsData* getGSettingsData(FFinstance* instance) { - FF_LIBRARY_DATA_LOAD_INIT(GSettingsData, instance->config.libGIO, "libgio-2.0.so", "libgio-2.0.so.0"); + FF_LIBRARY_DATA_LOAD_INIT(GSettingsData, instance->config.libGIO, "libgio-2.0.so", 1); FF_LIBRARY_DATA_LOAD_SYMBOL(g_settings_schema_source_lookup) FF_LIBRARY_DATA_LOAD_SYMBOL(g_settings_schema_has_key) @@ -152,7 +152,7 @@ typedef struct DConfData static const DConfData* getDConfData(FFinstance* instance) { - FF_LIBRARY_DATA_LOAD_INIT(DConfData, instance->config.libDConf, "libdconf.so", "libdconf.so.1"); + FF_LIBRARY_DATA_LOAD_INIT(DConfData, instance->config.libDConf, "libdconf.so", 2); FF_LIBRARY_DATA_LOAD_SYMBOL(dconf_client_read_full) FF_LIBRARY_DATA_LOAD_SYMBOL(dconf_client_new) @@ -222,7 +222,7 @@ typedef struct XFConfData static const XFConfData* getXFConfData(FFinstance* instance) { - FF_LIBRARY_DATA_LOAD_INIT(XFConfData, instance->config.libXFConf, "libxfconf-0.so", "libxfconf-0.so.3"); + FF_LIBRARY_DATA_LOAD_INIT(XFConfData, instance->config.libXFConf, "libxfconf-0.so", 4); FF_LIBRARY_DATA_LOAD_SYMBOL(xfconf_channel_get) FF_LIBRARY_DATA_LOAD_SYMBOL(xfconf_channel_has_property) diff --git a/src/detection/displayserver/wayland.c b/src/detection/displayserver/wayland.c index 48ffefb24..c6a7fd858 100644 --- a/src/detection/displayserver/wayland.c +++ b/src/detection/displayserver/wayland.c @@ -78,7 +78,7 @@ void ffdsConnectWayland(const FFinstance* instance, FFDisplayServerResult* resul if(getenv("XDG_RUNTIME_DIR") == NULL) return; - FF_LIBRARY_LOAD(wayland, instance->config.libWayland, , "libwayland-client.so", "libwayland-client.so.0") + FF_LIBRARY_LOAD(wayland, instance->config.libWayland, , "libwayland-client.so", 1) FF_LIBRARY_LOAD_SYMBOL(wayland, wl_display_connect,) FF_LIBRARY_LOAD_SYMBOL(wayland, wl_display_dispatch,) diff --git a/src/detection/displayserver/xcb.c b/src/detection/displayserver/xcb.c index 9165b2059..c723ef531 100644 --- a/src/detection/displayserver/xcb.c +++ b/src/detection/displayserver/xcb.c @@ -89,7 +89,7 @@ static void xcbDetectWMfromEWMH(XcbPropertyData* data, xcb_connection_t* connect void ffdsConnectXcb(const FFinstance* instance, FFDisplayServerResult* result) { - FF_LIBRARY_LOAD(xcb, instance->config.libXcb, , "libxcb.so", "libxcb.so.1") + FF_LIBRARY_LOAD(xcb, instance->config.libXcb, , "libxcb.so", 2) FF_LIBRARY_LOAD_SYMBOL(xcb, xcb_connect,) FF_LIBRARY_LOAD_SYMBOL(xcb, xcb_get_setup,) FF_LIBRARY_LOAD_SYMBOL(xcb, xcb_setup_roots_iterator,) @@ -324,7 +324,7 @@ static void xcbRandrHandleScreen(XcbRandrData* data, xcb_screen_t* screen) void ffdsConnectXcbRandr(const FFinstance* instance, FFDisplayServerResult* result) { - FF_LIBRARY_LOAD(xcbRandr, instance->config.libXcbRandr, , "libxcb-randr.so", "libxcb-randr.so.0") + FF_LIBRARY_LOAD(xcbRandr, instance->config.libXcbRandr, , "libxcb-randr.so", 1) FF_LIBRARY_LOAD_SYMBOL(xcbRandr, xcb_connect,) FF_LIBRARY_LOAD_SYMBOL(xcbRandr, xcb_get_setup,) FF_LIBRARY_LOAD_SYMBOL(xcbRandr, xcb_setup_roots_iterator,) diff --git a/src/detection/displayserver/xlib.c b/src/detection/displayserver/xlib.c index 355e3bd0f..0c860d4db 100644 --- a/src/detection/displayserver/xlib.c +++ b/src/detection/displayserver/xlib.c @@ -53,7 +53,7 @@ static void x11DetectWMFromEWMH(X11PropertyData* data, Display* display, FFDispl void ffdsConnectXlib(const FFinstance* instance, FFDisplayServerResult* result) { - FF_LIBRARY_LOAD(x11, instance->config.libX11, , "libX11.so", "libX11.so.6", "libX11-xcb.so", "libX11-xcb.so.1") + FF_LIBRARY_LOAD(x11, instance->config.libX11, , "libX11.so", 7, "libX11-xcb.so", 2) FF_LIBRARY_LOAD_SYMBOL(x11, XOpenDisplay,) FF_LIBRARY_LOAD_SYMBOL(x11, XCloseDisplay,) @@ -257,7 +257,7 @@ static void xrandrHandleScreen(XrandrData* data, Screen* screen) void ffdsConnectXrandr(const FFinstance* instance, FFDisplayServerResult* result) { - FF_LIBRARY_LOAD(xrandr, instance->config.libXrandr, , "libXrandr.so", "libXrandr.so.2") + FF_LIBRARY_LOAD(xrandr, instance->config.libXrandr, , "libXrandr.so", 3) FF_LIBRARY_LOAD_SYMBOL(xrandr, XOpenDisplay,) FF_LIBRARY_LOAD_SYMBOL(xrandr, XCloseDisplay,) diff --git a/src/detection/media.c b/src/detection/media.c index 8349a2d26..8643ae420 100644 --- a/src/detection/media.c +++ b/src/detection/media.c @@ -285,7 +285,7 @@ static void getMedia(FFinstance* instance, FFMediaResult* result) { DBusData data; - FF_LIBRARY_LOAD(dbus, instance->config.libDBus, , "libdbus-1.so", "libdbus-1.so.3"); + FF_LIBRARY_LOAD(dbus, instance->config.libDBus, , "libdbus-1.so", 4); FF_LIBRARY_LOAD_SYMBOL(dbus, dbus_bus_get,) FF_LIBRARY_LOAD_SYMBOL_ADRESS(dbus, data.ffdbus_message_new_method_call, dbus_message_new_method_call,) FF_LIBRARY_LOAD_SYMBOL_ADRESS(dbus, data.ffdbus_message_iter_init, dbus_message_iter_init,) diff --git a/src/logo/sixel/im6.c b/src/logo/sixel/im6.c index 4a35be4cd..b85720969 100644 --- a/src/logo/sixel/im6.c +++ b/src/logo/sixel/im6.c @@ -20,7 +20,7 @@ static bool logoWriteIM6(void* image, const void* imageInfo, void* exceptionInfo bool ffLogoPrintSixelIM6(FFinstance* instance) { - FF_LIBRARY_LOAD(imageMagick, instance->config.libImageMagick, "libMagickCore-6.Q16HDRI.so", "libMagickCore-6.Q16HDRI.so.6", "libMagickCore-6.Q16.so", "libMagickCore-6.Q16.so.6") + FF_LIBRARY_LOAD(imageMagick, instance->config.libImageMagick, false, "libMagickCore-6.Q16HDRI.so", 8, "libMagickCore-6.Q16.so", 8) FF_LIBRARY_LOAD_SYMBOL_ADRESS(imageMagick, ffResizeImage, ResizeImage, false); FF_LIBRARY_LOAD_SYMBOL_ADRESS(imageMagick, ffWriteImage, WriteImage, false); diff --git a/src/logo/sixel/im7.c b/src/logo/sixel/im7.c index e730675a8..ae8ec61cc 100644 --- a/src/logo/sixel/im7.c +++ b/src/logo/sixel/im7.c @@ -19,7 +19,7 @@ static bool logoWriteIM7(void* image, const void* imageInfo, void* exceptionInfo bool ffLogoPrintSixelIM7(FFinstance* instance) { - FF_LIBRARY_LOAD(imageMagick, instance->config.libImageMagick, "libMagickCore-7.Q16HDRI.so", "libMagickCore-7.Q16HDRI.so.10", "libMagickCore-7.Q16.so", "libMagickCore-7.Q16.so.10") + FF_LIBRARY_LOAD(imageMagick, instance->config.libImageMagick, false, "libMagickCore-7.Q16HDRI.so", 11, "libMagickCore-7.Q16.so", 11) FF_LIBRARY_LOAD_SYMBOL_ADRESS(imageMagick, ffResizeImage, ResizeImage, false); FF_LIBRARY_LOAD_SYMBOL_ADRESS(imageMagick, ffWriteImage, WriteImage, false); diff --git a/src/modules/gpu.c b/src/modules/gpu.c index f60501c2b..a0e30811b 100644 --- a/src/modules/gpu.c +++ b/src/modules/gpu.c @@ -17,7 +17,7 @@ typedef struct GPUResult static void vulkanFillGPUs(FFinstance* instance, FFlist* results) { - FF_LIBRARY_LOAD(vulkan, instance->config.libVulkan, , "libvulkan.so", "libvulkan.so.1") + FF_LIBRARY_LOAD(vulkan, instance->config.libVulkan, , "libvulkan.so", 2) FF_LIBRARY_LOAD_SYMBOL(vulkan, vkCreateInstance,) FF_LIBRARY_LOAD_SYMBOL(vulkan, vkDestroyInstance,) FF_LIBRARY_LOAD_SYMBOL(vulkan, vkEnumeratePhysicalDevices,) @@ -133,7 +133,7 @@ static void pciGetDriver(struct pci_dev* dev, FFstrbuf* driver, char*(*ffpci_get static void pciFillGPUs(FFinstance* instance, FFlist* results) { - FF_LIBRARY_LOAD(pci, instance->config.libPCI, , "libpci.so", "libpci.so.3") + FF_LIBRARY_LOAD(pci, instance->config.libPCI, , "libpci.so", 4) FF_LIBRARY_LOAD_SYMBOL(pci, pci_alloc,) FF_LIBRARY_LOAD_SYMBOL(pci, pci_init,) FF_LIBRARY_LOAD_SYMBOL(pci, pci_scan_bus,) diff --git a/src/modules/packages.c b/src/modules/packages.c index be5d7437b..ce00724a1 100644 --- a/src/modules/packages.c +++ b/src/modules/packages.c @@ -14,7 +14,7 @@ static uint32_t getRpmPackageCount(FFinstance* instance) { - FF_LIBRARY_LOAD(rpm, instance->config.librpm, 0, "librpm.so", "librpm.so.4") + FF_LIBRARY_LOAD(rpm, instance->config.librpm, 0, "librpm.so", 5) FF_LIBRARY_LOAD_SYMBOL(rpm, rpmReadConfigFiles, 0) FF_LIBRARY_LOAD_SYMBOL(rpm, rpmtsCreate, 0) FF_LIBRARY_LOAD_SYMBOL(rpm, rpmtsInitIterator, 0)