|
|
@@ -319,7 +319,112 @@ const char* DynamicLoader::LastError()
|
|
|
#endif //_WIN32
|
|
|
|
|
|
// ---------------------------------------------------------------
|
|
|
-// 4. Implementation for default UNIX machines.
|
|
|
+// 4. Implementation for BeOS
|
|
|
+#ifdef __BEOS__
|
|
|
+#include <string.h> // for strerror()
|
|
|
+#include <be/kernel/image.h>
|
|
|
+#include <be/support/Errors.h>
|
|
|
+#define DYNAMICLOADER_DEFINED 1
|
|
|
+
|
|
|
+namespace KWSYS_NAMESPACE
|
|
|
+{
|
|
|
+
|
|
|
+static image_id last_dynamic_err = B_OK;
|
|
|
+
|
|
|
+//----------------------------------------------------------------------------
|
|
|
+DynamicLoader::LibraryHandle DynamicLoader::OpenLibrary(const char* libname )
|
|
|
+{
|
|
|
+ // image_id's are integers, errors are negative. Add one just in case we
|
|
|
+ // get a valid image_id of zero (is that even possible?).
|
|
|
+ image_id rc = load_add_on(libname);
|
|
|
+ if (rc < 0)
|
|
|
+ {
|
|
|
+ last_dynamic_err = rc;
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ return rc+1;
|
|
|
+}
|
|
|
+
|
|
|
+//----------------------------------------------------------------------------
|
|
|
+int DynamicLoader::CloseLibrary(DynamicLoader::LibraryHandle lib)
|
|
|
+{
|
|
|
+ if (!lib)
|
|
|
+ {
|
|
|
+ last_dynamic_err = B_BAD_VALUE;
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ // The function dlclose() returns 0 on success, and non-zero on error.
|
|
|
+ status_t rc = unload_add_on(lib-1);
|
|
|
+ if (rc != B_OK)
|
|
|
+ {
|
|
|
+ last_dynamic_err = rc;
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+
|
|
|
+//----------------------------------------------------------------------------
|
|
|
+DynamicLoader::SymbolPointer DynamicLoader::GetSymbolAddress(
|
|
|
+ DynamicLoader::LibraryHandle lib, const char* sym)
|
|
|
+{
|
|
|
+ // Hack to cast pointer-to-data to pointer-to-function.
|
|
|
+ union
|
|
|
+ {
|
|
|
+ void* pvoid;
|
|
|
+ DynamicLoader::SymbolPointer psym;
|
|
|
+ } result;
|
|
|
+
|
|
|
+ result.psym = NULL;
|
|
|
+
|
|
|
+ if (!lib)
|
|
|
+ {
|
|
|
+ last_dynamic_err = B_BAD_VALUE;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ // !!! FIXME: BeOS can do function-only lookups...does this ever
|
|
|
+ // !!! FIXME: actually _want_ a data symbol lookup, or was this union
|
|
|
+ // !!! FIXME: a leftover of dlsym()? (s/ANY/TEXT for functions only).
|
|
|
+ status_t rc = get_image_symbol(lib-1,sym,B_SYMBOL_TYPE_ANY,&result.pvoid);
|
|
|
+ if (rc != B_OK)
|
|
|
+ {
|
|
|
+ last_dynamic_err = rc;
|
|
|
+ result.psym = NULL;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return result.psym;
|
|
|
+}
|
|
|
+
|
|
|
+//----------------------------------------------------------------------------
|
|
|
+const char* DynamicLoader::LibPrefix()
|
|
|
+{
|
|
|
+ return "lib";
|
|
|
+}
|
|
|
+
|
|
|
+//----------------------------------------------------------------------------
|
|
|
+const char* DynamicLoader::LibExtension()
|
|
|
+{
|
|
|
+ return ".so";
|
|
|
+}
|
|
|
+
|
|
|
+//----------------------------------------------------------------------------
|
|
|
+const char* DynamicLoader::LastError()
|
|
|
+{
|
|
|
+ const char *retval = strerror(last_dynamic_err);
|
|
|
+ last_dynamic_err = B_OK;
|
|
|
+ return retval;
|
|
|
+}
|
|
|
+
|
|
|
+} // namespace KWSYS_NAMESPACE
|
|
|
+#endif
|
|
|
+
|
|
|
+// ---------------------------------------------------------------
|
|
|
+// 5. Implementation for default UNIX machines.
|
|
|
// if nothing has been defined then use this
|
|
|
#ifndef DYNAMICLOADER_DEFINED
|
|
|
#define DYNAMICLOADER_DEFINED 1
|