Dlopen code example

From Second Life Wiki
Jump to navigation Jump to search
void loadPlugins( const char *path ) {
#ifndef LL_WINDOWS
       int (*slp_plugin_init)(plugin_interface *);
       
       DIR * plugindir;
       struct dirent * mydirent;
       void * dlhandle;
       char plugin_name[FILENAME_MAX];
       
       plugindir = opendir( path );
   if( NULL == plugindir ) {
               llwarns << "Could not open plugins directory: " << path << llendl;
               return;
       }
       
       while (mydirent = readdir(plugindir)) {
               if(!strcasestr(mydirent->d_name, PLUGINEXT)) {
                       fprintf(stderr, "Ignoring non-plugin directory entry %s\n", mydirent->d_name);
                       continue;
               }
               
               snprintf(plugin_name, sizeof(plugin_name), "%s%s%s", path, gDirUtilp->getDirDelimiter().c_str(), mydirent->d_name);
               fprintf(stderr, "Trying to load plugin: %s\n", plugin_name);
               dlhandle = dlopen(plugin_name, RTLD_LAZY);
               if (dlhandle==NULL) {
                       fprintf(stderr,"Error opening %s:  %s\n", plugin_name, dlerror());
                       continue;
               }
               
               slp_plugin_init = (int(*)(plugin_interface*))dlsym(dlhandle, "initOSLPlugin");
               if (!slp_plugin_init) {
                       fprintf(stderr,"Error looking up initOSLPlugin:  %s\n", dlerror());
                       dlclose(dlhandle);
                       continue;
               }
               slp_plugin_init(&gPluginInterface);
               //char * (*getName)(void) = (char *(*)())dlsym(*(itPlugins), "getPluginName" );
               //vPlugins[ getName() 
               vPlugins->push_back( dlhandle );
       }
#endif
}