New build path variable
[freeradius.git] / libltdl / ltdl.c
index b2bc220..7972d53 100644 (file)
@@ -2183,7 +2183,8 @@ static    int     trim                  LT_PARAMS((char **dest,
 static int     try_dlopen            LT_PARAMS((lt_dlhandle *handle,
                                                 const char *filename));
 static int     tryall_dlopen         LT_PARAMS((lt_dlhandle *handle,
-                                                const char *filename));
+                                                const char *filename,
+                                                const char * useloader));
 static int     unload_deplibs        LT_PARAMS((lt_dlhandle handle));
 static int     lt_argz_insert        LT_PARAMS((char **pargz,
                                                 size_t *pargz_len,
@@ -2371,9 +2372,10 @@ lt_dlexit ()
 }
 
 static int
-tryall_dlopen (handle, filename)
+tryall_dlopen (handle, filename, useloader)
      lt_dlhandle *handle;
      const char *filename;
+     const char *useloader;
 {
   lt_dlhandle   cur;
   lt_dlloader   *loader;
@@ -2440,6 +2442,11 @@ tryall_dlopen (handle, filename)
 
   while (loader)
     {
+      if (useloader && strcmp(loader->loader_name, useloader))
+       {
+         loader = loader->next;
+         continue;
+       }
       lt_user_data data = loader->dlloader_data;
 
       cur->module = loader->module_open (data, filename);
@@ -2509,7 +2516,7 @@ tryall_dlopen_module (handle, prefix, dirname, dlname)
       error += tryall_dlopen_module (handle,
                                     (const char *) 0, prefix, filename);
     }
-  else if (tryall_dlopen (handle, filename) != 0)
+  else if (tryall_dlopen (handle, filename, NULL) != 0)
     {
       ++error;
     }
@@ -2530,7 +2537,7 @@ find_module (handle, dir, libdir, dlname, old_name, installed)
   /* Try to open the old library first; if it was dlpreopened,
      we want the preopened version of it, even if a dlopenable
      module is available.  */
-  if (old_name && tryall_dlopen (handle, old_name) == 0)
+  if (old_name && tryall_dlopen (handle, old_name, "dlpreload") == 0)
     {
       return 0;
     }
@@ -2794,7 +2801,7 @@ find_handle_callback (filename, data, ignored)
 
   /* Try to dlopen the file, but do not continue searching in any
      case.  */
-  if (tryall_dlopen (handle, filename) != 0)
+  if (tryall_dlopen (handle, filename,NULL) != 0)
     *handle = 0;
 
   return 1;
@@ -3064,7 +3071,6 @@ try_dlopen (phandle, filename)
   char *       name            = 0;
   int          errors          = 0;
   lt_dlhandle  newhandle;
-  int          free_base_name  = 0;
 
   assert (phandle);
   assert (*phandle == 0);
@@ -3084,7 +3090,7 @@ try_dlopen (phandle, filename)
       /* lt_dlclose()ing yourself is very bad!  Disallow it.  */
       LT_DLSET_FLAG (*phandle, LT_DLRESIDENT_FLAG);
 
-      if (tryall_dlopen (&newhandle, 0) != 0)
+      if (tryall_dlopen (&newhandle, 0, NULL) != 0)
        {
          LT_DLFREE (*phandle);
          return 1;
@@ -3122,10 +3128,8 @@ try_dlopen (phandle, filename)
 
       ++base_name;
     }
-  else {
+  else
     base_name = canonical;
-    free_base_name = 1;
-  }
 
   assert (base_name && *base_name);
 
@@ -3208,7 +3212,7 @@ try_dlopen (phandle, filename)
            }
 #endif
        }
-      if (!file)
+      else
        {
          file = fopen (filename, LT_READTEXT_MODE);
        }
@@ -3392,7 +3396,7 @@ try_dlopen (phandle, filename)
 #endif
                   )))
        {
-          if (tryall_dlopen (&newhandle, filename) != 0)
+          if (tryall_dlopen (&newhandle, filename, NULL) != 0)
             {
               newhandle = NULL;
             }
@@ -3426,7 +3430,6 @@ try_dlopen (phandle, filename)
   LT_DLFREE (dir);
   LT_DLFREE (name);
   LT_DLFREE (canonical);
-  if (free_base_name) LT_DLFREE (base_name);
 
   return errors;
 }
@@ -3506,6 +3509,10 @@ lt_dlopenext (filename)
     LT_DLMUTEX_SETERROR (LT_DLSTRERROR (FR_DEPLIB));
     return 0;  /* leaks tmp and handle */
   }
+  if (handle && errors) {
+    LT_DLMUTEX_SETERROR (LT_DLSTRERROR (FR_DEPLIB));
+    return 0;  /* leaks tmp and handle */
+  }
 
   /* If we found FILENAME, stop searching -- whether we were able to
      load the file as a module or not.  If the file exists but loading
@@ -3532,6 +3539,10 @@ lt_dlopenext (filename)
   else
     {
       tmp[len] = LT_EOS_CHAR;
+  if (handle && errors) {
+    LT_DLMUTEX_SETERROR (LT_DLSTRERROR (FR_DEPLIB));
+    return 0;  /* leaks tmp and handle */
+  }
     }
 
   strcat(tmp, shlib_ext);