e1195f | 1997-03-23 | Fredrik Hübinette (Hubbe) | | #ifndef TESTING
# include "global.h"
# include "interpret.h"
# include "constants.h"
# include "error.h"
# include "module.h"
# include "stralloc.h"
# include "pike_macros.h"
#endif
|
ca74dd | 1996-10-08 | Fredrik Hübinette (Hubbe) | |
|
786003 | 1997-01-22 | Bernhard Fastenrath | | #if !defined(HAVE_DLOPEN) && defined(HAVE_DLD_LINK) && defined(HAVE_DLD_GET_FUNC)
#define USE_DLD
#endif
#if defined(HAVE_DLOPEN) || defined(USE_DLD)
|
2631a6 | 1996-10-09 | Fredrik Hübinette (Hubbe) | |
|
e1195f | 1997-03-23 | Fredrik Hübinette (Hubbe) | | typedef void (*modfun)(void);
#ifdef USE_DLD
#include <dld.h>
static void *dlopen(char *foo, int how)
{
dld_create_reference("pike_module_init");
if(dld_link(module_name))
{
return (void *)strdup(module_name);
}else{
return 0;
}
}
static char *dlerror(void)
{
return dld_strerror(dld_errno);
}
static void *dlsym(void *module, char *function)
{
return dld_get_func(function);
}
static void *dlclose(void *module)
{
if(!module) return;
dld_unlink_by_file((char *)module);
free(module);
}
static void dlinit(void)
{
extern char ** ARGV;
if(dld_init(dld_find_executable(ARGV[0])))
{
fprintf(stderr,"Failed to init dld\n");
exit(1);
}
}
#else
|
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) | |
|
e1195f | 1997-03-23 | Fredrik Hübinette (Hubbe) | | #define dlinit()
|
786003 | 1997-01-22 | Bernhard Fastenrath | | #endif
|
e1195f | 1997-03-23 | Fredrik Hübinette (Hubbe) | | #ifndef RTLD_NOW
#define RTLD_NOW 0
#endif
|
de1608 | 1997-06-03 | Fredrik Hübinette (Hubbe) | |
|
e1195f | 1997-03-23 | Fredrik Hübinette (Hubbe) | | #endif /* HAVE_DLOPEN || USE_DLD */
#ifndef TESTING
#if defined(HAVE_DLOPEN) || defined(USE_DLD)
|
6cf83a | 1997-02-06 | Fredrik Hübinette (Hubbe) | |
|
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;
module=dlopen(module_name, RTLD_NOW);
|
ef78b0 | 1997-11-03 | Henrik Grubbström (Grubba) | |
|
368fe7 | 1997-01-26 | Fredrik Hübinette (Hubbe) | | if(!module)
{
|
466a32 | 1997-09-07 | Henrik Grubbström (Grubba) | | const char *err = dlerror();
|
e1195f | 1997-03-23 | Fredrik Hübinette (Hubbe) | | if(!err) err = "Unknown reason";
|
368fe7 | 1997-01-26 | Fredrik Hübinette (Hubbe) | | error("load_module(\"%s\") failed: %s\n",
|
58fa88 | 1997-03-23 | Niels Möller | | sp[-args].u.string->str, err);
|
368fe7 | 1997-01-26 | Fredrik Hübinette (Hubbe) | | }
|
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) | |
if(!init || !exit)
{
dlclose(module);
|
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 */
|
e1195f | 1997-03-23 | Fredrik Hübinette (Hubbe) | | void init_dynamic_load(void)
|
368fe7 | 1997-01-26 | Fredrik Hübinette (Hubbe) | | {
|
b298e0 | 1997-04-16 | Fredrik Hübinette (Hubbe) | | #if defined(HAVE_DLOPEN) || defined(USE_DLD)
|
e1195f | 1997-03-23 | Fredrik Hübinette (Hubbe) | | dlinit();
|
368fe7 | 1997-01-26 | Fredrik Hübinette (Hubbe) | |
add_efun("load_module",f_load_module,"function(string:program)",OPT_EXTERNAL_DEPEND);
#endif
}
|
be478c | 1997-08-30 | Henrik Grubbström (Grubba) | | void exit_dynamic_load(void)
|
368fe7 | 1997-01-26 | Fredrik Hübinette (Hubbe) | | {
#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)();
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | #ifndef DEBUG_MALLOC
|
368fe7 | 1997-01-26 | Fredrik Hübinette (Hubbe) | | dlclose(tmp->module);
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | #endif
|
368fe7 | 1997-01-26 | Fredrik Hübinette (Hubbe) | | free((char *)tmp);
}
|
786003 | 1997-01-22 | Bernhard Fastenrath | | #endif
|
368fe7 | 1997-01-26 | Fredrik Hübinette (Hubbe) | | }
|
e1195f | 1997-03-23 | Fredrik Hübinette (Hubbe) | | #else /* TESTING */
#include <stdio.h>
|
368fe7 | 1997-01-26 | Fredrik Hübinette (Hubbe) | |
|
e1195f | 1997-03-23 | Fredrik Hübinette (Hubbe) | | int main()
|
368fe7 | 1997-01-26 | Fredrik Hübinette (Hubbe) | | {
|
e1195f | 1997-03-23 | Fredrik Hübinette (Hubbe) | | void *module,*fun;
dlinit();
module=dlopen("./myconftest.so",RTLD_NOW);
if(!module)
|
ca74dd | 1996-10-08 | Fredrik Hübinette (Hubbe) | | {
|
e1195f | 1997-03-23 | Fredrik Hübinette (Hubbe) | | fprintf(stderr,"Failed to link myconftest.so: %s\n",dlerror());
exit(1);
|
a69b79 | 1996-12-28 | Henrik Grubbström (Grubba) | | }
|
e1195f | 1997-03-23 | Fredrik Hübinette (Hubbe) | | fun=dlsym(module,"testfunc");
if(!fun) fun=dlsym(module,"_testfunc");
if(!fun)
|
ca74dd | 1996-10-08 | Fredrik Hübinette (Hubbe) | | {
|
e1195f | 1997-03-23 | Fredrik Hübinette (Hubbe) | | fprintf(stderr,"Failed to find function testfunc: %s\n",dlerror());
exit(1);
|
ca74dd | 1996-10-08 | Fredrik Hübinette (Hubbe) | | }
|
a99145 | 1997-07-08 | Fredrik Hübinette (Hubbe) | | fprintf(stderr,"Calling testfunc\n");
|
e1195f | 1997-03-23 | Fredrik Hübinette (Hubbe) | | ((void (*)(void))fun)();
|
a99145 | 1997-07-08 | Fredrik Hübinette (Hubbe) | | fprintf(stderr,"testfunc returned!\n");
|
e1195f | 1997-03-23 | Fredrik Hübinette (Hubbe) | | exit(1);
|
ca74dd | 1996-10-08 | Fredrik Hübinette (Hubbe) | | }
|
368fe7 | 1997-01-26 | Fredrik Hübinette (Hubbe) | | #endif
|