diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/init-backends.c | 29 | ||||
-rw-r--r-- | lib/init.c | 3 | ||||
-rw-r--r-- | lib/open-backend.c | 45 |
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; } } @@ -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; } |