mirror of
https://github.com/inspircd/inspircd.git
synced 2025-03-10 02:59:01 -04:00
If the mandatory tag is not found in the included config, the rehash is aborted. This is especially useful for remote includes, as it allows users to have a dummy tag at the end of the included config to indicate that the config has been wholly read. This method does not depend on exit codes so even situations where wget returns an empty or a wrong page that we would otherwise accept can be detected and an error can be generated before we assume that the contents have disappeared (and unload all modules, if the included file is supposed to contain module tags, for example). Usage: <include ... mandatorytag="namehere"> - if the included config doesn't contain a <namehere> tag then the rehash is aborted Fixes #30 reported by @Justasic
81 lines
2.1 KiB
C++
81 lines
2.1 KiB
C++
/*
|
|
* InspIRCd -- Internet Relay Chat Daemon
|
|
*
|
|
* Copyright (C) 2009 Daniel De Graaf <danieldg@inspircd.org>
|
|
*
|
|
* This file is part of InspIRCd. InspIRCd is free software: you can
|
|
* redistribute it and/or modify it under the terms of the GNU General Public
|
|
* License as published by the Free Software Foundation, version 2.
|
|
*
|
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
|
* details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
|
|
struct fpos
|
|
{
|
|
std::string filename;
|
|
int line;
|
|
int col;
|
|
fpos(const std::string& name, int l = 1, int c = 1) : filename(name), line(l), col(c) {}
|
|
std::string str()
|
|
{
|
|
return filename + ":" + ConvToStr(line) + ":" + ConvToStr(col);
|
|
}
|
|
};
|
|
|
|
enum ParseFlags
|
|
{
|
|
FLAG_USE_XML = 1,
|
|
FLAG_NO_EXEC = 2,
|
|
FLAG_NO_INC = 4
|
|
};
|
|
|
|
struct ParseStack
|
|
{
|
|
std::vector<std::string> reading;
|
|
std::map<std::string, std::string> vars;
|
|
ConfigDataHash& output;
|
|
ConfigFileCache& FilesOutput;
|
|
std::stringstream& errstr;
|
|
|
|
ParseStack(ServerConfig* conf)
|
|
: output(conf->config_data), FilesOutput(conf->Files), errstr(conf->errstr)
|
|
{
|
|
vars["amp"] = "&";
|
|
vars["quot"] = "\"";
|
|
vars["newline"] = vars["nl"] = "\n";
|
|
}
|
|
bool ParseFile(const std::string& name, int flags, const std::string& mandatory_tag = "");
|
|
bool ParseExec(const std::string& name, int flags, const std::string& mandatory_tag = "");
|
|
void DoInclude(ConfigTag* includeTag, int flags);
|
|
void DoReadFile(const std::string& key, const std::string& file, int flags, bool exec);
|
|
};
|
|
|
|
/** RAII wrapper on FILE* to close files on exceptions */
|
|
struct FileWrapper
|
|
{
|
|
FILE* const f;
|
|
bool close_with_pclose;
|
|
FileWrapper(FILE* file, bool use_pclose = false) : f(file), close_with_pclose(use_pclose) {}
|
|
operator bool() { return (f != NULL); }
|
|
operator FILE*() { return f; }
|
|
~FileWrapper()
|
|
{
|
|
if (f)
|
|
{
|
|
if (close_with_pclose)
|
|
pclose(f);
|
|
else
|
|
fclose(f);
|
|
}
|
|
}
|
|
};
|
|
|
|
|