diff --git a/include/modules.h b/include/modules.h
index 66356234e..b99b5f8eb 100644
--- a/include/modules.h
+++ b/include/modules.h
@@ -32,12 +32,7 @@
#define MAPI_RATBOX 1
-#if defined(HAVE_SHL_LOAD)
-#include
-#endif
-#if !defined(STATIC_MODULES) && defined(HAVE_DLFCN_H)
-#include
-#endif
+#include
#include "msg.h"
#include "hook.h"
@@ -46,7 +41,7 @@ struct module
{
char *name;
const char *version;
- void *address;
+ lt_dlhandle address;
int core;
int mapi_version;
void * mapi_header; /* actually struct mapi_mheader_av */
diff --git a/src/modules.c b/src/modules.c
index 85da9f098..35cf39340 100644
--- a/src/modules.c
+++ b/src/modules.c
@@ -42,6 +42,8 @@
#ifndef STATIC_MODULES
+#include
+
struct module **modlist = NULL;
static const char *core_module_table[] = {
@@ -101,6 +103,12 @@ struct Message modrestart_msgtab = {
void
modules_init(void)
{
+ if(lt_dlinit())
+ {
+ ilog(L_MAIN, "lt_dlinit failed");
+ exit(0);
+ }
+
mod_add_cmd(&modload_msgtab);
mod_add_cmd(&modunload_msgtab);
mod_add_cmd(&modreload_msgtab);
@@ -515,152 +523,6 @@ static void increase_modlist(void);
static char unknown_ver[] = "";
-/* This file contains the core functions to use dynamic libraries.
- * -TimeMr14C
- */
-
-
-#ifdef HAVE_MACH_O_DYLD_H
-/*
-** jmallett's dl*(3) shims for NSModule(3) systems.
-*/
-#include
-
-#ifndef HAVE_DLOPEN
-#ifndef RTLD_LAZY
-#define RTLD_LAZY 2185 /* built-in dl*(3) don't care */
-#endif
-
-void undefinedErrorHandler(const char *);
-NSModule multipleErrorHandler(NSSymbol, NSModule, NSModule);
-void linkEditErrorHandler(NSLinkEditErrors, int, const char *, const char *);
-char *dlerror(void);
-void *dlopen(char *, int);
-int dlclose(void *);
-void *dlsym(void *, char *);
-
-static int firstLoad = TRUE;
-static int myDlError;
-static char *myErrorTable[] = { "Loading file as object failed\n",
- "Loading file as object succeeded\n",
- "Not a valid shared object\n",
- "Architecture of object invalid on this architecture\n",
- "Invalid or corrupt image\n",
- "Could not access object\n",
- "NSCreateObjectFileImageFromFile failed\n",
- NULL
-};
-
-void
-undefinedErrorHandler(const char *symbolName)
-{
- sendto_realops_snomask(SNO_GENERAL, L_ALL, "Undefined symbol: %s", symbolName);
- ilog(L_MAIN, "Undefined symbol: %s", symbolName);
- return;
-}
-
-NSModule
-multipleErrorHandler(NSSymbol s, NSModule old, NSModule new)
-{
- /* XXX
- ** This results in substantial leaking of memory... Should free one
- ** module, maybe?
- */
- sendto_realops_snomask(SNO_GENERAL, L_ALL,
- "Symbol `%s' found in `%s' and `%s'",
- NSNameOfSymbol(s), NSNameOfModule(old), NSNameOfModule(new));
- ilog(L_MAIN, "Symbol `%s' found in `%s' and `%s'",
- NSNameOfSymbol(s), NSNameOfModule(old), NSNameOfModule(new));
- /* We return which module should be considered valid, I believe */
- return new;
-}
-
-void
-linkEditErrorHandler(NSLinkEditErrors errorClass, int errnum,
- const char *fileName, const char *errorString)
-{
- sendto_realops_snomask(SNO_GENERAL, L_ALL,
- "Link editor error: %s for %s", errorString, fileName);
- ilog(L_MAIN, "Link editor error: %s for %s", errorString, fileName);
- return;
-}
-
-char *
-dlerror(void)
-{
- return myDlError == NSObjectFileImageSuccess ? NULL : myErrorTable[myDlError % 7];
-}
-
-void *
-dlopen(char *filename, int unused)
-{
- NSObjectFileImage myImage;
- NSModule myModule;
-
- if(firstLoad)
- {
- /*
- ** If we are loading our first symbol (huzzah!) we should go ahead
- ** and install link editor error handling!
- */
- NSLinkEditErrorHandlers linkEditorErrorHandlers;
-
- linkEditorErrorHandlers.undefined = undefinedErrorHandler;
- linkEditorErrorHandlers.multiple = multipleErrorHandler;
- linkEditorErrorHandlers.linkEdit = linkEditErrorHandler;
- NSInstallLinkEditErrorHandlers(&linkEditorErrorHandlers);
- firstLoad = FALSE;
- }
- myDlError = NSCreateObjectFileImageFromFile(filename, &myImage);
- if(myDlError != NSObjectFileImageSuccess)
- {
- return NULL;
- }
- myModule = NSLinkModule(myImage, filename, NSLINKMODULE_OPTION_PRIVATE);
- return (void *) myModule;
-}
-
-int
-dlclose(void *myModule)
-{
- NSUnLinkModule(myModule, FALSE);
- return 0;
-}
-
-void *
-dlsym(void *myModule, char *mySymbolName)
-{
- NSSymbol mySymbol;
-
- mySymbol = NSLookupSymbolInModule((NSModule) myModule, mySymbolName);
- return NSAddressOfSymbol(mySymbol);
-}
-#endif
-#endif
-
-
-/*
- * HPUX dl compat functions
- */
-#if defined(HAVE_SHL_LOAD) && !defined(HAVE_DLOPEN)
-#define RTLD_LAZY BIND_DEFERRED
-#define RTLD_GLOBAL DYNAMIC_PATH
-#define dlopen(file,mode) (void *)shl_load((file), (mode), (long) 0)
-#define dlclose(handle) shl_unload((shl_t)(handle))
-#define dlsym(handle,name) hpux_dlsym(handle,name)
-#define dlerror() strerror(errno)
-
-static void *
-hpux_dlsym(void *handle, char *name)
-{
- void *sym_addr;
- if(!shl_findsym((shl_t *) & handle, name, TYPE_UNDEFINED, &sym_addr))
- return sym_addr;
- return NULL;
-}
-
-#endif
-
/* unload_one_module()
*
* inputs - name of module to unload
@@ -722,7 +584,7 @@ unload_one_module(const char *name, int warn)
break;
}
- dlclose(modlist[modindex]->address);
+ lt_dlclose(modlist[modindex]->address);
rb_free(modlist[modindex]->name);
memmove(&modlist[modindex], &modlist[modindex + 1],
@@ -751,8 +613,7 @@ unload_one_module(const char *name, int warn)
int
load_a_module(const char *path, int warn, int core)
{
- void *tmpptr = NULL;
-
+ lt_dlhandle tmpptr;
char *mod_basename;
const char *ver;
@@ -760,15 +621,11 @@ load_a_module(const char *path, int warn, int core)
mod_basename = rb_basename(path);
-#ifdef CHARYBDIS_PROFILE
- tmpptr = dlopen(path, RTLD_NOW | RTLD_LOCAL | RTLD_PROFILE);
-#else
- tmpptr = dlopen(path, RTLD_NOW | RTLD_LOCAL);
-#endif
+ tmpptr = lt_dlopen(path);
if(tmpptr == NULL)
{
- const char *err = dlerror();
+ const char *err = lt_dlerror();
sendto_realops_snomask(SNO_GENERAL, L_ALL,
"Error loading module %s: %s", mod_basename, err);
@@ -784,16 +641,16 @@ load_a_module(const char *path, int warn, int core)
* as a single int in order to determine the API version.
* -larne.
*/
- mapi_version = (int *) (uintptr_t) dlsym(tmpptr, "_mheader");
+ mapi_version = (int *) (uintptr_t) lt_dlsym(tmpptr, "_mheader");
if((mapi_version == NULL
- && (mapi_version = (int *) (uintptr_t) dlsym(tmpptr, "__mheader")) == NULL)
+ && (mapi_version = (int *) (uintptr_t) lt_dlsym(tmpptr, "__mheader")) == NULL)
|| MAPI_MAGIC(*mapi_version) != MAPI_MAGIC_HDR)
{
sendto_realops_snomask(SNO_GENERAL, L_ALL,
"Data format error: module %s has no MAPI header.",
mod_basename);
ilog(L_MAIN, "Data format error: module %s has no MAPI header.", mod_basename);
- (void) dlclose(tmpptr);
+ (void) lt_dlclose(tmpptr);
rb_free(mod_basename);
return -1;
}
@@ -810,7 +667,7 @@ load_a_module(const char *path, int warn, int core)
sendto_realops_snomask(SNO_GENERAL, L_ALL,
"Module %s indicated failure during load.",
mod_basename);
- dlclose(tmpptr);
+ lt_dlclose(tmpptr);
rb_free(mod_basename);
return -1;
}
@@ -845,7 +702,7 @@ load_a_module(const char *path, int warn, int core)
sendto_realops_snomask(SNO_GENERAL, L_ALL,
"Module %s has unknown/unsupported MAPI version %d.",
mod_basename, *mapi_version);
- dlclose(tmpptr);
+ lt_dlclose(tmpptr);
rb_free(mod_basename);
return -1;
}