* libltdl/lt_dlloader.h (lt_dlloader): Add next field.
* libltdl/ltdl.c (lt_user_dlloader): Remove entirely. Change all
callers to use lt_dlloader instead. Add a compatibility macro.
(lt_dlloader_add): Remove copy and allocate stage, just hook
directly into the loaders list.
+2004-07-15 Gary V. Vaughan <gary@gnu.org>
+
+ Collapse two almost identical structures into one:
+
+ * libltdl/lt_dlloader.h (lt_dlloader): Add next field.
+ * libltdl/ltdl.c (lt_user_dlloader): Remove entirely. Change all
+ callers to use lt_dlloader instead. Add a compatibility macro.
+ (lt_dlloader_add): Remove copy and allocate stage, just hook
+ directly into the loaders list.
+
2004-07-15 Gary V. Vaughan <gary@gnu.org>
A cleaner way to access the private fields of an lt_dlhandle
be fetched from the preloaded symbol list by lt_dlsym(): */
#define get_vtable dld_link_LTX_get_vtable
-extern lt_user_dlloader *get_vtable (lt_user_data loader_data);
+extern lt_dlloader *get_vtable (lt_user_data loader_data);
/* Boilerplate code to set up the vtable for hooking this loader into
/* Return the vtable for this loader, only the name and sym_prefix
attributes (plus the virtual function implementations, obviously)
change between loaders. */
-lt_user_dlloader *
+lt_dlloader *
get_vtable (lt_user_data loader_data)
{
- static lt_user_dlloader *vtable = 0;
+ static lt_dlloader *vtable = 0;
if (!vtable)
{
be fetched from the preloaded symbol list by lt_dlsym(): */
#define get_vtable dlopen_LTX_get_vtable
-extern lt_user_dlloader *get_vtable (lt_user_data loader_data);
+extern lt_dlloader *get_vtable (lt_user_data loader_data);
/* Boilerplate code to set up the vtable for hooking this loader into
/* Return the vtable for this loader, only the name and sym_prefix
attributes (plus the virtual function implementations, obviously)
change between loaders. */
-lt_user_dlloader *
+lt_dlloader *
get_vtable (lt_user_data loader_data)
{
- static lt_user_dlloader *vtable = 0;
+ static lt_dlloader *vtable = 0;
if (!vtable)
{
be fetched from the preloaded symbol list by lt_dlsym(): */
#define get_vtable dyld_LTX_get_vtable
-extern lt_user_dlloader *get_vtable (lt_user_data loader_data);
+extern lt_dlloader *get_vtable (lt_user_data loader_data);
/* Boilerplate code to set up the vtable for hooking this loader into
/* Return the vtable for this loader, only the name and sym_prefix
attributes (plus the virtual function implementations, obviously)
change between loaders. */
-lt_user_dlloader *
+lt_dlloader *
get_vtable (lt_user_data loader_data)
{
- static lt_user_dlloader *vtable = 0;
+ static lt_dlloader *vtable = 0;
if (!vtable)
{
be fetched from the preloaded symbol list by lt_dlsym(): */
#define get_vtable load_add_on_LTX_get_vtable
-extern lt_user_dlloader *get_vtable (lt_user_data loader_data);
+extern lt_dlloader *get_vtable (lt_user_data loader_data);
/* Boilerplate code to set up the vtable for hooking this loader into
/* Return the vtable for this loader, only the name and sym_prefix
attributes (plus the virtual function implementations, obviously)
change between loaders. */
-lt_user_dlloader *
+lt_dlloader *
get_vtable (lt_user_data loader_data)
{
- static lt_user_dlloader *vtable = 0;
+ static lt_dlloader *vtable = 0;
if (!vtable)
{
be fetched from the preloaded symbol list by lt_dlsym(): */
#define get_vtable loadlibrary_LTX_get_vtable
-extern lt_user_dlloader *get_vtable (lt_user_data loader_data);
+extern lt_dlloader *get_vtable (lt_user_data loader_data);
/* Boilerplate code to set up the vtable for hooking this loader into
/* Return the vtable for this loader, only the name and sym_prefix
attributes (plus the virtual function implementations, obviously)
change between loaders. */
-lt_user_dlloader *
+lt_dlloader *
get_vtable (lt_user_data loader_data)
{
- static lt_user_dlloader *vtable = 0;
+ static lt_dlloader *vtable = 0;
if (!vtable)
{
be fetched from the preloaded symbol list by lt_dlsym(): */
#define get_vtable preopen_LTX_get_vtable
-extern lt_user_dlloader *get_vtable (lt_user_data loader_data);
+extern lt_dlloader *get_vtable (lt_user_data loader_data);
/* Boilerplate code to set up the vtable for hooking this loader into
/* Return the vtable for this loader, only the name and sym_prefix
attributes (plus the virtual function implementations, obviously)
change between loaders. */
-lt_user_dlloader *
+lt_dlloader *
get_vtable (lt_user_data loader_data)
{
- static lt_user_dlloader *vtable = 0;
+ static lt_dlloader *vtable = 0;
if (!vtable)
{
be fetched from the preloaded symbol list by lt_dlsym(): */
#define get_vtable shl_load_LTX_get_vtable
-extern lt_user_dlloader *get_vtable (lt_user_data loader_data);
+extern lt_dlloader *get_vtable (lt_user_data loader_data);
/* Boilerplate code to set up the vtable for hooking this loader into
/* Return the vtable for this loader, only the name and sym_prefix
attributes (plus the virtual function implementations, obviously)
change between loaders. */
-lt_user_dlloader *
+lt_dlloader *
get_vtable (lt_user_data loader_data)
{
- static lt_user_dlloader *vtable = 0;
+ static lt_dlloader *vtable = 0;
if (!vtable)
{
LT_BEGIN_C_DECLS
-typedef struct lt_user_dlloader lt_user_dlloader;
typedef struct lt_dlloader lt_dlloader;
typedef void * lt_user_data;
typedef void * lt_module;
/* Type of a function to get a loader's vtable: */
-typedef lt_user_dlloader *lt_get_vtable (lt_user_data loader_data);
+typedef lt_dlloader *lt_get_vtable (lt_user_data loader_data);
-/* Function pointer types for creating user defined module loaders: */
+/* Function pointer types for module loader vtable entries: */
typedef int lt_dlloader_init (lt_user_data loader_data);
typedef int lt_dlloader_exit (lt_user_data loader_data);
typedef lt_module lt_module_open (lt_user_data loader_data,
LT_DLLOADER_PREPEND = 0, LT_DLLOADER_APPEND
} lt_dlloader_priority;
-struct lt_user_dlloader {
+/* This structure defines a module loader, as populated by the get_vtable
+ entry point of each loader. */
+struct lt_dlloader {
+ lt_dlloader * next;
const char * name;
const char * sym_prefix;
lt_module_open * module_open;
lt_dlloader_priority priority;
};
-LT_SCOPE lt_dlloader *lt_dlloader_next (lt_dlloader *place);
-LT_SCOPE lt_dlloader *lt_dlloader_find (const char *loader_name);
-LT_SCOPE const char *lt_dlloader_name (lt_dlloader *place);
-LT_SCOPE lt_user_data *lt_dlloader_data (lt_dlloader *place);
-LT_SCOPE int lt_dlloader_add
- (const struct lt_user_dlloader *dlloader,
- lt_user_data data);
-LT_SCOPE int lt_dlloader_remove (const char *loader_name);
+LT_SCOPE lt_dlloader * lt_dlloader_next (lt_dlloader *place);
+LT_SCOPE lt_dlloader * lt_dlloader_find (const char *name);
+LT_SCOPE const char * lt_dlloader_name (lt_dlloader *place);
+LT_SCOPE lt_user_data * lt_dlloader_data (lt_dlloader *place);
+LT_SCOPE int lt_dlloader_add (lt_dlloader *dlloader,
+ lt_user_data data);
+LT_SCOPE int lt_dlloader_remove (const char *name);
+
+
+
+/* --- Backwards source compatibility --- */
+
+#define lt_user_dlloader lt_dlloader
LT_END_C_DECLS
#define LT_SYMBOL_OVERHEAD 5
-
-\f
-/* --- OPAQUE STRUCTURES DECLARED IN LTDL.H --- */
-
-
-/* This structure is used for the list of registered loaders. */
-struct lt_dlloader {
- struct lt_dlloader *next;
- const char *loader_name; /* identifying name for each loader */
- const char *sym_prefix; /* prefix for symbols */
- lt_module_open *module_open;
- lt_module_close *module_close;
- lt_find_sym *find_sym;
- lt_dlloader_exit *dlloader_exit;
- lt_user_data dlloader_data;
-};
-
/* Various boolean flags can be stored in the flags field of an
lt_dlhandle_struct... */
#define LT_DLGET_FLAG(handle, flag) (((handle)->flags & (flag)) == (flag))
static int
loader_init (lt_get_vtable *vtable_func, lt_user_data data)
{
- lt_user_dlloader *vtable = 0;
+ lt_dlloader *vtable = 0;
int errors = 0;
if (vtable_func)
#define get_vtable preopen_LTX_get_vtable
#define preloaded_symbols LT_CONC3(lt_, LTDLOPEN, _LTX_preloaded_symbols)
-extern lt_user_dlloader * get_vtable (lt_user_data data);
+extern lt_dlloader * get_vtable (lt_user_data data);
extern lt_dlsymlist preloaded_symbols;
/* Initialize libltdl. */
int
-lt_dlloader_add (const struct lt_user_dlloader *dlloader,
- lt_user_data data)
+lt_dlloader_add (lt_dlloader *dlloader, lt_user_data data)
{
int errors = 0;
- lt_dlloader *node = 0, *ptr = 0;
+ lt_dlloader *ptr = 0;
if ((dlloader == 0) /* diagnose null parameters */
|| (dlloader->module_open == 0)
return 1;
}
- /* Create a new dlloader node with copies of the user callbacks. */
- node = lt__malloc (sizeof *node);
- if (!node)
- return 1;
-
- /* There is no need to record the dlloader->dlloader_init function,
- since we won't need it again. */
- node->next = 0;
- node->loader_name = dlloader->name;
- node->sym_prefix = dlloader->sym_prefix;
- node->module_open = dlloader->module_open;
- node->module_close = dlloader->module_close;
- node->find_sym = dlloader->find_sym;
- node->dlloader_exit = dlloader->dlloader_exit;
- node->dlloader_data = dlloader->dlloader_data;
-
switch (dlloader->priority)
{
case LT_DLLOADER_PREPEND:
/* Tack NODE on the front of the LOADERS list. */
- node->next = loaders;
- loaders = node;
+ dlloader->next = loaders;
+ loaders = dlloader;
break;
case LT_DLLOADER_APPEND:
/* Add NODE to the end of the LOADERS list. */
for (ptr = loaders; ptr->next; ptr = ptr->next)
/*NOWORK*/;
- ptr->next = node;
+ ptr->next = dlloader;
break;
default:
}
int
-lt_dlloader_remove (const char *loader_name)
+lt_dlloader_remove (const char *name)
{
- lt_dlloader *place = lt_dlloader_find (loader_name);
+ lt_dlloader *place = lt_dlloader_find (name);
lt_dlhandle handle;
int errors = 0;
lt_dlloader *prev;
for (prev = loaders; prev->next; prev = prev->next)
{
- if (streq (prev->next->loader_name, loader_name))
+ if (streq (prev->next->name, name))
{
break;
}
if (place)
{
- name = place ? place->loader_name : 0;
+ name = place ? place->name : 0;
}
else
{
}
lt_dlloader *
-lt_dlloader_find (const char *loader_name)
+lt_dlloader_find (const char *name)
{
lt_dlloader *place = 0;
for (place = loaders; place; place = place->next)
{
- if (streq (place->loader_name, loader_name))
+ if (streq (place->name, name))
{
break;
}