changeset 1627:ff22a18abfe6

Load module only once * do not load module, that is already loaded * coding style improvements
author Myhailo Danylenko <isbear@ukrpost.net>
date Wed, 21 Oct 2009 00:17:45 +0300
parents 055ea3cdbcd3
children a8a3d404ccce
files mcabber/src/commands.c
diffstat 1 files changed, 38 insertions(+), 27 deletions(-) [+]
line wrap: on
line diff
--- a/mcabber/src/commands.c	Tue Oct 20 22:59:49 2009 +0200
+++ b/mcabber/src/commands.c	Wed Oct 21 00:17:45 2009 +0300
@@ -2970,54 +2970,65 @@
 }
 
 #ifdef MODULES_ENABLE
+static gint module_list_comparator(gconstpointer arg1, gconstpointer arg2)
+{
+  const loaded_module_t *module = arg1;
+  const char *name = arg2;
+  return g_strcmp0(module->name, name);
+}
+
 static void do_load(char *arg)
 {
+  GModule *mod;
+  GSList *lmod;
+  char *mdir, *path;
   if (!arg || !*arg) {
-    scr_LogPrint (LPRINT_LOGNORM, "Missing modulename.");
+    scr_LogPrint(LPRINT_LOGNORM, "Missing modulename.");
     return;
   }
-  char *mdir = expand_filename (settings_opt_get ("modules_dir"));
-  char *path = g_module_build_path (mdir, arg);
-  GModule *mod = g_module_open (path, G_MODULE_BIND_LAZY);
+  lmod = g_slist_find_custom(loaded_modules, arg, module_list_comparator);
+  if (lmod) {
+    scr_LogPrint(LPRINT_LOGNORM, "Module %s is already loaded.", arg);
+    return;
+  }
+  mdir = expand_filename(settings_opt_get("modules_dir"));
+  path = g_module_build_path(mdir, arg);
+  mod  = g_module_open(path, G_MODULE_BIND_LAZY);
   if (!mod)
-    scr_LogPrint (LPRINT_LOGNORM, "Module %s loading failed: %s",
-                  path, g_module_error ());
+    scr_LogPrint(LPRINT_LOGNORM, "Module loading failed: %s",
+                 g_module_error());
   else {
-    loaded_module_t *module = g_new (loaded_module_t, 1);
-    module->name = g_strdup (arg);
+    loaded_module_t *module = g_new(loaded_module_t, 1);
+    module->name   = g_strdup(arg);
     module->module = mod;
-    loaded_modules = g_slist_prepend (loaded_modules, module);
-    scr_LogPrint (LPRINT_LOGNORM, "Loaded module %s", arg);
+    loaded_modules = g_slist_prepend(loaded_modules, module);
+    scr_LogPrint(LPRINT_LOGNORM, "Loaded module %s.", arg);
   }
-  g_free (path);
-  if (mdir)
-    g_free (mdir);
-}
-
-static int module_list_comparator (loaded_module_t *module, const char *name)
-{
-  return g_strcmp0 (module->name, name);
+  g_free(path);
+  g_free(mdir);
 }
 
 static void do_unload(char *arg)
 {
+  GSList *module;
   if (!arg || !*arg) {
-    scr_LogPrint (LPRINT_LOGNORM, "Missing modulename.");
+    scr_LogPrint(LPRINT_LOGNORM, "Missing modulename.");
     return;
   }
-  GSList *module = g_slist_find_custom (loaded_modules, arg, (GCompareFunc) module_list_comparator);
+  module = g_slist_find_custom(loaded_modules, arg, module_list_comparator);
   if (module) {
     loaded_module_t *mod = module->data;
-    if (!g_module_close ((GModule *) mod->module))
-      scr_LogPrint (LPRINT_LOGNORM, "Module unloading failed: %s",
-                    g_module_error ());
+    if (!g_module_close(mod->module))
+      scr_LogPrint(LPRINT_LOGNORM, "Module unloading failed: %s",
+                   g_module_error());
     else {
-      g_free (mod->name);
-      g_free (mod);
-      loaded_modules = g_slist_delete_link (loaded_modules, module);
+      g_free(mod->name);
+      g_free(mod);
+      loaded_modules = g_slist_delete_link(loaded_modules, module);
+      scr_LogPrint(LPRINT_LOGNORM, "Unloaded module %s.", arg);
     }
   } else
-    scr_LogPrint (LPRINT_LOGNORM, "Module %s not loaded.", arg);
+    scr_LogPrint(LPRINT_LOGNORM, "Module %s not loaded.", arg);
 }
 #endif