ca74dd | 1996-10-08 | Fredrik Hübinette (Hubbe) | | #include "global.h"
|
2631a6 | 1996-10-09 | Fredrik Hübinette (Hubbe) | | #if !defined(HAVE_DLSYM) || !defined(HAVE_DLOPEN)
|
ca74dd | 1996-10-08 | Fredrik Hübinette (Hubbe) | | #undef HAVE_DLOPEN
#endif
|
786003 | 1997-01-22 | Bernhard Fastenrath | | #if !defined(HAVE_DLOPEN) && defined(HAVE_DLD_LINK) && defined(HAVE_DLD_GET_FUNC)
#define USE_DLD
#endif
|
6cf83a | 1997-02-06 | Fredrik Hübinette (Hubbe) | | #if 1
|
368fe7 | 1997-01-26 | Fredrik Hübinette (Hubbe) | |
|
786003 | 1997-01-22 | Bernhard Fastenrath | | #if defined(HAVE_DLOPEN) || defined(USE_DLD)
|
ca74dd | 1996-10-08 | Fredrik Hübinette (Hubbe) | | #include "interpret.h"
#include "constants.h"
#include "error.h"
#include "module.h"
#include "stralloc.h"
#include "macros.h"
|
2631a6 | 1996-10-09 | Fredrik Hübinette (Hubbe) | |
#ifdef HAVE_DLFCN_H
|
ca74dd | 1996-10-08 | Fredrik Hübinette (Hubbe) | | #include <dlfcn.h>
|
2631a6 | 1996-10-09 | Fredrik Hübinette (Hubbe) | | #endif
|
ca74dd | 1996-10-08 | Fredrik Hübinette (Hubbe) | |
|
786003 | 1997-01-22 | Bernhard Fastenrath | | #ifdef HAVE_DLD_H
#include <dld.h>
#endif
|
6cf83a | 1997-02-06 | Fredrik Hübinette (Hubbe) | | typedef void (*modfun)(void);
|
ca74dd | 1996-10-08 | Fredrik Hübinette (Hubbe) | | struct module_list
{
struct module_list * next;
|
368fe7 | 1997-01-26 | Fredrik Hübinette (Hubbe) | | void *module;
|
6cf83a | 1997-02-06 | Fredrik Hübinette (Hubbe) | | modfun init, exit;
|
368fe7 | 1997-01-26 | Fredrik Hübinette (Hubbe) | | };
struct module_list *dynamic_module_list = 0;
void f_load_module(INT32 args)
{
|
ca74dd | 1996-10-08 | Fredrik Hübinette (Hubbe) | | void *module;
|
6cf83a | 1997-02-06 | Fredrik Hübinette (Hubbe) | | modfun init, exit;
|
368fe7 | 1997-01-26 | Fredrik Hübinette (Hubbe) | | struct module_list *new_module;
const char *module_name;
if(sp[-args].type != T_STRING)
error("Bad argument 1 to load_module()\n");
module_name = sp[-args].u.string->str;
#ifdef HAVE_DLOPEN
#ifndef RTLD_NOW
#define RTLD_NOW 0
#endif
module=dlopen(module_name, RTLD_NOW);
if(!module)
{
error("load_module(\"%s\") failed: %s\n",
sp[-args].u.string->str, dlerror());
}
#elif defined(USE_DLD)
dld_create_reference("pike_module_init");
if (dld_link(module_name)) {
error("load_module(\"%s\") failed: %s\n",
module_name, dld_strerror(dld_errno));
}
module=strdup(module_name);
#endif /* HAVE_DLOPEN */
#ifdef HAVE_DLOPEN
|
6cf83a | 1997-02-06 | Fredrik Hübinette (Hubbe) | | init=(modfun)dlsym(module, "pike_module_init");
|
fb84a7 | 1997-03-04 | Henrik Grubbström (Grubba) | | if (!init) {
init=(modfun)dlsym(module, "_pike_module_init");
}
|
6cf83a | 1997-02-06 | Fredrik Hübinette (Hubbe) | | exit=(modfun)dlsym(module, "pike_module_exit");
|
fb84a7 | 1997-03-04 | Henrik Grubbström (Grubba) | | if (!exit) {
exit=(modfun)dlsym(module, "_pike_module_exit");
}
|
368fe7 | 1997-01-26 | Fredrik Hübinette (Hubbe) | |
#elif defined(USE_DLD)
|
6cf83a | 1997-02-06 | Fredrik Hübinette (Hubbe) | | init = (modfun)dld_get_func("pike_module_init");
exit = (modfun)dld_get_func("pike_module_exit");
|
368fe7 | 1997-01-26 | Fredrik Hübinette (Hubbe) | | #endif /* HAVE_DLOPEN */
if(!init || !exit)
{
#ifdef HAVE_DLOPEN
dlclose(module);
#elif defined(USE_DLD)
dld_unlink_by_file((char *)module);
free(module);
#endif
|
24697f | 1997-03-12 | Henrik Grubbström (Grubba) | | error("Failed to initialize module \"%s\".\n", module_name);
|
368fe7 | 1997-01-26 | Fredrik Hübinette (Hubbe) | | }
new_module=ALLOC_STRUCT(module_list);
new_module->next=dynamic_module_list;
dynamic_module_list=new_module;
new_module->module=module;
|
6cf83a | 1997-02-06 | Fredrik Hübinette (Hubbe) | | new_module->init=init;
new_module->exit=exit;
|
368fe7 | 1997-01-26 | Fredrik Hübinette (Hubbe) | |
pop_n_elems(args);
start_new_program();
|
6cf83a | 1997-02-06 | Fredrik Hübinette (Hubbe) | | (*(modfun)init)();
push_program(end_program());
|
368fe7 | 1997-01-26 | Fredrik Hübinette (Hubbe) | | }
#endif /* HAVE_DLOPEN || USE_DLD */
void init_dynamic_load()
{
#ifdef USE_DLD
if (dld_init(dld_find_executable("pike")))
return;
#endif
#if defined(HAVE_DLOPEN) || defined(USE_DLD)
add_efun("load_module",f_load_module,"function(string:program)",OPT_EXTERNAL_DEPEND);
#endif
}
void exit_dynamic_load()
{
#if defined(HAVE_DLOPEN) || defined(USE_DLD)
while(dynamic_module_list)
{
struct module_list *tmp=dynamic_module_list;
dynamic_module_list=tmp->next;
|
6cf83a | 1997-02-06 | Fredrik Hübinette (Hubbe) | | (*tmp->exit)();
|
368fe7 | 1997-01-26 | Fredrik Hübinette (Hubbe) | | #ifdef HAVE_DLOPEN
dlclose(tmp->module);
|
786003 | 1997-01-22 | Bernhard Fastenrath | | #elif defined(USE_DLD)
|
368fe7 | 1997-01-26 | Fredrik Hübinette (Hubbe) | | if (tmp->module) {
dld_unlink_by_file((char *)tmp->module, 1);
free(tmp->module);
}
#endif
free((char *)tmp);
}
|
786003 | 1997-01-22 | Bernhard Fastenrath | | #endif
|
368fe7 | 1997-01-26 | Fredrik Hübinette (Hubbe) | | }
#else
#if defined(HAVE_DLOPEN) || defined(USE_DLD)
#include "interpret.h"
#include "constants.h"
#include "error.h"
#include "module.h"
#include "stralloc.h"
#include "macros.h"
#ifdef HAVE_DLFCN_H
#include <dlfcn.h>
#endif
#ifdef HAVE_DLD_H
#include <dld.h>
#endif
struct module_list
{
struct module_list * next;
void *module;
|
ca74dd | 1996-10-08 | Fredrik Hübinette (Hubbe) | | struct module mod;
};
struct module_list *dynamic_module_list = 0;
void f_load_module(INT32 args)
{
|
786003 | 1997-01-22 | Bernhard Fastenrath | | #ifdef HAVE_DLOPEN
|
ca74dd | 1996-10-08 | Fredrik Hübinette (Hubbe) | | void *module;
|
786003 | 1997-01-22 | Bernhard Fastenrath | | #endif
|
ca74dd | 1996-10-08 | Fredrik Hübinette (Hubbe) | | struct module_list *new_module;
|
786003 | 1997-01-22 | Bernhard Fastenrath | | const char *module_name;
|
235d1d | 1996-11-27 | Niels Möller | | int res;
|
ca74dd | 1996-10-08 | Fredrik Hübinette (Hubbe) | |
if(sp[-args].type != T_STRING)
error("Bad argument 1 to load_module()\n");
|
786003 | 1997-01-22 | Bernhard Fastenrath | |
module_name = sp[-args].u.string->str;
#ifdef HAVE_DLOPEN
|
719764 | 1996-10-09 | Fredrik Hübinette (Hubbe) | | #ifndef RTLD_NOW
#define RTLD_NOW 0
#endif
|
786003 | 1997-01-22 | Bernhard Fastenrath | | module=dlopen(module_name, RTLD_NOW);
|
ca74dd | 1996-10-08 | Fredrik Hübinette (Hubbe) | |
if(module)
|
786003 | 1997-01-22 | Bernhard Fastenrath | | #endif /* HAVE_DLOPEN */
|
ca74dd | 1996-10-08 | Fredrik Hübinette (Hubbe) | | {
struct module *tmp;
|
798cd0 | 1996-10-12 | Fredrik Hübinette (Hubbe) | | fun init, init2, exit;
|
786003 | 1997-01-22 | Bernhard Fastenrath | | #ifdef HAVE_DLOPEN
|
798cd0 | 1996-10-12 | Fredrik Hübinette (Hubbe) | | init=(fun)dlsym(module, "init_module_efuns");
init2=(fun)dlsym(module, "init_module_programs");
exit=(fun)dlsym(module, "exit_module");
|
ca74dd | 1996-10-08 | Fredrik Hübinette (Hubbe) | |
if(!init || !init2 || !exit)
|
786003 | 1997-01-22 | Bernhard Fastenrath | | #endif /* HAVE_DLOPEN */
|
ca74dd | 1996-10-08 | Fredrik Hübinette (Hubbe) | | {
char *foo, buf1[1024], buf2[1024];
foo=STRRCHR(sp[-args].u.string->str,'/');
|
235d1d | 1996-11-27 | Niels Möller | | if(foo)
foo++;
else
foo=sp[-args].u.string->str;
|
ca74dd | 1996-10-08 | Fredrik Hübinette (Hubbe) | | if(strlen(foo) < 1000)
{
strcpy(buf1, foo);
foo=buf1;
|
0682ec | 1997-01-14 | Niels Möller | |
foo = STRCHR(foo, '.');
if (foo)
*foo=0;
|
ca74dd | 1996-10-08 | Fredrik Hübinette (Hubbe) | |
strcpy(buf2,"init_");
strcat(buf2,buf1);
strcat(buf2,"_efuns");
|
786003 | 1997-01-22 | Bernhard Fastenrath | | #ifdef HAVE_DLOPEN
|
798cd0 | 1996-10-12 | Fredrik Hübinette (Hubbe) | | init=(fun)dlsym(module, buf2);
|
786003 | 1997-01-22 | Bernhard Fastenrath | | #elif defined(USE_DLD)
dld_create_reference(buf2);
if (dld_link(module_name)) {
error("load_module(\"%s\") failed: %s\n",
module_name, dld_strerror(dld_errno));
}
init = (fun)dld_get_func(buf2);
#endif /* USE_DLD */
|
ca74dd | 1996-10-08 | Fredrik Hübinette (Hubbe) | |
strcpy(buf2,"init_");
strcat(buf2,buf1);
strcat(buf2,"_programs");
|
786003 | 1997-01-22 | Bernhard Fastenrath | | #ifdef HAVE_DLOPEN
|
798cd0 | 1996-10-12 | Fredrik Hübinette (Hubbe) | | init2=(fun)dlsym(module, buf2);
|
786003 | 1997-01-22 | Bernhard Fastenrath | | #elif defined(USE_DLD)
init2=(fun)dld_get_func(buf2);
#endif
|
ca74dd | 1996-10-08 | Fredrik Hübinette (Hubbe) | |
strcpy(buf2,"exit_");
strcat(buf2,buf1);
|
786003 | 1997-01-22 | Bernhard Fastenrath | | #ifdef HAVE_DLOPEN
|
798cd0 | 1996-10-12 | Fredrik Hübinette (Hubbe) | | exit=(fun)dlsym(module, buf2);
|
786003 | 1997-01-22 | Bernhard Fastenrath | | #elif defined(USE_DLD)
exit=(fun)dld_get_func(buf2);
#endif
|
ca74dd | 1996-10-08 | Fredrik Hübinette (Hubbe) | | }
}
if(!init || !init2 || !exit)
error("Failed to initialize module.\n");
new_module=ALLOC_STRUCT(module_list);
new_module->next=dynamic_module_list;
dynamic_module_list=new_module;
|
786003 | 1997-01-22 | Bernhard Fastenrath | | #ifdef HAVE_DLOPEN
|
ca74dd | 1996-10-08 | Fredrik Hübinette (Hubbe) | | new_module->module=module;
|
786003 | 1997-01-22 | Bernhard Fastenrath | | #elif defined(USE_DLD)
new_module->module_path = 0;
new_module->module_path = xalloc(strlen(module_name) + 1);
strcpy(new_module->module_path,module_name);
#endif
|
ca74dd | 1996-10-08 | Fredrik Hübinette (Hubbe) | | new_module->mod.init_efuns=init;
new_module->mod.init_programs=init2;
new_module->mod.exit=exit;
new_module->mod.refs=0;
tmp=current_module;
|
235d1d | 1996-11-27 | Niels Möller | | current_module = & new_module->mod;
|
ca74dd | 1996-10-08 | Fredrik Hübinette (Hubbe) | |
(*(fun)init)();
(*(fun)init2)();
current_module=tmp;
|
235d1d | 1996-11-27 | Niels Möller | | res = 1;
|
786003 | 1997-01-22 | Bernhard Fastenrath | | }
#ifdef HAVE_DLOPEN
else {
|
a69b79 | 1996-12-28 | Henrik Grubbström (Grubba) | | error("load_module(\"%s\") failed: %s\n",
sp[-args].u.string->str, dlerror());
}
|
786003 | 1997-01-22 | Bernhard Fastenrath | | #endif
|
235d1d | 1996-11-27 | Niels Möller | | pop_n_elems(args);
push_int(res);
|
ca74dd | 1996-10-08 | Fredrik Hübinette (Hubbe) | | }
|
786003 | 1997-01-22 | Bernhard Fastenrath | | #endif /* HAVE_DLOPEN || USE_DLD */
|
ca74dd | 1996-10-08 | Fredrik Hübinette (Hubbe) | |
void init_dynamic_load()
{
|
786003 | 1997-01-22 | Bernhard Fastenrath | | #ifdef USE_DLD
if (dld_init(dld_find_executable("pike")))
return;
#endif
#if defined(HAVE_DLOPEN) || defined(USE_DLD)
|
ca74dd | 1996-10-08 | Fredrik Hübinette (Hubbe) | | add_efun("load_module",f_load_module,"function(string:int)",OPT_SIDE_EFFECT);
#endif
}
void exit_dynamic_load()
{
|
786003 | 1997-01-22 | Bernhard Fastenrath | | #if defined(HAVE_DLOPEN) || defined(USE_DLD)
|
ca74dd | 1996-10-08 | Fredrik Hübinette (Hubbe) | | while(dynamic_module_list)
{
struct module_list *tmp=dynamic_module_list;
dynamic_module_list=tmp->next;
(*tmp->mod.exit)();
|
786003 | 1997-01-22 | Bernhard Fastenrath | | #ifdef HAVE_DLOPEN
|
ca74dd | 1996-10-08 | Fredrik Hübinette (Hubbe) | | dlclose(tmp->module);
|
786003 | 1997-01-22 | Bernhard Fastenrath | | #elif defined(USE_DLD)
if (tmp->module_path) {
|
368fe7 | 1997-01-26 | Fredrik Hübinette (Hubbe) | | dld_unlink_by_file((char *)tmp->module, 1);
free(tmp->module);
|
786003 | 1997-01-22 | Bernhard Fastenrath | | }
#endif
|
ca74dd | 1996-10-08 | Fredrik Hübinette (Hubbe) | | free((char *)tmp);
}
#endif
}
|
368fe7 | 1997-01-26 | Fredrik Hübinette (Hubbe) | | #endif
|