Sophie

Sophie

distrib > Mageia > 5 > i586 > media > core-release > by-pkgid > fff2921ff40d1f832561027dc17323f5 > files > 28

epic5-1.1.9-3.mga5.i586.rpm

#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