aboutsummaryrefslogtreecommitdiff
path: root/src/rc-plugin.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/rc-plugin.c')
-rw-r--r--src/rc-plugin.c157
1 files changed, 74 insertions, 83 deletions
diff --git a/src/rc-plugin.c b/src/rc-plugin.c
index f7cd3686..15ab149d 100644
--- a/src/rc-plugin.c
+++ b/src/rc-plugin.c
@@ -19,103 +19,94 @@
typedef struct plugin
{
- char *name;
- void *handle;
- int (*hook) (rc_hook_t hook, const char *name);
- struct plugin *next;
+ char *name;
+ void *handle;
+ int (*hook) (rc_hook_t hook, const char *name);
+ struct plugin *next;
} plugin_t;
static plugin_t *plugins = NULL;
void rc_plugin_load (void)
{
- char **files;
- char *file;
- int i;
- plugin_t *plugin = plugins;
-
- /* Ensure some sanity here */
- rc_plugin_unload ();
-
- if (! rc_exists (RC_PLUGINDIR))
- return;
-
- files = rc_ls_dir (NULL, RC_PLUGINDIR, 0);
- STRLIST_FOREACH (files, file, i)
- {
- char *p = rc_strcatpaths (RC_PLUGINDIR, file, NULL);
- void *h = dlopen (p, RTLD_LAZY);
- char *func;
- void *f;
- int len;
-
- if (! h)
- {
- eerror ("dlopen `%s': %s", p, dlerror ());
- free (p);
- continue;
- }
-
- func = file;
- file = strsep (&func, ".");
- len = strlen (file) + 7;
- func = rc_xmalloc (sizeof (char *) * len);
- snprintf (func, len, "_%s_hook", file);
-
- f = dlsym (h, func);
- if (! f)
- {
- eerror ("`%s' does not expose the symbol `%s'", p, func);
- dlclose (h);
- }
- else
- {
- if (plugin)
- {
- plugin->next = rc_xmalloc (sizeof (plugin_t));
- plugin = plugin->next;
- }
- else
- plugin = plugins = rc_xmalloc (sizeof (plugin_t));
-
- memset (plugin, 0, sizeof (plugin_t));
- plugin->name = strdup (file);
- plugin->handle = h;
- plugin->hook = f;
- }
-
- free (func);
- free (p);
- }
-
- rc_strlist_free (files);
+ char **files;
+ char *file;
+ int i;
+ plugin_t *plugin = plugins;
+
+ /* Ensure some sanity here */
+ rc_plugin_unload ();
+
+ if (! rc_exists (RC_PLUGINDIR))
+ return;
+
+ files = rc_ls_dir (NULL, RC_PLUGINDIR, 0);
+ STRLIST_FOREACH (files, file, i) {
+ char *p = rc_strcatpaths (RC_PLUGINDIR, file, NULL);
+ void *h = dlopen (p, RTLD_LAZY);
+ char *func;
+ void *f;
+ int len;
+
+ if (! h) {
+ eerror ("dlopen `%s': %s", p, dlerror ());
+ free (p);
+ continue;
+ }
+
+ func = file;
+ file = strsep (&func, ".");
+ len = strlen (file) + 7;
+ func = rc_xmalloc (sizeof (char *) * len);
+ snprintf (func, len, "_%s_hook", file);
+
+ f = dlsym (h, func);
+ if (! f) {
+ eerror ("`%s' does not expose the symbol `%s'", p, func);
+ dlclose (h);
+ } else {
+ if (plugin) {
+ plugin->next = rc_xmalloc (sizeof (plugin_t));
+ plugin = plugin->next;
+ } else
+ plugin = plugins = rc_xmalloc (sizeof (plugin_t));
+
+ memset (plugin, 0, sizeof (plugin_t));
+ plugin->name = strdup (file);
+ plugin->handle = h;
+ plugin->hook = f;
+ }
+
+ free (func);
+ free (p);
+ }
+
+ rc_strlist_free (files);
}
void rc_plugin_run (rc_hook_t hook, const char *value)
{
- plugin_t *plugin = plugins;
+ plugin_t *plugin = plugins;
- while (plugin)
- {
- if (plugin->hook)
- plugin->hook (hook, value);
+ while (plugin) {
+ if (plugin->hook)
+ plugin->hook (hook, value);
- plugin = plugin->next;
- }
+ plugin = plugin->next;
+ }
}
void rc_plugin_unload (void)
{
- plugin_t *plugin = plugins;
- plugin_t *next;
-
- while (plugin)
- {
- next = plugin->next;
- dlclose (plugin->handle);
- free (plugin->name);
- free (plugin);
- plugin = next;
- }
- plugins = NULL;
+ plugin_t *plugin = plugins;
+ plugin_t *next;
+
+ while (plugin) {
+ next = plugin->next;
+ dlclose (plugin->handle);
+ free (plugin->name);
+ free (plugin);
+ plugin = next;
+ }
+ plugins = NULL;
}