#include #include #include #include "internal.h" #include "plugin.h" #ifdef RCC_PLUGINS # include # ifndef RTLD_NOW # define RTLD_NOW 0 # endif #endif /* RCC_PLUGINS */ rcc_library_handle rccLibraryOpen(char *filename) { #ifdef RCC_PLUGINS if (filename) return (rcc_library_handle)dlopen(filename, RTLD_NOW); #endif /* RCC_PLUGINS */ return NULL; } void rccLibraryClose(rcc_library_handle handle) { #ifdef RCC_PLUGINS if (handle) dlclose(handle); #endif /* RCC_PLUGINS */ } void* rccLibraryFind(rcc_library_handle handle, const char *symbol) { #ifdef RCC_PLUGINS if ((handle)||(symbol)) return dlsym(handle, symbol); #endif /* RCC_PLUGINS */ return NULL; } static rcc_plugin_handle_s rcc_engine_handles[RCC_MAX_PLUGINS]; int rccPluginInit() { unsigned int i; for (i=0;isn = strdup(name); if (plugin->sn) { plugin->handle = (rcc_library_handle)res; plugin->info_function = infofunc; return plugin; } else rccLibraryClose(res); } else rccLibraryClose(res); } break; default: return NULL; } return NULL; } rcc_engine *rccPluginEngineGetInfo(const char *name, const char *language) { rcc_plugin_handle handle; rcc_plugin_engine_info_function infofunc; handle = rccPluginLoad(RCC_PLUGIN_TYPE_ENGINE, name); if (!handle) return NULL; infofunc = (rcc_plugin_engine_info_function)(handle->info_function); if (!infofunc) return NULL; return infofunc(language); }