static void loadPlugin(char *dirName, char *pluginName) { char pluginPath[256]; PluginInfo* pluginInfo; #ifndef MAKE_STATIC_PLUGINS #ifndef WIN32 void *pluginPtr = NULL; void *pluginEntryFctnPtr; PluginInfo* (*pluginJumpFunc)(void); #endif #endif int i; snprintf(pluginPath, sizeof(pluginPath), "%s/%s", dirName != NULL ? dirName : ".", pluginName); #ifndef MAKE_STATIC_PLUGINS pluginPtr = (void*)dlopen(pluginPath, RTLD_NOW /* RTLD_LAZY */); /* Load the library */ if(pluginPtr == NULL) { traceEvent(TRACE_WARNING, "Unable to load plugin '%s'", pluginPath); traceEvent(TRACE_WARNING, "Message is '%s'", dlerror()); return; } else traceEvent(TRACE_INFO, "Loaded '%s'", pluginPath); pluginEntryFctnPtr = (void*)dlsym(pluginPtr, "PluginEntryFctn"); if(pluginEntryFctnPtr == NULL) { #ifdef WIN32 traceEvent(TRACE_WARNING, "Unable to locate plugin '%s' entry function [%li]", pluginPath, GetLastError()); #else traceEvent(TRACE_WARNING, "Unable to locate plugin '%s' entry function [%s]", pluginPath, dlerror()); #endif /* WIN32 */ return; } pluginJumpFunc = (PluginInfo*(*)(void))pluginEntryFctnPtr; pluginInfo = pluginJumpFunc(); #else /* MAKE_STATIC_PLUGINS */ if(strcmp(pluginName, "sipPlugin") == 0) pluginInfo = sipPluginEntryFctn(); else if(strcmp(pluginName, "rtpPlugin") == 0) pluginInfo = rtpPluginEntryFctn(); else if(strcmp(pluginName, "dumpPlugin") == 0) pluginInfo = dumpPluginEntryFctn(); else if(strcmp(pluginName, "httpPlugin") == 0) pluginInfo = httpPluginEntryFctn(); else if(strcmp(pluginName, "smtpPlugin") == 0) pluginInfo = smtpPluginEntryFctn(); else if(strcmp(pluginName, "dbPlugin") == 0) pluginInfo = dbPluginEntryFctn(); else if(strcmp(pluginName, "bgpPlugin") == 0) pluginInfo = bgpPluginEntryFctn(); else if(strcmp(pluginName, "mysqlPlugin") == 0) pluginInfo = mysqlPluginEntryFctn(); #ifdef WIN32 else if(strcmp(pluginName, "processPlugin") == 0) pluginInfo = processPluginEntryFctn(); #endif else { pluginInfo = NULL; traceEvent(TRACE_WARNING, "Missing entrypoint for plugin '%s'", pluginName); } #endif /* MAKE_STATIC_PLUGINS */ if(pluginInfo != NULL) { if(strcmp(pluginInfo->nprobe_revision, nprobe_revision)) { traceEvent(TRACE_WARNING, "Plugin %s (%s/%s) version mismatch [loaded=%s][expected=%s]: discarded", pluginInfo->name, dirName, pluginName, pluginInfo->nprobe_revision, nprobe_revision); return; } if(plugin_sanity_check(pluginInfo->name, pluginInfo->pluginFlowConf(), "standard templates", ver9_templates) == -1) { traceEvent(TRACE_WARNING, "Plugin %s/%s will be ignored", dirName, pluginName); } else { int rc = 0; for(i=0; i<num_plugins; i++) { rc = plugin_sanity_check(pluginInfo->name, pluginInfo->pluginFlowConf(), all_plugins[i]->name, all_plugins[i]->pluginFlowConf()); if(rc != 0) break; } if(rc == 0) { if(pluginInfo != NULL) all_plugins[num_plugins++] = pluginInfo; /* FIX : add PluginInfo to the list */ } else { traceEvent(TRACE_WARNING, "Plugin %s/%s will be ignored", dirName, pluginName); } } } }