summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/init-backends.c29
-rw-r--r--lib/init.c3
-rw-r--r--lib/open-backend.c45
3 files changed, 73 insertions, 4 deletions
diff --git a/lib/init-backends.c b/lib/init-backends.c
index efe14d0c..77263ee0 100644
--- a/lib/init-backends.c
+++ b/lib/init-backends.c
@@ -79,6 +79,32 @@ _get_library_filename (xmlDocPtr doc, xmlNodePtr cur, const char *directory)
return retval;
}
+static GSList *
+_parse_extra_libs (xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, const char *dir)
+{
+ GSList *list = NULL;
+
+ /* We don't care what the top level element name is */
+ cur = cur->childs;
+ while (cur != NULL) {
+ if ((!strcmp (cur->name, "ExtraLib")) && (cur->ns == ns)) {
+ xmlNodePtr sub = cur->childs;
+
+ while (sub != NULL) {
+ if ((!strcmp (sub->name, "ShlibName")) && (sub->ns == ns))
+ list = g_slist_append
+ (list, _get_library_filename (doc, sub, dir));
+
+ sub = sub->next;
+ }
+ }
+
+ cur = cur->next;
+ }
+
+ return list;
+}
+
static glibtop_backend_entry *
_parseBackend (xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, const char *dir)
{
@@ -105,6 +131,9 @@ _parseBackend (xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, const char *dir)
if ((!strcmp (sub->name, "ShlibName")) && (sub->ns == ns))
ret->shlib_name = _get_library_filename (doc, sub, dir);
+ if ((!strcmp (sub->name, "ExtraLibs")) && (sub->ns == ns))
+ ret->extra_libs = _parse_extra_libs (doc, ns, sub, dir);
+
sub = sub->next;
}
}
diff --git a/lib/init.c b/lib/init.c
index e107a428..491dc906 100644
--- a/lib/init.c
+++ b/lib/init.c
@@ -262,8 +262,6 @@ glibtop_init_s (glibtop **server_ptr, unsigned long features, unsigned flags)
return server;
if ((server->flags & _GLIBTOP_INIT_STATE_SYSDEPS) == 0) {
- glibtop_open_s (server, "glibtop", features, flags);
-
server->sysdeps.pointer_size = sizeof (void*)*8;
server->flags |= _GLIBTOP_INIT_STATE_SYSDEPS;
@@ -271,3 +269,4 @@ glibtop_init_s (glibtop **server_ptr, unsigned long features, unsigned flags)
return server;
}
+
diff --git a/lib/open-backend.c b/lib/open-backend.c
index 17d1e901..ad5cca72 100644
--- a/lib/open-backend.c
+++ b/lib/open-backend.c
@@ -31,6 +31,40 @@
#include <gmodule.h>
+static void
+unload_module (gpointer data, gpointer user_data)
+{
+ g_module_close (data);
+}
+
+static int
+load_extra_libs (glibtop *server, glibtop_backend_entry *entry)
+{
+ GSList *list;
+ GSList *loaded_here = NULL;
+
+ for (list = entry->extra_libs; list; list = list->next) {
+ const gchar *filename = list->data;
+ GModule *module;
+
+ module = g_module_open (filename, G_MODULE_BIND_LAZY);
+ if (!module) {
+ glibtop_warn_r (server, "Cannot open extra shared library `%s' "
+ "for backend `%s' (%s)", filename, entry->name,
+ g_module_error ());
+ g_slist_foreach (loaded_here, unload_module, NULL);
+ return -GLIBTOP_ERROR_NO_SUCH_BACKEND;
+ }
+
+ loaded_here = g_slist_prepend (loaded_here, module);
+ }
+
+ entry->_priv->extra_modules = g_slist_concat
+ (loaded_here, entry->_priv->extra_modules);
+
+ return 0;
+}
+
int
glibtop_open_backend_l (glibtop *server, const char *backend_name,
u_int64_t features, const char **backend_args)
@@ -45,12 +79,19 @@ glibtop_open_backend_l (glibtop *server, const char *backend_name,
if (!entry->_priv) {
entry->_priv = g_new0 (glibtop_backend_module, 1);
+ if (entry->extra_libs) {
+ int retval;
+
+ retval = load_extra_libs (server, entry);
+ if (retval < 0) return retval;
+ }
+
entry->_priv->module = g_module_open (entry->shlib_name,
G_MODULE_BIND_LAZY);
if (!entry->_priv->module) {
glibtop_warn_r (server, "Cannot open shared library `%s' "
- "for backend `%s'", entry->shlib_name,
- entry->name);
+ "for backend `%s' (%s)", entry->shlib_name,
+ entry->name, g_module_error ());
return -GLIBTOP_ERROR_NO_SUCH_BACKEND;
}