]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/dynlib.cpp
wxGetCwd fixed
[wxWidgets.git] / src / common / dynlib.cpp
index 409b45ff4eecb5f3ab79917732e16e4f78973b27..cf218301c29e82f3e3711d9a29c3f8f8a76d4f7c 100644 (file)
   #pragma hdrstop
 #endif  //__BORLANDC__
 
-// TODO should be done by configure
-#if defined(__UNIX__) && !(defined(HAVE_DLOPEN) || defined(HAVE_SHLLOAD))
-    #if defined(__LINUX__) || defined(__SOLARIS__) || defined(__SUNOS__)
-        #ifndef HAVE_DLOPEN
-            #define HAVE_DLOPEN
-        #endif
-    #elif defined(__HPUX__)
-        #ifndef HAVE_SHLLOAD
-            #define HAVE_SHLLOAD
-        #endif
-    #endif // Unix flavour
-#endif // !Unix or already have some HAVE_xxx defined
+#if wxUSE_DYNLIB_CLASS
 
 #include "wx/dynlib.h"
 #include "wx/filefn.h"
 #include "wx/intl.h"
 #include "wx/log.h"
+#include "wx/tokenzr.h"
 
 // ----------------------------------------------------------------------------
 // conditional compilation
     #define wxDllOpen(lib)                dlopen(lib, RTLD_LAZY)
     #define wxDllGetSymbol(handle, name)  dlsym(handle, (char *)name)
     #define wxDllClose                    dlclose
-#elif defined(HAVE_SHLLOAD)
-    #define wxDllOpen(lib)                shl_open(lib, BIND_DEFERRED, 0)
+#elif defined(HAVE_SHL_LOAD)
+    #define wxDllOpen(lib)                shl_load(lib, BIND_DEFERRED, 0)
     #define wxDllClose      shl_unload
 
-    static inline void *wxDllGetSymbol(shl_t *handle, const char *name)
+    static inline void *wxDllGetSymbol(shl_t handle, const char *name)
     {
         void *sym;
-        if ( shl_findsym(handle, name, TYPE_UNDEFINED, &sym) == 0 )
+        if ( shl_findsym(&handle, name, TYPE_UNDEFINED, &sym) == 0 )
             return sym;
         else
             return (void *)0;
     }
 #elif defined(__WINDOWS__)
-    #define wxDllOpen(lib)                  ::LoadLibrary(lib)
+    #include <windows.h>
+
+    // using LoadLibraryEx under Win32 to avoid name clash with LoadLibrary
+    #ifdef __WIN32__
+        #define wxDllOpen(lib)                  ::LoadLibraryEx(lib, 0, 0)
+    #else   // Win16
+        #define wxDllOpen(lib)                  ::LoadLibrary(lib)
+    #endif  // Win32/16
     #define wxDllGetSymbol(handle, name)    ::GetProcAddress(handle, name)
     #define wxDllClose                      ::FreeLibrary
 #else
@@ -90,7 +87,11 @@ static wxString ConstructLibraryName(const wxString& basename)
     wxString fullname(basename);
 
 #if defined(__UNIX__)
-    fullname << ".so";
+    #if defined(__HPUX__)
+        fullname << ".sl";
+    #else      //__HPUX__
+        fullname << ".so";
+    #endif     //__HPUX__
 #elif defined(__WINDOWS__)
     fullname << ".dll";
 #endif
@@ -228,11 +229,30 @@ wxLibrary *wxLibraries::LoadLibrary(const wxString& name)
     wxString lib_name = ConstructLibraryName(name);
 
 #if defined(__UNIX__)
-    // TODO use LD_LIBRARY_PATH!
-    lib_name.Prepend("/lib");
+    // found the first file in LD_LIBRARY_PATH with this name
+    wxString libPath("/lib:/usr/lib"); // system path first
+    const char *envLibPath = getenv("LD_LIBRARY_PATH");
+    if ( envLibPath )
+        libPath << ':' << envLibPath;
+    wxStringTokenizer tokenizer(libPath, ':');
+    while ( tokenizer.HasMoreToken() )
+    {
+        wxString fullname(tokenizer.NextToken());
+
+        fullname << '/' << lib_name;
+        if ( wxFileExists(fullname) )
+        {
+            lib_name = fullname;
+
+            // found the library
+            break;
+        }
+    }
+    //else: not found in the path, leave the name as is (secutiry risk?)
+
 #endif // __UNIX__
 
-    wxDllType handle ;
+    wxDllType handle;
 
 #if defined(__WXMAC__)
     FSSpec myFSSpec ;
@@ -282,3 +302,5 @@ wxObject *wxLibraries::CreateObject(const wxString& path)
     }
     return NULL;
 }
+
+#endif // wxUSE_DYNLIB_CLASS