e576bb | 2002-10-11 | Martin Nilsson | |
|
1b10db | 2002-10-08 | Martin Nilsson | |
|
56f4f4 | 2001-09-18 | Fredrik Hübinette (Hubbe) | | #ifdef TESTING
#define NO_PIKE_INCLUDES
#define CREATE_MAIN
#define NO_PIKE_GUTS
#endif
#ifndef NO_PIKE_INCLUDES
|
e1195f | 1997-03-23 | Fredrik Hübinette (Hubbe) | | # include "global.h"
# include "interpret.h"
# include "constants.h"
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | # include "pike_error.h"
|
e1195f | 1997-03-23 | Fredrik Hübinette (Hubbe) | | # include "module.h"
# include "stralloc.h"
# include "pike_macros.h"
|
655982 | 1999-02-01 | Per Hedbor | | # include "main.h"
|
c39e43 | 2001-08-02 | Fredrik Hübinette (Hubbe) | | # include "constants.h"
|
37b022 | 2002-01-31 | Marcus Comstedt | | # include "lex.h"
|
20b522 | 2004-03-22 | Martin Stjernholm | | # include "object.h"
|
24ddc7 | 1998-03-28 | Henrik Grubbström (Grubba) | |
|
ecf155 | 2001-09-10 | Henrik Grubbström (Grubba) | | #else /* TESTING */
#include <stdio.h>
|
24ddc7 | 1998-03-28 | Henrik Grubbström (Grubba) | |
|
79f71c | 1998-07-09 | Francesco Chemolli | | #endif /* !TESTING */
#ifdef HAVE_ERRNO_H
#include <errno.h>
#endif /* HAVE_ERRNO_H */
#ifdef HAVE_STRING_H
#include <string.h>
#endif /* HAVE_STRING_H */
|
ca74dd | 1996-10-08 | Fredrik Hübinette (Hubbe) | |
|
948f76 | 2014-01-06 | Henrik Grubbström (Grubba) | | #if !defined(HAVE_DLOPEN) || defined(USE_SEMIDYNAMIC_MODULES)
|
964949 | 1998-02-27 | Fredrik Hübinette (Hubbe) | |
|
948f76 | 2014-01-06 | Henrik Grubbström (Grubba) | | #ifdef USE_SEMIDYNAMIC_MODULES
#undef HAVE_DLOPEN
#define USE_STATIC_MODULES
#define HAVE_SOME_DLOPEN
#define EMULATE_DLOPEN
#define USE_DYNAMIC_MODULES
#elif defined(HAVE_DLD_LINK) && defined(HAVE_DLD_GET_FUNC)
|
786003 | 1997-01-22 | Bernhard Fastenrath | | #define USE_DLD
|
964949 | 1998-02-27 | Fredrik Hübinette (Hubbe) | | #define HAVE_SOME_DLOPEN
#define EMULATE_DLOPEN
|
948f76 | 2014-01-06 | Henrik Grubbström (Grubba) | | #elif defined(HAVE_SHL_LOAD) && defined(HAVE_DL_H)
|
79f71c | 1998-07-09 | Francesco Chemolli | | #define USE_HPUX_DL
#define HAVE_SOME_DLOPEN
#define EMULATE_DLOPEN
|
948f76 | 2014-01-06 | Henrik Grubbström (Grubba) | | #elif defined(USE_DLL) && \
defined(HAVE_LOADLIBRARY) && defined(HAVE_FREELIBRARY) && \
defined(HAVE_GETPROCADDRESS) && defined(HAVE_WINBASE_H)
|
964949 | 1998-02-27 | Fredrik Hübinette (Hubbe) | | #define USE_LOADLIBRARY
#define HAVE_SOME_DLOPEN
#define EMULATE_DLOPEN
|
948f76 | 2014-01-06 | Henrik Grubbström (Grubba) | | #elif defined(HAVE_MACH_O_DYLD_H)
|
ecf155 | 2001-09-10 | Henrik Grubbström (Grubba) | |
#define USE_DYLD
#define HAVE_SOME_DLOPEN
#define EMULATE_DLOPEN
|
79f71c | 1998-07-09 | Francesco Chemolli | | #endif
|
948f76 | 2014-01-06 | Henrik Grubbström (Grubba) | |
|
964949 | 1998-02-27 | Fredrik Hübinette (Hubbe) | | #else
|
948f76 | 2014-01-06 | Henrik Grubbström (Grubba) | |
|
964949 | 1998-02-27 | Fredrik Hübinette (Hubbe) | | #define HAVE_SOME_DLOPEN
|
786003 | 1997-01-22 | Bernhard Fastenrath | | #endif
|
964949 | 1998-02-27 | Fredrik Hübinette (Hubbe) | |
#ifdef HAVE_SOME_DLOPEN
|
2631a6 | 1996-10-09 | Fredrik Hübinette (Hubbe) | |
|
e1195f | 1997-03-23 | Fredrik Hübinette (Hubbe) | | typedef void (*modfun)(void);
|
948f76 | 2014-01-06 | Henrik Grubbström (Grubba) | | #ifdef USE_STATIC_MODULES
static void *dlopen(const char *foo, int how)
{
struct pike_string *s = low_read_file(foo);
char *name, *end;
void *res;
if (!s) return NULL;
if (strncmp(s->str, "PMODULE=\"", 9)) {
free_string(s);
return NULL;
}
name = s->str + 9;
if (!(end = strchr(name, '\"'))) {
free_string(s);
return NULL;
}
res = find_semidynamic_module(name, end - name);
free_string(s);
return res;
}
static char *dlerror(void)
{
return "Invalid dynamic module.";
}
static void *dlsym(void *module, char *function)
{
if (!strcmp(function, "pike_module_init"))
return get_semidynamic_init_fun(module);
if (!strcmp(function, "pike_module_exit"))
return get_semidynamic_exit_fun(module);
return NULL;
}
static int dlinit(void)
{
return 1;
}
static void dlclose(void *module)
{
}
#elif defined(USE_LOADLIBRARY)
|
964949 | 1998-02-27 | Fredrik Hübinette (Hubbe) | | #include <windows.h>
|
c7241b | 2000-08-10 | Henrik Grubbström (Grubba) | | static TCHAR *convert_string(const char *str, ptrdiff_t len)
|
964949 | 1998-02-27 | Fredrik Hübinette (Hubbe) | | {
|
c7241b | 2000-08-10 | Henrik Grubbström (Grubba) | | ptrdiff_t e;
|
964949 | 1998-02-27 | Fredrik Hübinette (Hubbe) | | TCHAR *ret=(TCHAR *)xalloc((len+1) * sizeof(TCHAR));
for(e=0;e<len;e++) ret[e]=EXTRACT_UCHAR(str+e);
ret[e]=0;
return ret;
}
|
01a957 | 2000-02-03 | Henrik Grubbström (Grubba) | | static void *dlopen(const char *foo, int how)
|
964949 | 1998-02-27 | Fredrik Hübinette (Hubbe) | | {
TCHAR *tmp;
HINSTANCE ret;
tmp=convert_string(foo, strlen(foo));
ret=LoadLibrary(tmp);
free((char *)tmp);
return (void *)ret;
}
static char * dlerror(void)
{
static char buffer[200];
|
99bf81 | 2009-03-19 | Henrik Grubbström (Grubba) | | int err = GetLastError();
switch(err) {
case ERROR_MOD_NOT_FOUND:
return "The specified module could not be found.";
default:
sprintf(buffer,"LoadLibrary failed with error: %d",GetLastError());
}
|
964949 | 1998-02-27 | Fredrik Hübinette (Hubbe) | | return buffer;
}
static void *dlsym(void *module, char * function)
{
return (void *)GetProcAddress((HMODULE)module,
function);
}
static void dlclose(void *module)
{
FreeLibrary((HMODULE)module);
}
|
ecf155 | 2001-09-10 | Henrik Grubbström (Grubba) | | #define dlinit() 1
|
964949 | 1998-02-27 | Fredrik Hübinette (Hubbe) | |
|
79f71c | 1998-07-09 | Francesco Chemolli | | #endif /* USE_LOADLIBRARY */
|
964949 | 1998-02-27 | Fredrik Hübinette (Hubbe) | |
|
e1195f | 1997-03-23 | Fredrik Hübinette (Hubbe) | | #ifdef USE_DLD
#include <dld.h>
|
01a957 | 2000-02-03 | Henrik Grubbström (Grubba) | | static void *dlopen(const char *module_name, int how)
|
e1195f | 1997-03-23 | Fredrik Hübinette (Hubbe) | | {
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);
}
|
ecf155 | 2001-09-10 | Henrik Grubbström (Grubba) | | static int dlinit(void)
|
e1195f | 1997-03-23 | Fredrik Hübinette (Hubbe) | | {
extern char ** ARGV;
if(dld_init(dld_find_executable(ARGV[0])))
{
fprintf(stderr,"Failed to init dld\n");
|
ecf155 | 2001-09-10 | Henrik Grubbström (Grubba) | | return 0;
|
e1195f | 1997-03-23 | Fredrik Hübinette (Hubbe) | | }
|
ecf155 | 2001-09-10 | Henrik Grubbström (Grubba) | |
return 1;
|
e1195f | 1997-03-23 | Fredrik Hübinette (Hubbe) | | }
|
79f71c | 1998-07-09 | Francesco Chemolli | | #endif /* USE_DLD */
#ifdef USE_HPUX_DL
#include <dl.h>
|
513a2b | 1998-07-09 | Henrik Grubbström (Grubba) | | #if defined(BIND_VERBOSE)
|
79f71c | 1998-07-09 | Francesco Chemolli | | #define RTLD_NOW BIND_IMMEDIATE | BIND_VERBOSE
#else
#define RTLD_NOW BIND_IMMEDIATE
|
513a2b | 1998-07-09 | Henrik Grubbström (Grubba) | | #endif /* BIND_VERBOSE */
|
79f71c | 1998-07-09 | Francesco Chemolli | |
extern int errno;
|
01a957 | 2000-02-03 | Henrik Grubbström (Grubba) | | static void *dlopen(const char *libname, int how)
|
79f71c | 1998-07-09 | Francesco Chemolli | | {
shl_t lib;
lib = shl_load(libname, how, 0L);
return (void *)lib;
}
|
e1195f | 1997-03-23 | Fredrik Hübinette (Hubbe) | |
|
79f71c | 1998-07-09 | Francesco Chemolli | | static char *dlerror(void)
{
#ifdef HAVE_STRERROR
return strerror(errno);
#else
return "";
|
964949 | 1998-02-27 | Fredrik Hübinette (Hubbe) | | #endif
|
79f71c | 1998-07-09 | Francesco Chemolli | | }
static void *dlsym(void *module, char *function)
{
void *func;
int result;
shl_t mod = (shl_t)module;
result = shl_findsym(&mod, function, TYPE_UNDEFINED, &func);
if (result == -1)
return NULL;
return func;
}
static void dlclose(void *module)
{
shl_unload((shl_t)module);
}
|
ecf155 | 2001-09-10 | Henrik Grubbström (Grubba) | | #define dlinit() 1
|
79f71c | 1998-07-09 | Francesco Chemolli | |
#endif /* USE_HPUX_DL */
|
ecf155 | 2001-09-10 | Henrik Grubbström (Grubba) | | #ifdef USE_DYLD
#include <mach-o/dyld.h>
#define RTLD_NOW NSLINKMODULE_OPTION_BINDNOW
#define dlinit() _dyld_present()
|
fac041 | 2004-03-21 | Henrik Grubbström (Grubba) | | struct pike_dl_handle
{
NSObjectFileImage image;
NSModule module;
};
static void *dlclose(void *handle_)
{
struct pike_dl_handle *handle = handle_;
if (handle) {
if (handle->module)
NSUnLinkModule(handle->module, NSUNLINKMODULE_OPTION_NONE);
handle->module = NULL;
if (handle->image)
NSDestroyObjectFileImage(handle->image);
handle->image = NULL;
free(handle);
}
return NULL;
}
static char *pike_dl_error = NULL;
|
ecf155 | 2001-09-10 | Henrik Grubbström (Grubba) | | static void *dlopen(const char *module_name, int how)
{
|
fac041 | 2004-03-21 | Henrik Grubbström (Grubba) | | struct pike_dl_handle *handle = malloc(sizeof(struct pike_dl_handle));
|
ecf155 | 2001-09-10 | Henrik Grubbström (Grubba) | | NSObjectFileImageReturnCode code = 0;
|
fac041 | 2004-03-21 | Henrik Grubbström (Grubba) | |
pike_dl_error = NULL;
if (!handle) {
pike_dl_error = "Out of memory.";
return NULL;
}
handle->image = NULL;
handle->module = NULL;
|
ecf155 | 2001-09-10 | Henrik Grubbström (Grubba) | |
|
334193 | 2004-03-21 | Henrik Grubbström (Grubba) | |
|
fac041 | 2004-03-21 | Henrik Grubbström (Grubba) | | if ((code = NSCreateObjectFileImageFromFile(module_name,
&handle->image)) !=
|
ecf155 | 2001-09-10 | Henrik Grubbström (Grubba) | | NSObjectFileImageSuccess) {
|
fac041 | 2004-03-21 | Henrik Grubbström (Grubba) | | #ifdef PIKE_DEBUG
|
ecf155 | 2001-09-10 | Henrik Grubbström (Grubba) | | fprintf(stderr, "NSCreateObjectFileImageFromFile(\"%s\") failed with %d\n",
module_name, code);
|
fac041 | 2004-03-21 | Henrik Grubbström (Grubba) | | #endif /* PIKE_DEBUG */
pike_dl_error = "NSCreateObjectFileImageFromFile() failed.";
dlclose(handle);
|
ecf155 | 2001-09-10 | Henrik Grubbström (Grubba) | | return NULL;
}
|
334193 | 2004-03-21 | Henrik Grubbström (Grubba) | |
|
fac041 | 2004-03-21 | Henrik Grubbström (Grubba) | | handle->module = NSLinkModule(handle->image, module_name,
how | NSLINKMODULE_OPTION_RETURN_ON_ERROR |
NSLINKMODULE_OPTION_PRIVATE);
if (!handle->module) {
dlclose(handle);
return NULL;
}
return handle;
}
|
334193 | 2004-03-21 | Henrik Grubbström (Grubba) | |
|
fac041 | 2004-03-21 | Henrik Grubbström (Grubba) | | static void *dlsym(void *handle, char *function)
{
NSSymbol symbol =
NSLookupSymbolInModule(((struct pike_dl_handle *)handle)->module,
function);
return symbol?NSAddressOfSymbol(symbol):NULL;
|
ecf155 | 2001-09-10 | Henrik Grubbström (Grubba) | | }
|
fac041 | 2004-03-21 | Henrik Grubbström (Grubba) | | static const char *dlerror(void)
|
ecf155 | 2001-09-10 | Henrik Grubbström (Grubba) | | {
NSLinkEditErrors class = 0;
int error_number = 0;
|
fac041 | 2004-03-21 | Henrik Grubbström (Grubba) | | const char *file_name = NULL;
const char *error_string = NULL;
|
ecf155 | 2001-09-10 | Henrik Grubbström (Grubba) | |
|
fac041 | 2004-03-21 | Henrik Grubbström (Grubba) | | if (pike_dl_error) return pike_dl_error;
|
ecf155 | 2001-09-10 | Henrik Grubbström (Grubba) | |
|
fac041 | 2004-03-21 | Henrik Grubbström (Grubba) | | NSLinkEditError(&class, &error_number, &file_name, &error_string);
return error_string;
|
ecf155 | 2001-09-10 | Henrik Grubbström (Grubba) | | }
#endif /* USE_DYLD */
|
964949 | 1998-02-27 | Fredrik Hübinette (Hubbe) | |
#ifndef EMULATE_DLOPEN
|
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) | |
|
ecf155 | 2001-09-10 | Henrik Grubbström (Grubba) | | #define dlinit() 1
|
79f71c | 1998-07-09 | Francesco Chemolli | | #endif /* !EMULATE_DLOPEN */
|
786003 | 1997-01-22 | Bernhard Fastenrath | |
|
58dd66 | 1998-09-18 | Fredrik Hübinette (Hubbe) | | #endif /* HAVE_SOME_DLOPEN */
|
e1195f | 1997-03-23 | Fredrik Hübinette (Hubbe) | | #ifndef RTLD_NOW
#define RTLD_NOW 0
#endif
|
5aeade | 1999-02-01 | Per Hedbor | | #ifndef RTLD_LAZY
#define RTLD_LAZY 0
#endif
#ifndef RTLD_GLOBAL
#define RTLD_GLOBAL 0
#endif
|
56f4f4 | 2001-09-18 | Fredrik Hübinette (Hubbe) | | #ifndef NO_PIKE_GUTS
|
e1195f | 1997-03-23 | Fredrik Hübinette (Hubbe) | |
|
6d76cf | 2003-12-10 | Henrik Grubbström (Grubba) | | #if defined(HAVE_DLOPEN) || defined(USE_DLD) || defined(USE_HPUX_DL) || \
defined(USE_LOADLIBRARY) || defined(USE_DYLD)
|
e00cc8 | 2000-09-29 | Martin Stjernholm | | #define USE_DYNAMIC_MODULES
#endif
#ifdef USE_DYNAMIC_MODULES
|
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;
|
2dcd14 | 2004-03-21 | Henrik Grubbström (Grubba) | | struct pike_string *name;
|
63be68 | 2002-03-10 | Martin Stjernholm | | struct program *module_prog;
|
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;
|
418a37 | 1999-04-25 | Henrik Grubbström (Grubba) | | #ifdef NO_CAST_TO_FUN
static modfun CAST_TO_FUN(void *ptr)
{
union {
void *ptr;
modfun fun;
} u;
u.ptr = ptr;
return u.fun;
}
#else /* !NO_CAST_TO_FUN */
#define CAST_TO_FUN(X) ((modfun)X)
#endif /* NO_CAST_TO_FUN */
|
57ed3f | 2012-12-30 | Jonas Walldén | | static void cleanup_compilation(void *UNUSED(ignored))
|
fc29cf | 2002-01-30 | Marcus Comstedt | | {
|
4a36b2 | 2003-06-06 | Henrik Grubbström (Grubba) | | struct program *p = end_program();
if (p) {
free_program(p);
}
|
fc29cf | 2002-01-30 | Marcus Comstedt | | }
|
63be68 | 2002-03-10 | Martin Stjernholm | | |
7c0df7 | 2001-02-06 | Henrik Grubbström (Grubba) | | *!
*! Load a binary module.
*!
*! This function loads a module written in C or some other language
*! into Pike. The module is initialized and any programs or constants
*! defined will immediately be available.
*!
|
cbe8c9 | 2003-04-07 | Martin Nilsson | | *! When a module is loaded the C function @tt{pike_module_init()@} will
|
7c0df7 | 2001-02-06 | Henrik Grubbström (Grubba) | | *! be called to initialize it. When Pike exits @tt{pike_module_exit()@}
*! will be called. These two functions @b{must@} be available in the module.
*!
*! @note
*! The current working directory is normally not searched for
|
cbe8c9 | 2003-04-07 | Martin Nilsson | | *! dynamic modules. Please use @expr{"./name.so"@} instead of just
*! @expr{"name.so"@} to load modules from the current directory.
|
7c0df7 | 2001-02-06 | Henrik Grubbström (Grubba) | | */
|
368fe7 | 1997-01-26 | Fredrik Hübinette (Hubbe) | | void f_load_module(INT32 args)
{
|
955262 | 2001-09-10 | Fredrik Hübinette (Hubbe) | | extern int global_callable_flags;
|
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;
|
2dcd14 | 2004-03-21 | Henrik Grubbström (Grubba) | | struct pike_string *module_name;
|
368fe7 | 1997-01-26 | Fredrik Hübinette (Hubbe) | |
|
fc29cf | 2002-01-30 | Marcus Comstedt | | ONERROR err;
|
2dcd14 | 2004-03-21 | Henrik Grubbström (Grubba) | | module_name = Pike_sp[-args].u.string;
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | if((TYPEOF(Pike_sp[-args]) != T_STRING) ||
|
2dcd14 | 2004-03-21 | Henrik Grubbström (Grubba) | | (module_name->size_shift) ||
|
2dd2ee | 2005-11-12 | Martin Nilsson | | string_has_null(module_name)) {
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | Pike_error("Bad argument 1 to load_module()\n");
|
2dcd14 | 2004-03-21 | Henrik Grubbström (Grubba) | | }
|
368fe7 | 1997-01-26 | Fredrik Hübinette (Hubbe) | |
|
2dcd14 | 2004-03-21 | Henrik Grubbström (Grubba) | | {
struct module_list *mp;
for (mp = dynamic_module_list; mp; mp = mp->next)
if (mp->name == module_name && mp->module_prog) {
pop_n_elems(args);
ref_push_program(mp->module_prog);
return;
}
}
|
368fe7 | 1997-01-26 | Fredrik Hübinette (Hubbe) | |
|
081930 | 2000-02-17 | Fredrik Hübinette (Hubbe) | |
|
8bff49 | 2000-09-26 | Fredrik Hübinette (Hubbe) | |
|
2dcd14 | 2004-03-21 | Henrik Grubbström (Grubba) | | module=dlopen(module_name->str,
|
56688c | 2002-05-10 | Per Hedbor | | RTLD_NOW );
|
ef78b0 | 1997-11-03 | Henrik Grubbström (Grubba) | |
|
368fe7 | 1997-01-26 | Fredrik Hübinette (Hubbe) | | if(!module)
{
|
db1450 | 2008-05-27 | Henrik Grubbström (Grubba) | | struct object *err_obj = fast_clone_object(module_load_error_program);
|
df019f | 2004-04-18 | Martin Stjernholm | | #define LOADERR_STRUCT(OBJ) \
((struct module_load_error_struct *) (err_obj->storage + module_load_error_offset))
|
20b522 | 2004-03-22 | Martin Stjernholm | |
|
466a32 | 1997-09-07 | Henrik Grubbström (Grubba) | | const char *err = dlerror();
|
20b522 | 2004-03-22 | Martin Stjernholm | | if (err) {
if (err[strlen (err) - 1] == '\n')
push_string (make_shared_binary_string (err, strlen (err) - 1));
else
push_text (err);
}
else
push_constant_text ("Unknown reason");
|
df019f | 2004-04-18 | Martin Stjernholm | | add_ref (LOADERR_STRUCT (err_obj)->path = Pike_sp[-args - 1].u.string);
add_ref (LOADERR_STRUCT (err_obj)->reason = Pike_sp[-1].u.string);
|
20b522 | 2004-03-22 | Martin Stjernholm | |
|
9b150a | 2002-05-11 | Martin Nilsson | | if (Pike_sp[-args].u.string->len < 1024) {
|
20b522 | 2004-03-22 | Martin Stjernholm | | throw_error_object (err_obj, "load_module", Pike_sp - args - 1, args,
"load_module(\"%s\") failed: %s\n",
module_name->str, Pike_sp[-1].u.string->str);
|
14160c | 1998-05-15 | Henrik Grubbström (Grubba) | | } else {
|
20b522 | 2004-03-22 | Martin Stjernholm | | throw_error_object (err_obj, "load_module", Pike_sp - args - 1, args,
"load_module() failed: %s\n",
Pike_sp[-1].u.string->str);
|
14160c | 1998-05-15 | Henrik Grubbström (Grubba) | | }
|
368fe7 | 1997-01-26 | Fredrik Hübinette (Hubbe) | | }
|
2dcd14 | 2004-03-21 | Henrik Grubbström (Grubba) | | #ifdef PIKE_DEBUG
|
63be68 | 2002-03-10 | Martin Stjernholm | | {
struct module_list *mp;
for (mp = dynamic_module_list; mp; mp = mp->next)
if (mp->module == module && mp->module_prog) {
|
2dcd14 | 2004-03-21 | Henrik Grubbström (Grubba) | | fprintf(stderr, "load_module(): Module loaded twice:\n"
"Old name: %s\n"
"New name: %s\n",
mp->name->str, module_name->str);
|
384c47 | 2002-05-01 | Martin Stjernholm | | pop_n_elems(args);
|
63be68 | 2002-03-10 | Martin Stjernholm | | ref_push_program(mp->module_prog);
return;
}
}
|
2dcd14 | 2004-03-21 | Henrik Grubbström (Grubba) | | #endif /* PIKE_DEBUG */
|
63be68 | 2002-03-10 | Martin Stjernholm | |
|
418a37 | 1999-04-25 | Henrik Grubbström (Grubba) | | init = CAST_TO_FUN(dlsym(module, "pike_module_init"));
|
fb84a7 | 1997-03-04 | Henrik Grubbström (Grubba) | | if (!init) {
|
418a37 | 1999-04-25 | Henrik Grubbström (Grubba) | | init = CAST_TO_FUN(dlsym(module, "_pike_module_init"));
|
faf492 | 2004-04-14 | Martin Stjernholm | | if (!init) {
dlclose(module);
|
9606eb | 2004-11-12 | Henrik Grubbström (Grubba) | | Pike_error("pike_module_init missing in dynamic module \"%S\".\n",
module_name);
|
faf492 | 2004-04-14 | Martin Stjernholm | | }
|
fb84a7 | 1997-03-04 | Henrik Grubbström (Grubba) | | }
|
faf492 | 2004-04-14 | Martin Stjernholm | |
|
418a37 | 1999-04-25 | Henrik Grubbström (Grubba) | | exit = CAST_TO_FUN(dlsym(module, "pike_module_exit"));
|
fb84a7 | 1997-03-04 | Henrik Grubbström (Grubba) | | if (!exit) {
|
418a37 | 1999-04-25 | Henrik Grubbström (Grubba) | | exit = CAST_TO_FUN(dlsym(module, "_pike_module_exit"));
|
faf492 | 2004-04-14 | Martin Stjernholm | | if (!exit) {
dlclose(module);
|
9606eb | 2004-11-12 | Henrik Grubbström (Grubba) | | Pike_error("pike_module_exit missing in dynamic module \"%S\".\n",
module_name);
|
14160c | 1998-05-15 | Henrik Grubbström (Grubba) | | }
|
368fe7 | 1997-01-26 | Fredrik Hübinette (Hubbe) | | }
|
faf492 | 2004-04-14 | Martin Stjernholm | |
|
458a71 | 2002-10-30 | Henrik Grubbström (Grubba) | | #if defined(__NT__) && defined(_M_IA64)
{
fprintf(stderr, "pike_module_init: 0x%p\n"
" func: 0x%p\n"
" gp: 0x%p\n",
init, ((void **)init)[0], ((void **)init)[1]);
fprintf(stderr, "pike_module_exit: 0x%p\n"
" func: 0x%p\n"
" gp: 0x%p\n",
exit, ((void **)exit)[0], ((void **)exit)[1]);
}
#endif /* __NT__ && _M_IA64 */
|
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;
|
2dcd14 | 2004-03-21 | Henrik Grubbström (Grubba) | | copy_shared_string(new_module->name, Pike_sp[-args].u.string);
|
63be68 | 2002-03-10 | Martin Stjernholm | | new_module->module_prog = NULL;
|
6cf83a | 1997-02-06 | Fredrik Hübinette (Hubbe) | | new_module->init=init;
new_module->exit=exit;
|
368fe7 | 1997-01-26 | Fredrik Hübinette (Hubbe) | |
|
e021fe | 2008-04-14 | Henrik Grubbström (Grubba) | | enter_compiler(new_module->name, 1);
|
368fe7 | 1997-01-26 | Fredrik Hübinette (Hubbe) | | start_new_program();
|
c39e43 | 2001-08-02 | Fredrik Hübinette (Hubbe) | |
|
955262 | 2001-09-10 | Fredrik Hübinette (Hubbe) | | global_callable_flags|=CALLABLE_DYNAMIC;
|
c39e43 | 2001-08-02 | Fredrik Hübinette (Hubbe) | |
|
044c62 | 1999-04-14 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
9b150a | 2002-05-11 | Martin Nilsson | | { struct svalue *save_sp=Pike_sp;
|
044c62 | 1999-04-14 | Fredrik Hübinette (Hubbe) | | #endif
|
885388 | 2008-04-26 | Henrik Grubbström (Grubba) | | SET_ONERROR(err, cleanup_compilation, NULL);
|
458a71 | 2002-10-30 | Henrik Grubbström (Grubba) | | #if defined(__NT__) && defined(_M_IA64)
fprintf(stderr, "Calling pike_module_init()...\n");
#endif /* __NT__ && _M_IA64 */
|
6cf83a | 1997-02-06 | Fredrik Hübinette (Hubbe) | | (*(modfun)init)();
|
458a71 | 2002-10-30 | Henrik Grubbström (Grubba) | | #if defined(__NT__) && defined(_M_IA64)
fprintf(stderr, "pike_module_init() done.\n");
#endif /* __NT__ && _M_IA64 */
|
fc29cf | 2002-01-30 | Marcus Comstedt | | UNSET_ONERROR(err);
|
044c62 | 1999-04-14 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
9b150a | 2002-05-11 | Martin Nilsson | | if(Pike_sp != save_sp)
|
ea9d77 | 2008-05-30 | Martin Stjernholm | | Pike_fatal("pike_module_init in %s left "
|
cfe0c6 | 2008-05-30 | Martin Stjernholm | | "%"PRINTPTRDIFFT"d droppings on stack.\n",
|
ea9d77 | 2008-05-30 | Martin Stjernholm | | module_name->str, Pike_sp - save_sp);
|
044c62 | 1999-04-14 | Fredrik Hübinette (Hubbe) | | }
#endif
|
6cf83a | 1997-02-06 | Fredrik Hübinette (Hubbe) | |
|
044c62 | 1999-04-14 | Fredrik Hübinette (Hubbe) | | pop_n_elems(args);
|
4a36b2 | 2003-06-06 | Henrik Grubbström (Grubba) | | {
struct program *p = end_program();
|
e021fe | 2008-04-14 | Henrik Grubbström (Grubba) | | exit_compiler();
|
4a36b2 | 2003-06-06 | Henrik Grubbström (Grubba) | | if (p) {
|
0bd147 | 2004-04-15 | Henrik Grubbström (Grubba) | | if (
#if 0
p->num_identifier_references
#else /* !0 */
1
#endif /* 0 */
) {
|
1cb5d5 | 2004-04-14 | Henrik Grubbström (Grubba) | | push_program(p);
add_ref(new_module->module_prog = Pike_sp[-1].u.program);
} else {
free_program(p);
push_undefined();
}
|
4a36b2 | 2003-06-06 | Henrik Grubbström (Grubba) | | } else {
|
cfe0c6 | 2008-05-30 | Martin Stjernholm | | #ifdef PIKE_DEBUG
struct svalue *save_sp=Pike_sp;
#endif
|
4a36b2 | 2003-06-06 | Henrik Grubbström (Grubba) | | new_module->exit();
|
cfe0c6 | 2008-05-30 | Martin Stjernholm | | #ifdef PIKE_DEBUG
if(Pike_sp != save_sp)
|
ea9d77 | 2008-05-30 | Martin Stjernholm | | Pike_fatal("pike_module_exit in %s left "
|
cfe0c6 | 2008-05-30 | Martin Stjernholm | | "%"PRINTPTRDIFFT"d droppings on stack.\n",
|
ea9d77 | 2008-05-30 | Martin Stjernholm | | module_name->str, Pike_sp - save_sp);
|
cfe0c6 | 2008-05-30 | Martin Stjernholm | | #endif
|
4a36b2 | 2003-06-06 | Henrik Grubbström (Grubba) | | dlclose(module);
dynamic_module_list = new_module->next;
|
650a97 | 2005-10-19 | Martin Nilsson | | free_string(new_module->name);
|
4a36b2 | 2003-06-06 | Henrik Grubbström (Grubba) | | free(new_module);
|
9606eb | 2004-11-12 | Henrik Grubbström (Grubba) | | Pike_error("Failed to initialize dynamic module \"%S\".\n",
module_name);
|
4a36b2 | 2003-06-06 | Henrik Grubbström (Grubba) | | }
}
|
368fe7 | 1997-01-26 | Fredrik Hübinette (Hubbe) | | }
|
e00cc8 | 2000-09-29 | Martin Stjernholm | | #endif /* USE_DYNAMIC_MODULES */
|
368fe7 | 1997-01-26 | Fredrik Hübinette (Hubbe) | |
|
e1195f | 1997-03-23 | Fredrik Hübinette (Hubbe) | | void init_dynamic_load(void)
|
368fe7 | 1997-01-26 | Fredrik Hübinette (Hubbe) | | {
|
e00cc8 | 2000-09-29 | Martin Stjernholm | | #ifdef USE_DYNAMIC_MODULES
|
ecf155 | 2001-09-10 | Henrik Grubbström (Grubba) | | if (dlinit()) {
|
45ee5d | 1999-02-10 | Fredrik Hübinette (Hubbe) | |
|
ecf155 | 2001-09-10 | Henrik Grubbström (Grubba) | |
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | |
|
ecf155 | 2001-09-10 | Henrik Grubbström (Grubba) | | ADD_EFUN("load_module", f_load_module,
tFunc(tStr,tPrg(tObj)), OPT_EXTERNAL_DEPEND);
}
|
368fe7 | 1997-01-26 | Fredrik Hübinette (Hubbe) | | #endif
}
|
da667d | 2000-09-28 | Henrik Grubbström (Grubba) | |
|
be478c | 1997-08-30 | Henrik Grubbström (Grubba) | | void exit_dynamic_load(void)
|
368fe7 | 1997-01-26 | Fredrik Hübinette (Hubbe) | | {
|
e00cc8 | 2000-09-29 | Martin Stjernholm | | #ifdef USE_DYNAMIC_MODULES
|
766bc8 | 2004-10-16 | Marcus Agehall | | struct module_list * volatile tmp;
|
fc29cf | 2002-01-30 | Marcus Comstedt | | JMP_BUF recovery;
|
e00cc8 | 2000-09-29 | Martin Stjernholm | | for (tmp = dynamic_module_list; tmp; tmp = tmp->next)
|
fc29cf | 2002-01-30 | Marcus Comstedt | | {
if(SETJMP(recovery))
call_handle_error();
|
cfe0c6 | 2008-05-30 | Martin Stjernholm | | else {
#ifdef PIKE_DEBUG
struct svalue *save_sp=Pike_sp;
#endif
tmp->exit();
#ifdef PIKE_DEBUG
if(Pike_sp != save_sp)
|
ea9d77 | 2008-05-30 | Martin Stjernholm | | Pike_fatal("pike_module_exit in %s left "
|
cfe0c6 | 2008-05-30 | Martin Stjernholm | | "%"PRINTPTRDIFFT"d droppings on stack.\n",
|
ea9d77 | 2008-05-30 | Martin Stjernholm | | tmp->name->str, Pike_sp - save_sp);
|
cfe0c6 | 2008-05-30 | Martin Stjernholm | | #endif
}
|
63be68 | 2002-03-10 | Martin Stjernholm | | UNSETJMP(recovery);
|
cfe0c6 | 2008-05-30 | Martin Stjernholm | |
|
19681a | 2008-05-30 | Martin Stjernholm | | if (tmp->module_prog) {
free_program(tmp->module_prog);
tmp->module_prog = NULL;
}
|
0dd057 | 2004-03-21 | Henrik Grubbström (Grubba) | | free_string(tmp->name);
tmp->name = NULL;
|
fc29cf | 2002-01-30 | Marcus Comstedt | | }
|
da667d | 2000-09-28 | Henrik Grubbström (Grubba) | | #endif
}
void free_dynamic_load(void)
{
|
e00cc8 | 2000-09-29 | Martin Stjernholm | | #ifdef USE_DYNAMIC_MODULES
|
da667d | 2000-09-28 | Henrik Grubbström (Grubba) | | while(dynamic_module_list)
{
struct module_list *tmp=dynamic_module_list;
dynamic_module_list=tmp->next;
|
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
|
b0234c | 2003-04-02 | Martin Stjernholm | | #ifdef PIKE_DEBUG
if (tmp->module_prog)
|
0dd057 | 2004-03-21 | Henrik Grubbström (Grubba) | | Pike_fatal ("There's still a program for a dynamic module.\n");
|
b0234c | 2003-04-02 | Martin Stjernholm | | #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) | | }
|
56f4f4 | 2001-09-18 | Fredrik Hübinette (Hubbe) | | #endif /* NO_PIKE_GUTS */
#ifdef CREATE_MAIN
|
e1195f | 1997-03-23 | Fredrik Hübinette (Hubbe) | | #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;
|
618bdd | 2001-11-26 | Henrik Grubbström (Grubba) | | if (!dlinit()) {
fprintf(stderr, "dlinit() failed.\n");
exit(1);
}
|
e1195f | 1997-03-23 | Fredrik Hübinette (Hubbe) | | 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) | | }
|
56f4f4 | 2001-09-18 | Fredrik Hübinette (Hubbe) | | #endif /* CREATE_MAIN */
|