/* return value means the number of successfully loaded plugins */ static int enumerate_plugins(const gchar *plugin_path, GPtrArray *plugin_array, GOptionContext *ctx) { GDir *dir; const gchar *fname; dir = g_dir_open(plugin_path, 0, NULL); if (!dir) { ERROR("unable to open plugin directory %s (err=%s)\n", plugin_path, strerror(errno)); return 0; } DEBUG("search for plugins in directory %s\n", plugin_path); /* add common options to help context: */ g_option_context_add_main_entries(ctx, loggen_options, 0); GModule *module = NULL; while ((fname = g_dir_read_name(dir))) { if (!g_str_has_suffix(fname,G_MODULE_SUFFIX)) continue; gchar *full_lib_path = g_build_filename(plugin_path,fname,NULL); module = g_module_open(full_lib_path, G_MODULE_BIND_LAZY); if (!module) { ERROR("error opening plugin module %s (%s)\n", fname, g_module_error()); continue; } /* get plugin info from lib file */ PluginInfo *plugin; if (!g_module_symbol(module, LOGGEN_PLUGIN_INFO, (gpointer *) &plugin)) { DEBUG("%s isn't a plugin for loggen. skip it. (%s)\n", fname, g_module_error()); g_module_close(module); continue; } if (is_plugin_already_loaded(plugin_array, plugin->name)) { DEBUG("plugin %s was already loaded. skip it\n", plugin->name); continue; } if (plugin->set_generate_message) plugin->set_generate_message(generate_message); else ERROR("plugin (%s) doesn't have set_generate_message function\n",plugin->name); g_ptr_array_add(plugin_array, (gpointer) plugin); /* create sub group for plugin specific parameters: */ GOptionGroup *group = g_option_group_new(plugin->name, plugin->name, "Show options", NULL, NULL); g_option_group_add_entries(group, plugin->get_options_list()); g_option_context_add_group(ctx, group); DEBUG("%s in %s is a loggen plugin\n", plugin->name, fname); } if (plugin_array->len == 0) { ERROR("no loggen plugin found in %s\n", plugin_path); } return plugin_array->len; }