]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
More hacks to make dlopen() work natively
authorAlan T. DeKok <aland@freeradius.org>
Sun, 19 Jun 2011 08:37:44 +0000 (10:37 +0200)
committerAlan T. DeKok <aland@freeradius.org>
Sun, 19 Jun 2011 08:37:44 +0000 (10:37 +0200)
src/include/modpriv.h
src/main/modules.c

index 43a414d29a07744a1e5a0f89daeaa3192b6a0f61..b00d3ad8dec78a4dbe7b27f16a690cc25d9dcb6e 100644 (file)
@@ -26,13 +26,13 @@ extern "C" {
 #ifdef WITHOUT_LIBLTDL
 typedef void *lt_dlhandle;
 
+int lt_dlinit(void);
 lt_dlhandle lt_dlopenext(const char *name);
 void *lt_dlsym(lt_dlhandle handle, const char *symbol);
 int lt_dlclose(lt_dlhandle handle);
 const char *lt_dlerror(void);
 
 #define LTDL_SET_PRELOADED_SYMBOLS(_x)
-#define lt_dlinit(_x) (0)
 #define lt_dlexit(_x)
 #define lt_dlsetsearchpath(_x)
 #endif
index 18a1b29026dc2dacb5bb4e8228d8a106ab336023..ab3e61263a1dd3061ce26a34eb869d2458b6ba3b 100644 (file)
@@ -107,17 +107,46 @@ static const section_type_value_t section_type_value[RLM_COMPONENT_COUNT] = {
 #define fr_dlopenext lt_dlopenext
 #ifndef LT_SHREXT
 #ifdef __APPLE__
-#define LT_SHREXT ".so"
+#define LT_SHREXT ".dylib"
+#define LD_LIBRARY_PATH "DYLD_FALLBACK_LIBRARY_PATH"
 #elif defined (WIN32)
 #define LT_SHREXT ".dll"
 #else
-#define LT_SHREXT ".dylib"
+#define LT_SHREXT ".so"
+#define LD_LIBRARY_PATH "LD_LIBRARY_PATH"
 #endif
 #endif
 
+int lt_dlinit(void)
+{
+       char *p, *val;
+       char buffer[1024];
+
+       /*
+        *      This doesn't really do anything...
+        */
+       p = getenv(LD_LIBRARY_PATH);
+       if (p) {
+               snprintf(buffer, sizeof(buffer), "%s:%s", p, radlib_dir);
+               val = buffer;
+       } else {
+               val = radlib_dir;
+       }
+
+       return setenv(LD_LIBRARY_PATH, val, 1);
+}
+
 lt_dlhandle lt_dlopenext(const char *name)
 {
-       char buffer[256];
+       void *handle;
+       char buffer[2048];
+
+       /*
+        *      Prefer loading our libraries by absolute path.
+        */
+       snprintf(buffer, sizeof(buffer), "%s/%s%s", radlib_dir, name, LT_SHREXT);
+       handle = dlopen(buffer, RTLD_NOW | RTLD_LOCAL);
+       if (handle) return handle;
 
        strlcpy(buffer, name, sizeof(buffer));