This code is copied nearly verbatim from src/loader/loader.c. It should be put somewhere so both files can reference the same code without copy & pasting.
Signed-off-by: Jonny Lamb <jonny.l...@collabora.co.uk> --- src/egl/main/egldevice.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/src/egl/main/egldevice.c b/src/egl/main/egldevice.c index c5c8e94..c79daff 100644 --- a/src/egl/main/egldevice.c +++ b/src/egl/main/egldevice.c @@ -26,8 +26,14 @@ **************************************************************************/ +#ifdef HAVE_LIBUDEV +#include <dlfcn.h> +#include <libudev.h> +#endif + #include "egldevice.h" #include "eglglobals.h" +#include "egllog.h" #include "egltypedefs.h" @@ -62,6 +68,54 @@ out: return info; } +/* TODO: this is all copied from loader.c. it should probably be put somewhere + * common so both there and here can use the same source. also, if it remains + * here, it needs a mutex.*/ +#ifdef HAVE_LIBUDEV + +static void *udev_handle = NULL; + +static void * +udev_dlopen_handle(void) +{ + if (!udev_handle) { + udev_handle = dlopen("libudev.so.1", RTLD_LOCAL | RTLD_LAZY); + + if (!udev_handle) { + /* libudev.so.1 changed the return types of the two unref functions + * from voids to pointers. We don't use those return values, and the + * only ABI I've heard that cares about this kind of change (calling + * a function with a void * return that actually only returns void) + * might be ia64. + */ + udev_handle = dlopen("libudev.so.0", RTLD_LOCAL | RTLD_LAZY); + + if (!udev_handle) { + _eglLog(_EGL_WARNING, "Couldn't dlopen libudev.so.1 or " + "libudev.so.0, device detection may be broken.\n"); + } + } + } + + return udev_handle; +} + +static int dlsym_failed = 0; + +static void * +checked_dlsym(void *dlopen_handle, const char *name) +{ + void *result = dlsym(dlopen_handle, name); + if (!result) + dlsym_failed = 1; + return result; +} + +#define UDEV_SYMBOL(ret, name, args) \ + ret (*name) args = checked_dlsym(udev_dlopen_handle(), #name); + +#endif /* HAVE_LIBUDEV */ + /** * Finish device management. */ -- 2.4.6 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev