]> git.netwichtig.de Git - user/henk/code/inspircd.git/commitdiff
More stuff for this. Its starting to take shape a bit now, and is tidier than the...
authorbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>
Sun, 11 Nov 2007 18:11:42 +0000 (18:11 +0000)
committerbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>
Sun, 11 Nov 2007 18:11:42 +0000 (18:11 +0000)
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@8567 e03df62e-2008-0410-955e-edbf42e46eb7

include/configreader.h
src/commands/cmd_rehash.cpp
src/configreader.cpp
src/server.cpp

index c06bd7fb577f0c4affaac418cbd54a8382344c7f..8a389ed027e9d8e0edaa6965f8feddb0b0de445a 100644 (file)
@@ -242,10 +242,12 @@ class CoreExport ServerConfig : public Extensible
         */
        bool CheckOnce(char* tag);
 
-       std::map<std::string, std::stringstream*> IncludedFiles;
+       std::map<std::string, std::istream*> IncludedFiles;
   
   public:
 
+       size_t TotalDownloaded;
+
        /** Used to indicate who we announce invites to on a channel */
        enum InviteAnnounceState { INVITE_ANNOUNCE_NONE, INVITE_ANNOUNCE_ALL, INVITE_ANNOUNCE_OPS, INVITE_ANNOUNCE_DYNAMIC };
 
index 89c8b9e148500ffcf4c56d284af72e697db5245b..83b055650f15107ad0dabb17a4375e4985ad2b68 100644 (file)
@@ -39,7 +39,7 @@ CmdResult CommandRehash::Handle (const char** parameters, int pcnt, User *user)
                        user->WriteServ("*** NOTICE %s :ERROR: Could not open logfile %s: %s", user->nick, ServerInstance->Config->logpath.c_str(), strerror(errno));
                ServerInstance->RehashUsersAndChans();
                FOREACH_MOD(I_OnGarbageCollect, OnGarbageCollect());
-               ServerInstance->Config->Read(false,user);
+               /*ServerInstance->Config->Read(false,user);*/
                // Get XLine to do it's thing.
                ServerInstance->XLines->CheckELines();
                ServerInstance->XLines->ApplyLines();
index 312c0d9498156bf1d199b28d2b2d75dd9897992e..2852dc727c71899413f033c7544dde04b0e23d73 100644 (file)
@@ -1238,22 +1238,47 @@ void ServerConfig::Read(bool bail, User* user, int pass)
 bool ServerConfig::Downloading()
 {
        /* Returns true if there are still files in the process of downloading */
-       return true;
+       return (TotalDownloaded >= IncludedFiles.size());
 }
 
 void ServerConfig::StartDownloads()
 {
+       TotalDownloaded = 0;
        /* Reads all local files into the IncludedFiles map, then initiates sockets for the remote ones */
-       for (std::map<std::string, std::stringstream*>::iterator x = IncludedFiles.begin(); x != IncludedFiles.end(); ++x)
+       for (std::map<std::string, std::istream*>::iterator x = IncludedFiles.begin(); x != IncludedFiles.end(); ++x)
        {
                ServerInstance->Log(DEBUG,"Begin download for %s", x->first.c_str());
+               if ((x->first[0] == '/') || (x->first.substr(7) == "file://"))
+               {
+                       /* For file:// schema files, we use std::ifstream which is a derivative of std::istream.
+                        * For all other file schemas, we use a std::stringstream.
+                        */
+
+                       /* First, delete the dummy std::stringstream file that LoadConf put here */
+                       delete x->second;
+
+                       /* Now add our own ifstream */
+                       std::ifstream* conf = new std::ifstream(x->first.c_str());
+                       if (!conf->fail())
+                       {
+                               ServerInstance->Log(DEBUG,"file:// schema file %s loaded OK", x->first.c_str());
+                               x->second = conf;
+                       }
+
+                       TotalDownloaded++;
+               }
+               else
+               {
+                       /* Modules handle these */
+                       ServerInstance->Log(DEBUG,"Module-handled schema for %s", x->first.c_str());
+               }
        }
 }
 
 bool ServerConfig::LoadConf(ConfigDataHash &target, const char* filename, std::ostringstream &errorstream, int pass)
 {
        std::string line;
-       std::stringstream* conf = NULL;
+       std::istream* conf = NULL;
        char ch;
        long linenumber;
        bool in_tag;
@@ -1266,26 +1291,38 @@ bool ServerConfig::LoadConf(ConfigDataHash &target, const char* filename, std::o
        in_quote = false;
        in_comment = false;
 
-       /* Check if the file open failed first */
-       if (IncludedFiles.find(filename) == IncludedFiles.end())
+       if (std::string(filename) == CONFIG_FILE)
        {
-               if (pass == 0)
-               {
-                       ServerInstance->Log(DEBUG,"Push include file %s onto map", filename);
-                       /* First pass, we insert the file into a map, and just return true */
-                       IncludedFiles.insert(std::make_pair(filename,new std::stringstream));
-                       return true;
-               }
-               else
+               conf = new std::ifstream(filename);
+               if (conf->fail())
                {
-                       /* Second pass, look for the file in the map */
-                       ServerInstance->Log(DEBUG,"We are in the second pass, and %s is not in the map!", filename);
-                       errorstream << "File " << filename << " could not be found." << std::endl;
+                       errorstream << "File " << filename << " could not be opened." << std::endl;
                        return false;
                }
        }
        else
-               conf = IncludedFiles.find(filename)->second;
+       {
+               /* Check if the file open failed first */
+               if (IncludedFiles.find(filename) == IncludedFiles.end())
+               {
+                       if (pass == 0)
+                       {
+                               ServerInstance->Log(DEBUG,"Push include file %s onto map", filename);
+                               /* First pass, we insert the file into a map, and just return true */
+                               IncludedFiles.insert(std::make_pair(filename,new std::stringstream));
+                               return true;
+                       }
+                       else
+                       {
+                               /* Second pass, look for the file in the map */
+                               ServerInstance->Log(DEBUG,"We are in the second pass, and %s is not in the map!", filename);
+                               errorstream << "File " << filename << " could not be opened." << std::endl;
+                               return false;
+                       }
+               }
+               else
+                       conf = IncludedFiles.find(filename)->second;
+       }
 
        /* Start reading characters... */
        while (conf->get(ch))
index caeaa463bad4a0c47f23d3f9d0f5042649c6f077..2526eac379deaa80f4432e2e7f75e0b2d387f466 100644 (file)
@@ -54,7 +54,7 @@ void InspIRCd::Rehash()
                this->WriteOpers("*** ERROR: Could not open logfile %s: %s", Config->logpath.c_str(), strerror(errno));
        this->RehashUsersAndChans();
        FOREACH_MOD_I(this, I_OnGarbageCollect, OnGarbageCollect());
-       this->Config->Read(false,NULL);
+       /*this->Config->Read(false,NULL);*/
        this->ResetMaxBans();
        this->Res->Rehash();
        FOREACH_MOD_I(this,I_OnRehash,OnRehash(NULL,""));
@@ -65,7 +65,7 @@ void InspIRCd::RehashServer()
 {
        this->WriteOpers("*** Rehashing config file");
        this->RehashUsersAndChans();
-       this->Config->Read(false,NULL);
+       /*this->Config->Read(false,NULL);*/
        this->ResetMaxBans();
        this->Res->Rehash();
 }