X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fconfigparser.cpp;h=558c49117dd69ff6343015205c354c8a27e04af2;hb=9d4004e8d477232c143830508a7a6e41fd2d31b7;hp=44eb117a84edfa1ff3d16b53feb3ef10612705aa;hpb=efc75198ded220f6af88914252c3361f6a5664d9;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/configparser.cpp b/src/configparser.cpp index 44eb117a8..558c49117 100644 --- a/src/configparser.cpp +++ b/src/configparser.cpp @@ -2,7 +2,7 @@ * | Inspire Internet Relay Chat Daemon | * +------------------------------------+ * - * InspIRCd: (C) 2002-2009 InspIRCd Development Team + * InspIRCd: (C) 2002-2010 InspIRCd Development Team * See: http://wiki.inspircd.org/Credits * * This program is free but copyrighted software; see @@ -18,7 +18,7 @@ struct Parser { ParseStack& stack; - const int flags; + int flags; FILE* const file; fpos current; fpos last_tag; @@ -112,7 +112,7 @@ struct Parser while (1) { ch = next(); - if (ch == '&') + if (ch == '&' && (flags & FLAG_USE_XML)) { std::string varname; while (1) @@ -134,9 +134,20 @@ struct Parser throw CoreException("Undefined XML entity reference '&" + varname + ";'"); value.append(var->second); } + else if (ch == '\\' && !(flags & FLAG_USE_XML)) + { + int esc = next(); + if (esc == 'n') + value.push_back('\n'); + else if (isalpha(esc)) + throw CoreException("Unknown escape character \\" + std::string(1, esc)); + else + value.push_back(esc); + } else if (ch == '"') break; - value.push_back(ch); + else + value.push_back(ch); } items->push_back(KeyVal(key, value)); return true; @@ -166,14 +177,40 @@ struct Parser { stack.DoInclude(tag, flags); } + else if (name == "files") + { + for(std::vector::iterator i = items->begin(); i != items->end(); i++) + { + stack.DoReadFile(i->first, i->second, flags, false); + } + } + else if (name == "execfiles") + { + for(std::vector::iterator i = items->begin(); i != items->end(); i++) + { + stack.DoReadFile(i->first, i->second, flags, true); + } + } else if (name == "define") { + if (!(flags & FLAG_USE_XML)) + throw CoreException(" tags may only be used in XML-style config (add )"); std::string varname = tag->getString("name"); std::string value = tag->getString("value"); if (varname.empty()) throw CoreException("Variable definition must include variable name"); stack.vars[varname] = value; } + else if (name == "config") + { + std::string format = tag->getString("format"); + if (format == "xml") + flags |= FLAG_USE_XML; + else if (format == "compat") + flags &= ~FLAG_USE_XML; + else if (!format.empty()) + throw CoreException("Unknown configuration format " + format); + } else { stack.output.insert(std::make_pair(name, tag)); @@ -252,6 +289,29 @@ void ParseStack::DoInclude(ConfigTag* tag, int flags) } } +void ParseStack::DoReadFile(const std::string& key, const std::string& name, int flags, bool exec) +{ + if (flags & FLAG_NO_INC) + throw CoreException("Invalid tag in file included with noinclude=\"yes\""); + if (exec && (flags & FLAG_NO_EXEC)) + throw CoreException("Invalid tag in file included with noexec=\"yes\""); + + FileWrapper file(exec ? popen(name.c_str(), "r") : fopen(name.c_str(), "r")); + if (!file) + throw CoreException("Could not read \"" + name + "\" for \"" + key + "\" file"); + + file_cache& cache = FilesOutput[key]; + cache.clear(); + + char linebuf[MAXBUF*10]; + while (fgets(linebuf, sizeof(linebuf), file)) + { + int len = strlen(linebuf); + if (len) + cache.push_back(std::string(linebuf, len - 1)); + } +} + bool ParseStack::ParseFile(const std::string& name, int flags) { ServerInstance->Logs->Log("CONFIG", DEBUG, "Reading file %s", name.c_str());