]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/inspircd_io.cpp
Removed lowercasing of servername on validation
[user/henk/code/inspircd.git] / src / inspircd_io.cpp
index 825b4eb313d387f9f59e73e1293bda128b1d4295..f4ab7ce071ea360ac33e41101015453cc51b528d 100644 (file)
@@ -262,7 +262,7 @@ bool ValidateServerName(const char* tag, const char* value, void* data)
                log(DEFAULT,"WARNING: <server:name> '%s' is not a fully-qualified domain name. Changed to '%s%c'",x,x,'.');
                charlcat(x,'.',MAXBUF);
        }
-       strlower(x);
+       //strlower(x);
        return true;
 }
 
@@ -318,6 +318,8 @@ bool ValidateRules(const char* tag, const char* value, void* data)
        return true;
 }
 
+/* Callback called before processing the first <connect> tag
+ */
 bool InitConnect(const char* tag)
 {
        log(DEFAULT,"Reading connect classes...");
@@ -325,10 +327,12 @@ bool InitConnect(const char* tag)
        return true;
 }
 
+/* Callback called to process a single <connect> tag
+ */
 bool DoConnect(const char* tag, char** entries, void** values, int* types)
 {
        ConnectClass c;
-       char* allow = (char*)values[0];
+       char* allow = (char*)values[0]; /* Yeah, there are a lot of values. Live with it. */
        char* deny = (char*)values[1];
        char* password = (char*)values[2];
        int* timeout = (int*)values[3];
@@ -340,64 +344,70 @@ bool DoConnect(const char* tag, char** entries, void** values, int* types)
        int* localmax = (int*)values[9];
        int* globalmax = (int*)values[10];
 
-        if (*allow)
-        {
-                c.host = allow;
-                c.type = CC_ALLOW;
-                c.pass = password;
-                c.registration_timeout = *timeout;
-                c.pingtime = *pingfreq;
-                c.flood = *flood;
-                c.threshold = *threshold;
-                c.sendqmax = *sendq;
-                c.recvqmax = *recvq;
-                c.maxlocal = *localmax;
-                c.maxglobal = *globalmax;
-
-
-                if (c.maxlocal == 0)
+       if (*allow)
+       {
+               c.host = allow;
+               c.type = CC_ALLOW;
+               c.pass = password;
+               c.registration_timeout = *timeout;
+               c.pingtime = *pingfreq;
+               c.flood = *flood;
+               c.threshold = *threshold;
+               c.sendqmax = *sendq;
+               c.recvqmax = *recvq;
+               c.maxlocal = *localmax;
+               c.maxglobal = *globalmax;
+
+
+               if (c.maxlocal == 0)
                        c.maxlocal = 3;
-                if (c.maxglobal == 0)
+               if (c.maxglobal == 0)
                        c.maxglobal = 3;
-                if (c.threshold == 0)
-                {
+               if (c.threshold == 0)
+               {
                        c.threshold = 1;
                        c.flood = 999;
                        log(DEFAULT,"Warning: Connect allow line '%s' has no flood/threshold settings. Setting this tag to 999 lines in 1 second.",c.host.c_str());
-                }
-                if (c.sendqmax == 0)
+               }
+               if (c.sendqmax == 0)
                        c.sendqmax = 262114;
-                if (c.recvqmax == 0)
+               if (c.recvqmax == 0)
                        c.recvqmax = 4096;
-                if (c.registration_timeout == 0)
+               if (c.registration_timeout == 0)
                        c.registration_timeout = 90;
-                if (c.pingtime == 0)
+               if (c.pingtime == 0)
                        c.pingtime = 120;
-                Config->Classes.push_back(c);
-        }
-        else
-        {
-                c.host = deny;
-                c.type = CC_DENY;
-                Config->Classes.push_back(c);
-                log(DEBUG,"Read connect class type DENY, host=%s",deny);
-        }
+               Config->Classes.push_back(c);
+       }
+       else
+       {
+               c.host = deny;
+               c.type = CC_DENY;
+               Config->Classes.push_back(c);
+               log(DEBUG,"Read connect class type DENY, host=%s",deny);
+       }
 
        return true;
 }
 
+/* Callback called when there are no more <connect> tags
+ */
 bool DoneConnect(const char* tag)
 {
        log(DEBUG,"DoneConnect called for tag: %s",tag);
        return true;
 }
 
+/* Callback called before processing the first <uline> tag
+ */
 bool InitULine(const char* tag)
 {
        Config->ulines.clear();
        return true;
 }
 
+/* Callback called to process a single <uline> tag
+ */
 bool DoULine(const char* tag, char** entries, void** values, int* types)
 {
        char* server = (char*)values[0];
@@ -406,11 +416,15 @@ bool DoULine(const char* tag, char** entries, void** values, int* types)
        return true;
 }
 
+/* Callback called when there are no more <uline> tags
+ */
 bool DoneULine(const char* tag)
 {
        return true;
 }
 
+/* Callback called before processing the first <module> tag
+ */
 bool InitModule(const char* tag)
 {
        old_module_names.clear();
@@ -424,6 +438,8 @@ bool InitModule(const char* tag)
        return true;
 }
 
+/* Callback called to process a single <module> tag
+ */
 bool DoModule(const char* tag, char** entries, void** values, int* types)
 {
        char* modname = (char*)values[0];
@@ -431,45 +447,51 @@ bool DoModule(const char* tag, char** entries, void** values, int* types)
        return true;
 }
 
+/* Callback called when there are no more <module> tags
+ */
 bool DoneModule(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
-        for (std::vector<std::string>::iterator _new = new_module_names.begin(); _new != new_module_names.end(); _new++)
-        {
-                bool added = true;
-
-                for (std::vector<std::string>::iterator old = old_module_names.begin(); old != old_module_names.end(); old++)
-                {
-                        if (*old == *_new)
-                                added = false;
-                }
-
-                if (added)
-                        added_modules.push_back(*_new);
-        }
-
-        for (std::vector<std::string>::iterator oldm = old_module_names.begin(); oldm != old_module_names.end(); oldm++)
-        {
-                bool removed = true;
-                for (std::vector<std::string>::iterator newm = new_module_names.begin(); newm != new_module_names.end(); newm++)
-                {
-                        if (*newm == *oldm)
-                                removed = false;
-                }
-
-                if (removed)
-                        removed_modules.push_back(*oldm);
-        }
+       // 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
+       for (std::vector<std::string>::iterator _new = new_module_names.begin(); _new != new_module_names.end(); _new++)
+       {
+               bool added = true;
+
+               for (std::vector<std::string>::iterator old = old_module_names.begin(); old != old_module_names.end(); old++)
+               {
+                       if (*old == *_new)
+                               added = false;
+               }
+
+               if (added)
+                       added_modules.push_back(*_new);
+       }
+
+       for (std::vector<std::string>::iterator oldm = old_module_names.begin(); oldm != old_module_names.end(); oldm++)
+       {
+               bool removed = true;
+               for (std::vector<std::string>::iterator newm = new_module_names.begin(); newm != new_module_names.end(); newm++)
+               {
+                       if (*newm == *oldm)
+                               removed = false;
+               }
+
+               if (removed)
+                       removed_modules.push_back(*oldm);
+       }
        return true;
 }
 
+/* Callback called before processing the first <banlist> tag
+ */
 bool InitMaxBans(const char* tag)
 {
        Config->maxbans.clear();
        return true;
 }
 
+/* Callback called to process a single <banlist> tag
+ */
 bool DoMaxBans(const char* tag, char** entries, void** values, int* types)
 {
        char* channel = (char*)values[0];
@@ -478,6 +500,8 @@ bool DoMaxBans(const char* tag, char** entries, void** values, int* types)
        return true;
 }
 
+/* Callback called when there are no more <banlist> tags.
+ */
 bool DoneMaxBans(const char* tag)
 {
        return true;
@@ -485,10 +509,19 @@ bool DoneMaxBans(const char* tag)
 
 void ServerConfig::Read(bool bail, userrec* user)
 {
-       char debug[MAXBUF];
-       char dataline[1024];
-       std::stringstream errstr;
-
+       char debug[MAXBUF];             /* Temporary buffer for debugging value */
+       char dataline[1024];            /* Temporary buffer for error output */
+       char* convert;                  /* Temporary buffer used for reading singular values into */
+       char* data[12];                 /* Temporary buffers for reading multiple occurance tags into */
+       void* ptr[12];                  /* Temporary pointers for passing to callbacks */
+       int r_i[12];                    /* Temporary array for casting */
+       int rem = 0, add = 0;           /* Number of modules added, number of modules removed */
+       std::stringstream errstr;       /* String stream containing the error output */
+
+       /* These tags MUST occur and must ONLY occur once in the config file */
+       static char* Once[] = { "server", "admin", "files", "power", "options", "pid", NULL };
+
+       /* These tags can occur ONCE or not at all */
        static InitialConfig Values[] = {
                {"options",     "softlimit",            &this->SoftLimit,               DT_INTEGER, ValidateSoftLimit},
                {"options",     "somaxconn",            &this->MaxConn,                 DT_INTEGER, ValidateMaxConn},
@@ -523,11 +556,14 @@ void ServerConfig::Read(bool bail, userrec* user)
                {NULL}
        };
 
+       /* These tags can occur multiple times, and therefore they have special code to read them
+        * which is different to the code for reading the singular tags listed above.
+        */
        static MultiConfig MultiValues[] = {
 
                {"connect",
                                {"allow",       "deny",         "password",     "timeout",      "pingfreq",     "flood",
-                               "threshold",    "sendq",        "recvq",        "localmax",     "globalmax",    NULL},
+                               "threshold",    "sendq",        "recvq",        "localmax",     "globalmax",    NULL},
                                {DT_CHARPTR,    DT_CHARPTR,     DT_CHARPTR,     DT_INTEGER,     DT_INTEGER,     DT_INTEGER,
                                 DT_INTEGER,    DT_INTEGER,     DT_INTEGER,     DT_INTEGER,     DT_INTEGER},
                                InitConnect, DoConnect, DoneConnect},
@@ -575,13 +611,15 @@ void ServerConfig::Read(bool bail, userrec* user)
                {"class",
                                {"name",        "commands",     NULL},
                                {DT_CHARPTR,    DT_CHARPTR},
-                               InitClasss, DoClass, DoneClassesAndTypes},
+                               InitClasses, DoClass, DoneClassesAndTypes},
 
                {NULL}
        };
-       
+
        include_stack.clear();
 
+       /* Initially, load the config into memory, bail if there are errors
+        */
        if (!LoadConf(CONFIG_FILE,&Config->config_f,&errstr))
        {
                errstr.seekg(0);
@@ -617,15 +655,14 @@ void ServerConfig::Read(bool bail, userrec* user)
                }
        }
 
-       /* Check we dont have more than one of singular tags
+       /* Check we dont have more than one of singular tags, or any of them missing
         */
-       if (!CheckOnce("server",bail,user) || !CheckOnce("admin",bail,user) || !CheckOnce("files",bail,user)
-               || !CheckOnce("power",bail,user) || !CheckOnce("options",bail,user) || !CheckOnce("pid",bail,user))
-       {
-               return;
-       }
+       for (int Index = 0; Once[Index]; Index++)
+               if (!CheckOnce(Once[Index],bail,user))
+                       return;
 
-       char* convert;
+       /* Read the values of all the tags which occur once or not at all, and call their callbacks.
+        */
        for (int Index = 0; Values[Index].tag; Index++)
        {
                int* val_i = (int*) Values[Index].val;
@@ -658,13 +695,15 @@ void ServerConfig::Read(bool bail, userrec* user)
                Values[Index].validation_function(Values[Index].tag, Values[Index].value, Values[Index].val);
        }
 
-       char* data[12];
-       void* ptr[12];
-       int r_i[12];
-
+       /* Claim memory for use when reading multiple tags
+        */
        for (int n = 0; n < 12; n++)
                data[n] = new char[MAXBUF];
 
+       /* Read the multiple-tag items (class tags, connect tags, etc)
+        * and call the callbacks associated with them. We have three
+        * callbacks for these, a 'start', 'item' and 'end' callback.
+        */
        for (int Index = 0; MultiValues[Index].tag; Index++)
        {
                MultiValues[Index].init_function(MultiValues[Index].tag);
@@ -700,6 +739,8 @@ void ServerConfig::Read(bool bail, userrec* user)
                MultiValues[Index].finish_function(MultiValues[Index].tag);
        }
 
+       /* Free any memory we claimed
+        */
        for (int n = 0; n < 12; n++)
                delete[] data[n];
 
@@ -707,11 +748,11 @@ void ServerConfig::Read(bool bail, userrec* user)
        WritePID(Config->PID);
 
        log(DEFAULT,"Done reading configuration file, InspIRCd is now starting.");
+
+       /* If we're rehashing, let's load any new modules, and unload old ones
+        */
        if (!bail)
        {
-               log(DEFAULT,"Adding and removing modules due to rehash...");
-
-               int rem = 0, add = 0;
                if (!removed_modules.empty())
                        for (std::vector<std::string>::iterator removing = removed_modules.begin(); removing != removed_modules.end(); removing++)
                        {
@@ -754,7 +795,6 @@ void ServerConfig::Read(bool bail, userrec* user)
        }
 }
 
-
 void Exit (int status)
 {
        if (Config->log_file)
@@ -799,7 +839,7 @@ void Start (void)
        printf("Name concept:\t\t\033[1;32mLord_Zathras\033[0m\n\n");
 }
 
-void WritePID(std::string filename)
+void WritePID(const std::string &filename)
 {
        ofstream outfile(filename.c_str());
        if (outfile.is_open())