void CPlugins::scanDir(const char *dir) { struct dirent **namelist; std::string fname; int number_of_files = scandir(dir, &namelist, 0, alphasort); for (int i = 0; i < number_of_files; i++) { std::string filename; filename = namelist[i]->d_name; int pos = filename.find(".cfg"); if (pos > -1) { plugin new_plugin; new_plugin.filename = filename.substr(0, pos); fname = dir; fname += '/'; new_plugin.cfgfile = fname.append(new_plugin.filename); new_plugin.cfgfile.append(".cfg"); parseCfg(&new_plugin); bool plugin_ok = parseCfg(&new_plugin); if (plugin_ok) { new_plugin.pluginfile = fname; if (new_plugin.type == CPlugins::P_TYPE_SCRIPT) { new_plugin.pluginfile.append(".sh"); } else { new_plugin.pluginfile.append(".so"); } // We do not check if new_plugin.pluginfile exists since .cfg in // PLUGINDIR_VAR can overwrite settings in read only dir // PLUGINDIR. This needs PLUGINDIR_VAR to be scanned at // first -> .cfg in PLUGINDIR will be skipped since plugin // already exists in the list. // This behavior is used to make sure plugins can be disabled // by creating a .cfg in PLUGINDIR_VAR (PLUGINDIR often is read only). if (!plugin_exists(new_plugin.filename)) { plugin_list.push_back(new_plugin); number_of_plugins++; } } } } }
bool Configuration::parseCfgFile_(const std::string& cfgFile) { try { if (!bfs::exists(cfgFile) || !bfs::is_regular_file(cfgFile)) { std::cerr << "\"" << cfgFile << "\" is not existed or not a regular file." << std::endl; return false; } std::ifstream cfgInput(cfgFile.c_str()); std::string cfgString; std::string line; if (!cfgInput.is_open()) { std::cerr << "Could not open file: " << cfgFile << std::endl; return false; } while (getline(cfgInput, line)) { izenelib::util::Trim(line); if (line.empty() || line[0] == '#') { // ignore empty line and comment line continue; } if (!cfgString.empty()) { cfgString.push_back('\n'); } cfgString.append(line); } // check configuration properties properties props('\n', '='); props.loadKvString(cfgString); parseCfg(props); } catch (const std::exception& e) { std::cerr << e.what() << std::endl; return false; } return true; }
void CPlugins::addPlugin(const char * dir) { PluginInit initPlugin; void *handle = NULL; char *error; struct dirent **namelist; std::string fname; int number_of_files = scandir(dir, &namelist, 0, alphasort); for (int i = 0; i < number_of_files; i++) { std::string filename; filename = namelist[i]->d_name; int pos = filename.find(".cfg"); if (pos > -1) { plugin new_plugin; new_plugin.filename = filename.substr(0, pos); fname = dir; fname += '/'; new_plugin.cfgfile = fname.append(new_plugin.filename); new_plugin.cfgfile.append(".cfg"); parseCfg(&new_plugin); bool plugin_ok = parseCfg(&new_plugin); if (plugin_ok) { new_plugin.pluginfile = fname; if (new_plugin.type == CPlugins::P_TYPE_SCRIPT) { new_plugin.pluginfile.append(".sh"); } else if (new_plugin.type == CPlugins::P_TYPE_GAME) { new_plugin.pluginfile.append(".so"); } else if (new_plugin.type == CPlugins::P_TYPE_TOOL) { new_plugin.pluginfile.append(".so"); } else if (new_plugin.type == CPlugins::P_TYPE_NEUTRINO) { new_plugin.pluginfile.append(".so"); // initPlugin handle = dlopen ( new_plugin.pluginfile.c_str(), RTLD_NOW); if (!handle) { fputs (dlerror(), stderr); } else { initPlugin = (PluginInit) dlsym(handle, "plugin_init"); if ((error = dlerror()) != NULL) { fputs(error, stderr); dlclose(handle); } else { dprintf(DEBUG_DEBUG, "[CPlugins] try init...\n"); initPlugin(); dlclose(handle); dprintf(DEBUG_DEBUG, "[CPlugins] init done...\n"); } } } // if (!plugin_exists(new_plugin.filename)) { plugin_list.push_back(new_plugin); number_of_plugins++; } } } } }