From: Aki Tuomi Date: Tue, 4 Feb 2014 17:11:47 +0000 (+0200) Subject: gatherIncludes method for gathering include files from include directory X-Git-Tag: rec-3.6.0-rc1~190^2~5 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=93d7e233661e89d8489cc09c69da23dd9f8fd454;p=thirdparty%2Fpdns.git gatherIncludes method for gathering include files from include directory --- diff --git a/pdns/arguments.cc b/pdns/arguments.cc index e526d6f63a..57b1539faa 100644 --- a/pdns/arguments.cc +++ b/pdns/arguments.cc @@ -465,53 +465,57 @@ bool ArgvMap::file(const char *fname, bool lax, bool included) // handle include here (avoid re-include) if (!included && !params["include-dir"].empty()) { - // rerun parser for all files - struct stat st; - DIR *dir; - struct dirent *ent; - - // stat - if (stat(params["include-dir"].c_str(), &st)) { - L << Logger::Error << params["include-dir"] << " does not exist!" << std::endl; - throw ArgException(params["include-dir"] + " does not exist!"); + std::vector extraConfigs; + gatherIncludes(extraConfigs); + BOOST_FOREACH(const std::string& fn, extraConfigs) { + if (!file(fn.c_str(), lax, true)) { + L << Logger::Error << fn << " could not be parsed" << std::endl; + throw ArgException(fn + " could not be parsed"); } + } + closedir(dir); + } - // wonder if it's accessible directory - if (!S_ISDIR(st.st_mode)) { - L << Logger::Error << params["include-dir"] << " is not a directory" << std::endl; - throw ArgException(params["include-dir"] + " is not a directory"); - } + return true; +} - if (!(dir = opendir(params["include-dir"].c_str()))) { - L << Logger::Error << params["include-dir"] << " is not accessible" << std::endl; - throw ArgException(params["include-dir"] + " is not accessible"); - } - - std::vector extraConfigs; - while((ent = readdir(dir)) != NULL) { - if (ent->d_name[0] == '.') continue; // skip any dots - if (boost::ends_with(ent->d_name, ".conf")) { - // build name - std::ostringstream namebuf; - namebuf << params["include-dir"].c_str() << "/" << ent->d_name; // FIXME: Use some path separator - // ensure it's readable file - if (stat(namebuf.str().c_str(), &st) || !S_ISREG(st.st_mode)) { - L << Logger::Error << namebuf.str() << " is not a file" << std::endl; - throw ArgException(namebuf.str() + " does not exist!"); - } - extraConfigs.push_back(namebuf.str()); - } - } - std::sort(extraConfigs.begin(), extraConfigs.end(), CIStringComparePOSIX()); - BOOST_FOREACH(const std::string& fn, extraConfigs) { - if (!file(fn.c_str(), lax, true)) { - L << Logger::Error << fn << " could not be parsed" << std::endl; - throw ArgException(fn + " could not be parsed"); - } - } +void ArgvMap::gatherIncludes(std::vector &extraConfigs) { + extraConfigs.clear(); + if (params["include-dir"].empty()) return; // nothing to do + struct stat st; + DIR *dir; + struct dirent *ent; + + // stat + if (stat(params["include-dir"].c_str(), &st)) { + L << Logger::Error << params["include-dir"] << " does not exist!" << std::endl; + throw ArgException(params["include-dir"] + " does not exist!"); + } - closedir(dir); - } + // wonder if it's accessible directory + if (!S_ISDIR(st.st_mode)) { + L << Logger::Error << params["include-dir"] << " is not a directory" << std::endl; + throw ArgException(params["include-dir"] + " is not a directory"); + } - return true; + if (!(dir = opendir(params["include-dir"].c_str()))) { + L << Logger::Error << params["include-dir"] << " is not accessible" << std::endl; + throw ArgException(params["include-dir"] + " is not accessible"); + } + + while((ent = readdir(dir)) != NULL) { + if (ent->d_name[0] == '.') continue; // skip any dots + if (boost::ends_with(ent->d_name, ".conf")) { + // build name + std::ostringstream namebuf; + namebuf << params["include-dir"].c_str() << "/" << ent->d_name; // FIXME: Use some path separator + // ensure it's readable file + if (stat(namebuf.str().c_str(), &st) || !S_ISREG(st.st_mode)) { + L << Logger::Error << namebuf.str() << " is not a file" << std::endl; + throw ArgException(namebuf.str() + " does not exist!"); + } + extraConfigs.push_back(namebuf.str()); + } + } + std::sort(extraConfigs.begin(), extraConfigs.end(), CIStringComparePOSIX()); } diff --git a/pdns/arguments.hh b/pdns/arguments.hh index 1577307060..afd0ede35e 100644 --- a/pdns/arguments.hh +++ b/pdns/arguments.hh @@ -116,6 +116,7 @@ public: const param_t::const_iterator end(); //!< iterator semantics const string &operator[](const string &); //!< iterator semantics const vector&getCommands(); + void gatherIncludes(std::vector &extraConfigs); private: void parseOne(const string &unparsed, const string &parseOnly="", bool lax=false); typedef map params_t;