#ifdef WANT_DLL #ifdef NO_DLFCN_H # include "../compat/dlfcn.h" #else #if defined(__osf1__) #include <loader.h> #elif defined(HPUX) #include <dl.h> #else # include <dlfcn.h> #endif #endif #ifndef RTLD_NOW # define RTLD_NOW 1 #endif #ifndef RTLD_GLOBAL # define RTLD_GLOBAL 0 #endif extern IrcCommandDll *dll_commands; typedef int (Irc_PackageInitProc) _((IrcCommandDll **interp)); typedef struct _package_installed { struct _package_installed *next; char *name; } Packages; Packages *install_pack = NULL; void dll_load _((char *command, char *args, char *subargs)) { #if defined(__osf__) /* OSF /1 1.0/1.1/1.2 and related systems */ ldr_module_t lm; #elif defined(HPUX) /* HP machines */ shl_t handle; #else /* linux SunOS AIX etc */ void *handle = NULL; #endif char *filename = NULL; Irc_PackageInitProc *proc1Ptr; char *p, *procname = NULL; int code = 0; if (command) { if (install_pack) { Packages *pkg = install_pack; bitchsay("DLL packages installed"); for ( ; pkg; pkg = pkg->next) put_it("DLL %s", pkg->name); } else bitchsay("No dll's loaded"); return; } if (!args || !*args) { userage("LoadDll", "filename.so"); return; } filename = next_arg(args, &args); #if defined(__osf__) if ((lm = (Tcl_PackageInitProc *) load(fileName, LDR_NOFLAGS)) == LDR_NULL_MODULE) { return; } #elif defined(HPUX) if ((handle = shl_load(filename, BIND_IMMEDIATE, 0L)) == NULL) { return; } #else handle = dlopen(filename, RTLD_NOW | RTLD_GLOBAL); if (handle == NULL) { bitchsay("couldn't load file: %s %s", filename, dlerror()); return; } #endif if ((p = strrchr(filename, '/'))) p++; else p = filename; procname = m_strdup(p); if ((p = strchr(procname, '.'))) *p = 0; p = procname; *p = toupper(*p); p++; while (*p) { *p = tolower(*p++); } malloc_strcat(&procname, "_Init"); if (!procname) return; if (!find_in_list((List **)&install_pack, procname, 0)) { #if defined(__osf__) /* OSF1 */ *proc1Ptr = ldr_lookup_package(pkg, procname); code = (proc1Ptr)(&dll_commands); #elif defined(HPUX) /* HPUX */ if (shl_findsym(&handle, procname, (short) TYPE_PROCEDURE, (void *) proc1Ptr)) code = (proc1Ptr)(&dll_commands); #else if (!(proc1Ptr = (Irc_PackageInitProc *) dlsym(handle, (char *) procname))) bitchsay("UnSuccessful load"); else code = (proc1Ptr)(&dll_commands); #endif if (!code && proc1Ptr) { Packages *new; new = (Packages *) new_malloc(sizeof(Packages)); new->name = m_strdup(procname); add_to_list((List **)&install_pack, (List *)new); } else if (code) bitchsay("Error initiliziing dll"); } else bitchsay("Package Already installed"); new_free(&procname); } #endif