X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fconfigreader.cpp;h=de46a1f2965f12d2d7f62808322112f44d76b338;hb=76ebc88ccd6fef0bf2d97b607829fb3466e273af;hp=04918e7cf001cd004b8e85aa160e465ef335beb7;hpb=d4ca01f12f539a7f3eda3a682b5d2fbb67fabdb7;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/configreader.cpp b/src/configreader.cpp index 04918e7cf..de46a1f29 100644 --- a/src/configreader.cpp +++ b/src/configreader.cpp @@ -3,13 +3,13 @@ * +------------------------------------+ * * InspIRCd is copyright (C) 2002-2006 ChatSpike-Dev. - * E-mail: - * - * + * E-mail: + * + * * * Written by Craig Edwards, Craig McLure, and others. * This program is free but copyrighted software; see - * the file COPYING for details. + * the file COPYING for details. * * --------------------------------------------------- */ @@ -20,24 +20,15 @@ #include #include #include -#include "message.h" #include "inspircd.h" #include "inspstring.h" #include "helperfuncs.h" #include "userprocess.h" #include "xline.h" -extern ServerConfig *Config; -extern InspIRCd* ServerInstance; -extern time_t TIME; - -extern int MODCOUNT; -extern std::vector modules; -extern std::vector factory; - std::vector old_module_names, new_module_names, added_modules, removed_modules; -ServerConfig::ServerConfig() +ServerConfig::ServerConfig(InspIRCd* Instance) : ServerInstance(Instance) { this->ClearStack(); *TempDir = *ServerName = *Network = *ServerDesc = *AdminName = '\0'; @@ -97,26 +88,26 @@ bool ServerConfig::DelIOHook(int port) bool ServerConfig::CheckOnce(char* tag, bool bail, userrec* user) { - int count = ConfValueEnum(Config->config_data, tag); + int count = ConfValueEnum(this->config_data, tag); if (count > 1) { if (bail) { printf("There were errors in your configuration:\nYou have more than one <%s> tag, this is not permitted.\n",tag); - Exit(0); + InspIRCd::Exit(ERROR); } else { if (user) { - WriteServ(user->fd,"There were errors in your configuration:"); - WriteServ(user->fd,"You have more than one <%s> tag, this is not permitted.\n",tag); + user->WriteServ("There were errors in your configuration:"); + user->WriteServ("You have more than one <%s> tag, this is not permitted.\n",tag); } else { - WriteOpers("There were errors in the configuration file:"); - WriteOpers("You have more than one <%s> tag, this is not permitted.\n",tag); + ServerInstance->WriteOpers("There were errors in the configuration file:"); + ServerInstance->WriteOpers("You have more than one <%s> tag, this is not permitted.\n",tag); } } return false; @@ -126,19 +117,19 @@ bool ServerConfig::CheckOnce(char* tag, bool bail, userrec* user) if (bail) { printf("There were errors in your configuration:\nYou have not defined a <%s> tag, this is required.\n",tag); - Exit(0); + InspIRCd::Exit(ERROR); } else { if (user) { - WriteServ(user->fd,"There were errors in your configuration:"); - WriteServ(user->fd,"You have not defined a <%s> tag, this is required.",tag); + user->WriteServ("There were errors in your configuration:"); + user->WriteServ("You have not defined a <%s> tag, this is required.",tag); } else { - WriteOpers("There were errors in the configuration file:"); - WriteOpers("You have not defined a <%s> tag, this is required.",tag); + ServerInstance->WriteOpers("There were errors in the configuration file:"); + ServerInstance->WriteOpers("You have not defined a <%s> tag, this is required.",tag); } } return false; @@ -146,13 +137,13 @@ bool ServerConfig::CheckOnce(char* tag, bool bail, userrec* user) return true; } -bool NoValidation(const char* tag, const char* value, void* data) +bool NoValidation(ServerConfig* conf, const char* tag, const char* value, void* data) { log(DEBUG,"No validation for <%s:%s>",tag,value); return true; } -bool ValidateTempDir(const char* tag, const char* value, void* data) +bool ValidateTempDir(ServerConfig* conf, const char* tag, const char* value, void* data) { char* x = (char*)data; if (!*x) @@ -160,7 +151,7 @@ bool ValidateTempDir(const char* tag, const char* value, void* data) return true; } -bool ValidateMaxTargets(const char* tag, const char* value, void* data) +bool ValidateMaxTargets(ServerConfig* conf, const char* tag, const char* value, void* data) { int* x = (int*)data; if ((*x < 0) || (*x > 31)) @@ -171,7 +162,7 @@ bool ValidateMaxTargets(const char* tag, const char* value, void* data) return true; } -bool ValidateSoftLimit(const char* tag, const char* value, void* data) +bool ValidateSoftLimit(ServerConfig* conf, const char* tag, const char* value, void* data) { int* x = (int*)data; if ((*x < 1) || (*x > MAXCLIENTS)) @@ -182,7 +173,7 @@ bool ValidateSoftLimit(const char* tag, const char* value, void* data) return true; } -bool ValidateMaxConn(const char* tag, const char* value, void* data) +bool ValidateMaxConn(ServerConfig* conf, const char* tag, const char* value, void* data) { int* x = (int*)data; if (*x > SOMAXCONN) @@ -192,7 +183,7 @@ bool ValidateMaxConn(const char* tag, const char* value, void* data) return true; } -bool ValidateDnsTimeout(const char* tag, const char* value, void* data) +bool ValidateDnsTimeout(ServerConfig* conf, const char* tag, const char* value, void* data) { int* x = (int*)data; if (!*x) @@ -200,7 +191,29 @@ bool ValidateDnsTimeout(const char* tag, const char* value, void* data) return true; } -bool ValidateDnsServer(const char* tag, const char* value, void* data) +bool InitializeDisabledCommands(const char* data, InspIRCd* ServerInstance) +{ + std::stringstream dcmds(data); + std::string thiscmd; + + /* Enable everything first */ + for (nspace::hash_map::iterator x = ServerInstance->Parser->cmdlist.begin(); x != ServerInstance->Parser->cmdlist.end(); x++) + x->second->Disable(false); + + /* Now disable all the ones which the user wants disabled */ + while (dcmds >> thiscmd) + { + nspace::hash_map::iterator cm = ServerInstance->Parser->cmdlist.find(thiscmd); + if (cm != ServerInstance->Parser->cmdlist.end()) + { + log(DEBUG,"Disabling command '%s'",cm->second->command.c_str()); + cm->second->Disable(true); + } + } + return true; +} + +bool ValidateDnsServer(ServerConfig* conf, const char* tag, const char* value, void* data) { char* x = (char*)data; if (!*x) @@ -239,7 +252,7 @@ bool ValidateDnsServer(const char* tag, const char* value, void* data) return true; } -bool ValidateModPath(const char* tag, const char* value, void* data) +bool ValidateModPath(ServerConfig* conf, const char* tag, const char* value, void* data) { char* x = (char*)data; if (!*x) @@ -248,7 +261,7 @@ bool ValidateModPath(const char* tag, const char* value, void* data) } -bool ValidateServerName(const char* tag, const char* value, void* data) +bool ValidateServerName(ServerConfig* conf, const char* tag, const char* value, void* data) { char* x = (char*)data; if (!strchr(x,'.')) @@ -260,70 +273,70 @@ bool ValidateServerName(const char* tag, const char* value, void* data) return true; } -bool ValidateNetBufferSize(const char* tag, const char* value, void* data) +bool ValidateNetBufferSize(ServerConfig* conf, const char* tag, const char* value, void* data) { - if ((!Config->NetBufferSize) || (Config->NetBufferSize > 65535) || (Config->NetBufferSize < 1024)) + if ((!conf->NetBufferSize) || (conf->NetBufferSize > 65535) || (conf->NetBufferSize < 1024)) { log(DEFAULT,"No NetBufferSize specified or size out of range, setting to default of 10240."); - Config->NetBufferSize = 10240; + conf->NetBufferSize = 10240; } return true; } -bool ValidateMaxWho(const char* tag, const char* value, void* data) +bool ValidateMaxWho(ServerConfig* conf, const char* tag, const char* value, void* data) { - if ((!Config->MaxWhoResults) || (Config->MaxWhoResults > 65535) || (Config->MaxWhoResults < 1)) + if ((!conf->MaxWhoResults) || (conf->MaxWhoResults > 65535) || (conf->MaxWhoResults < 1)) { log(DEFAULT,"No MaxWhoResults specified or size out of range, setting to default of 128."); - Config->MaxWhoResults = 128; + conf->MaxWhoResults = 128; } return true; } -bool ValidateLogLevel(const char* tag, const char* value, void* data) +bool ValidateLogLevel(ServerConfig* conf, const char* tag, const char* value, void* data) { const char* dbg = (const char*)data; - Config->LogLevel = DEFAULT; + conf->LogLevel = DEFAULT; if (!strcmp(dbg,"debug")) { - Config->LogLevel = DEBUG; - Config->debugging = 1; + conf->LogLevel = DEBUG; + conf->debugging = 1; } else if (!strcmp(dbg,"verbose")) - Config->LogLevel = VERBOSE; + conf->LogLevel = VERBOSE; else if (!strcmp(dbg,"default")) - Config->LogLevel = DEFAULT; + conf->LogLevel = DEFAULT; else if (!strcmp(dbg,"sparse")) - Config->LogLevel = SPARSE; + conf->LogLevel = SPARSE; else if (!strcmp(dbg,"none")) - Config->LogLevel = NONE; + conf->LogLevel = NONE; return true; } -bool ValidateMotd(const char* tag, const char* value, void* data) +bool ValidateMotd(ServerConfig* conf, const char* tag, const char* value, void* data) { - readfile(Config->MOTD,Config->motd); + conf->ReadFile(conf->MOTD,conf->motd); return true; } -bool ValidateRules(const char* tag, const char* value, void* data) +bool ValidateRules(ServerConfig* conf, const char* tag, const char* value, void* data) { - readfile(Config->RULES,Config->rules); + conf->ReadFile(conf->RULES,conf->rules); return true; } /* Callback called before processing the first tag */ -bool InitConnect(const char* tag) +bool InitConnect(ServerConfig* conf, const char* tag) { log(DEFAULT,"Reading connect classes..."); - Config->Classes.clear(); + conf->Classes.clear(); return true; } /* Callback called to process a single tag */ -bool DoConnect(const char* tag, char** entries, void** values, int* types) +bool DoConnect(ServerConfig* conf, const char* tag, char** entries, void** values, int* types) { ConnectClass c; char* allow = (char*)values[0]; /* Yeah, there are a lot of values. Live with it. */ @@ -371,13 +384,13 @@ bool DoConnect(const char* tag, char** entries, void** values, int* types) c.registration_timeout = 90; if (c.pingtime == 0) c.pingtime = 120; - Config->Classes.push_back(c); + conf->Classes.push_back(c); } else { c.host = deny; c.type = CC_DENY; - Config->Classes.push_back(c); + conf->Classes.push_back(c); log(DEBUG,"Read connect class type DENY, host=%s",deny); } @@ -386,7 +399,7 @@ bool DoConnect(const char* tag, char** entries, void** values, int* types) /* Callback called when there are no more tags */ -bool DoneConnect(const char* tag) +bool DoneConnect(ServerConfig* conf, const char* tag) { log(DEBUG,"DoneConnect called for tag: %s",tag); return true; @@ -394,38 +407,38 @@ bool DoneConnect(const char* tag) /* Callback called before processing the first tag */ -bool InitULine(const char* tag) +bool InitULine(ServerConfig* conf, const char* tag) { - Config->ulines.clear(); + conf->ulines.clear(); return true; } /* Callback called to process a single tag */ -bool DoULine(const char* tag, char** entries, void** values, int* types) +bool DoULine(ServerConfig* conf, const char* tag, char** entries, void** values, int* types) { char* server = (char*)values[0]; log(DEBUG,"Read ULINE '%s'",server); - Config->ulines.push_back(server); + conf->ulines.push_back(server); return true; } /* Callback called when there are no more tags */ -bool DoneULine(const char* tag) +bool DoneULine(ServerConfig* conf, const char* tag) { return true; } /* Callback called before processing the first tag */ -bool InitModule(const char* tag) +bool InitModule(ServerConfig* conf, const char* tag) { old_module_names.clear(); new_module_names.clear(); added_modules.clear(); removed_modules.clear(); - for (std::vector::iterator t = Config->module_names.begin(); t != Config->module_names.end(); t++) + for (std::vector::iterator t = conf->module_names.begin(); t != conf->module_names.end(); t++) { old_module_names.push_back(*t); } @@ -434,7 +447,7 @@ bool InitModule(const char* tag) /* Callback called to process a single tag */ -bool DoModule(const char* tag, char** entries, void** values, int* types) +bool DoModule(ServerConfig* conf, const char* tag, char** entries, void** values, int* types) { char* modname = (char*)values[0]; new_module_names.push_back(modname); @@ -443,7 +456,7 @@ bool DoModule(const char* tag, char** entries, void** values, int* types) /* Callback called when there are no more tags */ -bool DoneModule(const char* tag) +bool DoneModule(ServerConfig* conf, const char* tag) { // now create a list of new modules that are due to be loaded // and a seperate list of modules which are due to be unloaded @@ -478,25 +491,25 @@ bool DoneModule(const char* tag) /* Callback called before processing the first tag */ -bool InitMaxBans(const char* tag) +bool InitMaxBans(ServerConfig* conf, const char* tag) { - Config->maxbans.clear(); + conf->maxbans.clear(); return true; } /* Callback called to process a single tag */ -bool DoMaxBans(const char* tag, char** entries, void** values, int* types) +bool DoMaxBans(ServerConfig* conf, const char* tag, char** entries, void** values, int* types) { char* channel = (char*)values[0]; int* limit = (int*)values[1]; - Config->maxbans[channel] = *limit; + conf->maxbans[channel] = *limit; return true; } /* Callback called when there are no more tags. */ -bool DoneMaxBans(const char* tag) +bool DoneMaxBans(ServerConfig* conf, const char* tag) { return true; } @@ -546,6 +559,7 @@ void ServerConfig::Read(bool bail, userrec* user) {"options", "operspywhois", &this->OperSpyWhois, DT_BOOLEAN, NoValidation}, {"options", "tempdir", &this->TempDir, DT_CHARPTR, ValidateTempDir}, {"options", "nouserdns", &this->NoUserDns, DT_BOOLEAN, NoValidation}, + {"options", "syntaxhints", &this->SyntaxHints, DT_BOOLEAN, NoValidation}, {"pid", "file", &this->PID, DT_CHARPTR, NoValidation}, {NULL} }; @@ -620,7 +634,7 @@ void ServerConfig::Read(bool bail, userrec* user) if (this->LoadConf(newconfig, CONFIG_FILE, errstr)) { /* If we succeeded, set the ircd config to the new one */ - Config->config_data = newconfig; + this->config_data = newconfig; /* int c = 1; std::string last; @@ -646,7 +660,7 @@ void ServerConfig::Read(bool bail, userrec* user) { /* Unneeded because of the log() aboive? */ printf("There were errors in your configuration:\n%s",errstr.str().c_str()); - Exit(0); + InspIRCd::Exit(ERROR); } else { @@ -655,26 +669,26 @@ void ServerConfig::Read(bool bail, userrec* user) unsigned int prefixlen; start = 0; - /* ":Config->ServerName NOTICE user->nick :" */ - prefixlen = strlen(Config->ServerName) + strlen(user->nick) + 11; + /* ":ServerInstance->Config->ServerName NOTICE user->nick :" */ + prefixlen = strlen(this->ServerName) + strlen(user->nick) + 11; if (user) { - WriteServ(user->fd,"NOTICE %s :There were errors in the configuration file:",user->nick); + user->WriteServ("NOTICE %s :There were errors in the configuration file:",user->nick); while(start < errors.length()) { - WriteServ(user->fd, "NOTICE %s :%s",user->nick, errors.substr(start, 510 - prefixlen).c_str()); + user->WriteServ("NOTICE %s :%s",user->nick, errors.substr(start, 510 - prefixlen).c_str()); start += 510 - prefixlen; } } else { - WriteOpers("There were errors in the configuration file:"); + ServerInstance->WriteOpers("There were errors in the configuration file:"); while(start < errors.length()) { - WriteOpers(errors.substr(start, 360).c_str()); + ServerInstance->WriteOpers(errors.substr(start, 360).c_str()); start += 360; } } @@ -715,7 +729,7 @@ void ServerConfig::Read(bool bail, userrec* user) break; } - Values[Index].validation_function(Values[Index].tag, Values[Index].value, Values[Index].val); + Values[Index].validation_function(this, Values[Index].tag, Values[Index].value, Values[Index].val); } /* Claim memory for use when reading multiple tags @@ -731,7 +745,7 @@ void ServerConfig::Read(bool bail, userrec* user) /* XXX - Make this use ConfValueInteger and so on */ for (int Index = 0; MultiValues[Index].tag; Index++) { - MultiValues[Index].init_function(MultiValues[Index].tag); + MultiValues[Index].init_function(this, MultiValues[Index].tag); int number_of_tags = ConfValueEnum(this->config_data, MultiValues[Index].tag); @@ -758,10 +772,10 @@ void ServerConfig::Read(bool bail, userrec* user) break; } } - MultiValues[Index].validation_function(MultiValues[Index].tag, (char**)MultiValues[Index].items, ptr, MultiValues[Index].datatype); + MultiValues[Index].validation_function(this, MultiValues[Index].tag, (char**)MultiValues[Index].items, ptr, MultiValues[Index].datatype); } - MultiValues[Index].finish_function(MultiValues[Index].tag); + MultiValues[Index].finish_function(this, MultiValues[Index].tag); } /* Free any memory we claimed @@ -770,7 +784,7 @@ void ServerConfig::Read(bool bail, userrec* user) delete[] data[n]; // write once here, to try it out and make sure its ok - ServerInstance->WritePID(Config->PID); + ServerInstance->WritePID(this->PID); log(DEFAULT,"Done reading configuration file, InspIRCd is now starting."); @@ -778,24 +792,24 @@ void ServerConfig::Read(bool bail, userrec* user) */ if (!bail) { - ServerInstance->stats->BoundPortCount = BindPorts(false); + ServerInstance->stats->BoundPortCount = ServerInstance->BindPorts(false); if (!removed_modules.empty()) for (std::vector::iterator removing = removed_modules.begin(); removing != removed_modules.end(); removing++) { if (ServerInstance->UnloadModule(removing->c_str())) { - WriteOpers("*** REHASH UNLOADED MODULE: %s",removing->c_str()); + ServerInstance->WriteOpers("*** REHASH UNLOADED MODULE: %s",removing->c_str()); if (user) - WriteServ(user->fd,"973 %s %s :Module %s successfully unloaded.",user->nick, removing->c_str(), removing->c_str()); + user->WriteServ("973 %s %s :Module %s successfully unloaded.",user->nick, removing->c_str(), removing->c_str()); rem++; } else { if (user) - WriteServ(user->fd,"972 %s %s :Failed to unload module %s: %s",user->nick, removing->c_str(), removing->c_str(), ServerInstance->ModuleError()); + user->WriteServ("972 %s %s :Failed to unload module %s: %s",user->nick, removing->c_str(), removing->c_str(), ServerInstance->ModuleError()); } } @@ -804,17 +818,17 @@ void ServerConfig::Read(bool bail, userrec* user) { if (ServerInstance->LoadModule(adding->c_str())) { - WriteOpers("*** REHASH LOADED MODULE: %s",adding->c_str()); + ServerInstance->WriteOpers("*** REHASH LOADED MODULE: %s",adding->c_str()); if (user) - WriteServ(user->fd,"975 %s %s :Module %s successfully loaded.",user->nick, adding->c_str(), adding->c_str()); + user->WriteServ("975 %s %s :Module %s successfully loaded.",user->nick, adding->c_str(), adding->c_str()); add++; } else { if (user) - WriteServ(user->fd,"974 %s %s :Failed to load module %s: %s",user->nick, adding->c_str(), adding->c_str(), ServerInstance->ModuleError()); + user->WriteServ("974 %s %s :Failed to load module %s: %s",user->nick, adding->c_str(), adding->c_str(), ServerInstance->ModuleError()); } } @@ -1264,3 +1278,150 @@ int ServerConfig::ConfVarEnum(ConfigDataHash &target, const std::string &tag, in return 0; } + +/** Read the contents of a file located by `fname' into a file_cache pointed at by `F'. + */ +bool ServerConfig::ReadFile(file_cache &F, const char* fname) +{ + FILE* file; + char linebuf[MAXBUF]; + + F.clear(); + file = fopen(fname,"r"); + + if (file) + { + while (!feof(file)) + { + fgets(linebuf,sizeof(linebuf),file); + linebuf[strlen(linebuf)-1]='\0'; + + if (!*linebuf) + { + strcpy(linebuf," "); + } + + if (!feof(file)) + { + F.push_back(linebuf); + } + } + + fclose(file); + } + else + return false; + + return true; +} + +bool ServerConfig::FileExists(const char* file) +{ + FILE *input; + if ((input = fopen (file, "r")) == NULL) + { + return false; + } + else + { + fclose(input); + return true; + } +} + +char* ServerConfig::CleanFilename(char* name) +{ + char* p = name + strlen(name); + while ((p != name) && (*p != '/')) p--; + return (p != name ? ++p : p); +} + + +bool ServerConfig::DirValid(const char* dirandfile) +{ + char work[MAXBUF]; + char buffer[MAXBUF]; + char otherdir[MAXBUF]; + int p; + + strlcpy(work, dirandfile, MAXBUF); + p = strlen(work); + + // we just want the dir + while (*work) + { + if (work[p] == '/') + { + work[p] = '\0'; + break; + } + + work[p--] = '\0'; + } + + // Get the current working directory + if (getcwd(buffer, MAXBUF ) == NULL ) + return false; + + chdir(work); + + if (getcwd(otherdir, MAXBUF ) == NULL ) + return false; + + chdir(buffer); + + size_t t = strlen(work); + + if (strlen(otherdir) >= t) + { + otherdir[t] = '\0'; + + if (!strcmp(otherdir,work)) + { + return true; + } + + return false; + } + else + { + return false; + } +} + +std::string ServerConfig::GetFullProgDir(char** argv, int argc) +{ + char work[MAXBUF]; + char buffer[MAXBUF]; + char otherdir[MAXBUF]; + int p; + + strlcpy(work,argv[0],MAXBUF); + p = strlen(work); + + // we just want the dir + while (*work) + { + if (work[p] == '/') + { + work[p] = '\0'; + break; + } + + work[p--] = '\0'; + } + + // Get the current working directory + if (getcwd(buffer, MAXBUF) == NULL) + return ""; + + chdir(work); + + if (getcwd(otherdir, MAXBUF) == NULL) + return ""; + + chdir(buffer); + return otherdir; +} + +