diff options
-rw-r--r-- | include/configreader.h | 6 | ||||
-rw-r--r-- | src/configreader.cpp | 42 | ||||
-rw-r--r-- | src/inspircd.cpp | 27 | ||||
-rw-r--r-- | src/modules/m_remoteinclude.cpp | 116 |
4 files changed, 9 insertions, 182 deletions
diff --git a/include/configreader.h b/include/configreader.h index b561a40fd..babb3511c 100644 --- a/include/configreader.h +++ b/include/configreader.h @@ -263,11 +263,7 @@ class CoreExport ServerConfig : public Extensible InspIRCd* GetInstance(); - bool Downloading(); - - void StartDownloads(); - - void Complete(const std::string &filename, bool error); + void DoDownloads(); /** This holds all the information in the config file, * it's indexed by tag name to a vector of key/values. diff --git a/src/configreader.cpp b/src/configreader.cpp index 47c8ec234..5b2cdd9d4 100644 --- a/src/configreader.cpp +++ b/src/configreader.cpp @@ -1256,42 +1256,10 @@ void ServerConfig::Read(bool bail, User* user, int pass) ServerInstance->WriteOpers("*** Successfully rehashed server."); } -bool ServerConfig::Downloading() +/* XXX: This can and will block! */ +void ServerConfig::DoDownloads() { - if (isatty(0) && isatty(1) && isatty(2)) - { - printf("."); - fflush(stdout); - } - - ServerInstance->Log(DEBUG, "ServerConfig::Downloading %d %d", TotalDownloaded, IncludedFiles.size()); - - /* Returns true if there are still files in the process of downloading */ - return (TotalDownloaded < IncludedFiles.size()); -} - -void ServerConfig::Complete(const std::string &filename, bool error) -{ - ServerInstance->Log(DEBUG,"Flag complete: %s %d", filename.c_str(), error); - std::map<std::string, std::istream*>::iterator x = IncludedFiles.find(filename); - - if (x != IncludedFiles.end()) - { - if (error) - { - delete x->second; - x->second = NULL; - FileErrors++; - } - TotalDownloaded++; - } - - return; -} - -void ServerConfig::StartDownloads() -{ - ServerInstance->Log(DEBUG,"((((((((((((((((((((((((( StartDownloads() size=%d )))))))))))))))))))))))))))))))))))))", IncludedFiles.size()); + ServerInstance->Log(DEBUG,"In DoDownloads()"); /* Reads all local files into the IncludedFiles map, then initiates sockets for the remote ones */ for (std::map<std::string, std::istream*>::iterator x = IncludedFiles.begin(); x != IncludedFiles.end(); ++x) @@ -1340,6 +1308,10 @@ void ServerConfig::StartDownloads() delete x->second; x->second = NULL; } + else + { + /* Search new file here for more includes to parse */ + } } CompletedFiles[x->first] = true; } diff --git a/src/inspircd.cpp b/src/inspircd.cpp index 98c7cc3ea..fbb7c7e71 100644 --- a/src/inspircd.cpp +++ b/src/inspircd.cpp @@ -471,32 +471,7 @@ InspIRCd::InspIRCd(int argc, char** argv) * these files. */ Config->Read(true, NULL, 0); - Config->StartDownloads(); - - /* Now the downloads are started, we monitor them for completion. - * On completion, we call Read again with pass = 1. - * NOTE: We really should add a timeout here - */ - - while (Config->Downloading()) - { - SE->DispatchEvents(); - this->BufferedSocketCull(); - } - - printf("\n"); - - if (Config->FileErrors) - { - for (std::map<std::string, std::istream*>::iterator x = Config->IncludedFiles.begin(); x != Config->IncludedFiles.end(); ++x) - { - if (!x->second) - printf("ERROR: Failed to access the file: %s.\n", x->first.c_str()); - } - printf("Initialisation of configuration failed.\n"); - Exit(EXIT_STATUS_CONFIG); - } - + Config->DoDownloads(); /* We have all the files we can get, initiate pass 1 */ Config->Read(true, NULL, 1); diff --git a/src/modules/m_remoteinclude.cpp b/src/modules/m_remoteinclude.cpp deleted file mode 100644 index aa5370c5c..000000000 --- a/src/modules/m_remoteinclude.cpp +++ /dev/null @@ -1,116 +0,0 @@ -/* +------------------------------------+ - * | Inspire Internet Relay Chat Daemon | - * +------------------------------------+ - * - * InspIRCd: (C) 2002-2007 InspIRCd Development Team - * See: http://www.inspircd.org/wiki/index.php/Credits - * - * This program is free but copyrighted software; see - * the file COPYING for details. - * - * --------------------------------------------------- - */ - -#include "inspircd.h" -#include "httpclient.h" - -/* $ModDesc: The base module for remote includes */ - -class ModuleRemoteInclude : public Module -{ - std::map<std::string, std::stringstream*> assoc; - - public: - ModuleRemoteInclude(InspIRCd* Me) - : Module(Me) - { - ServerInstance->Modules->Attach(I_OnDownloadFile, this); - ServerInstance->Modules->Attach(I_OnRequest, this); - } - - virtual ~ModuleRemoteInclude() - { - } - - virtual Version GetVersion() - { - // this method instantiates a class of type Version, and returns - // the modules version information using it. - - return Version(1,1,0,1,VF_VENDOR,API_VERSION); - } - - char* OnRequest(Request* req) - { - if (!strcmp(req->GetId(), HTTP_CLIENT_RESPONSE)) - { - HTTPClientResponse* resp = (HTTPClientResponse*)req; - ServerInstance->Log(DEBUG, "Got http file for %s", resp->GetURL().c_str()); - - std::map<std::string, std::stringstream*>::iterator n = assoc.find(resp->GetURL()); - - if (n == assoc.end()) - ServerInstance->Config->Complete(resp->GetURL(), true); - - std::string responsestr; - if (resp->GetResponse(responsestr) == 200) - { - *(n->second) << resp->GetData(); - - ServerInstance->Log(DEBUG, "Got data: %s", resp->GetData().c_str()); - - ServerInstance->Log(DEBUG, "Flag file complete without error"); - ServerInstance->Config->Complete(resp->GetURL(), false); - } - else - ServerInstance->Config->Complete(resp->GetURL(), true); - - /* Erase from our association map, but dont delete the pointer. - * the core will want to access this pointer for the file data. - */ - assoc.erase(n); - } - else if (!strcmp(req->GetId(), HTTP_CLIENT_ERROR)) - { - HTTPClientError* resp = (HTTPClientError*)req; - - ServerInstance->Log(DEBUG, "Got http error when accessing %s", resp->GetURL().c_str()); - ServerInstance->Config->Complete(resp->GetURL(), true); - - std::map<std::string, std::stringstream*>::iterator n = assoc.find(resp->GetURL()); - - if (n != assoc.end()) - assoc.erase(n); - } - return NULL; - } - - int OnDownloadFile(const std::string &name, std::istream* &filedata) - { - if (name.substr(0, 7) == "http://") - { - Module* target = ServerInstance->Modules->Find("m_http_client.so"); - if (target) - { - ServerInstance->Log(DEBUG,"Claiming schema http://, making fetch request for %s", name.c_str()); - - HTTPClientRequest* req = new HTTPClientRequest(ServerInstance, this, target, name); - req->Send(); - - /* XXX: We should delete req when the request is complete */ - - assoc[name] = new std::stringstream(); - delete filedata; - filedata = assoc[name]; - - return true; - } - } - - return false; - } -}; - - -MODULE_INIT(ModuleRemoteInclude) - |