]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/configreader.cpp
Fix typos found by Zaba. Thanks.
[user/henk/code/inspircd.git] / src / configreader.cpp
index 6e9b75c4303aae433300c8ad72d30d0cfa01b78c..2d62f354a6bc5d0496ef2fdca9ccded273a2ccd3 100644 (file)
@@ -593,6 +593,7 @@ void ServerConfig::Read(bool bail, userrec* user)
        InitialConfig Values[] = {
                {"options",     "softlimit",    MAXCLIENTS_S,           new ValueContainerUInt (&this->SoftLimit),              DT_INTEGER, ValidateSoftLimit},
                {"options",     "somaxconn",    SOMAXCONN_S,            new ValueContainerInt  (&this->MaxConn),                DT_INTEGER, ValidateMaxConn},
+               {"options",     "moronbanner",  "Youre banned!",        new ValueContainerChar (this->MoronBanner),             DT_CHARPTR, NoValidation},
                {"server",      "name",         "",                     new ValueContainerChar (this->ServerName),              DT_CHARPTR, ValidateServerName},
                {"server",      "description",  "Configure Me",         new ValueContainerChar (this->ServerDesc),              DT_CHARPTR, NoValidation},
                {"server",      "network",      "Network",              new ValueContainerChar (this->Network),                 DT_CHARPTR, NoValidation},
@@ -937,6 +938,7 @@ bool ServerConfig::LoadConf(ConfigDataHash &target, const char* filename, std::o
        bool in_tag;
        bool in_quote;
        bool in_comment;
+       int character_count = 0;
 
        linenumber = 1;
        in_tag = false;
@@ -968,6 +970,21 @@ bool ServerConfig::LoadConf(ConfigDataHash &target, const char* filename, std::o
        /* Start reading characters... */
        while(conf.get(ch))
        {
+
+               /*
+                * Fix for moronic windows issue spotted by Adremelech.
+                * Some windows editors save text files as utf-16, which is
+                * a total pain in the ass to parse. Users should save in the
+                * right config format! If we ever see a file where the first
+                * byte is 0xFF or 0xFE, or the second is 0xFF or 0xFE, then
+                * this is most likely a utf-16 file. Bail out and insult user.
+                */
+               if ((character_count++ < 2) && (ch == '\xFF' || ch == '\xFE'))
+               {
+                       errorstream << "File " << filename << " cannot be read, as it is encoded in braindead UTF-16. Save your file as plain ASCII!" << std::endl;
+                       return false;
+               }
+
                /*
                 * Here we try and get individual tags on separate lines,
                 * this would be so easy if we just made people format
@@ -980,12 +997,6 @@ bool ServerConfig::LoadConf(ConfigDataHash &target, const char* filename, std::o
                if((ch == '#') && !in_quote)
                        in_comment = true;
 
-               /*if(((ch == '\n') || (ch == '\r')) && in_quote)
-               {
-                       errorstream << "Got a newline within a quoted section, this is probably a typo: " << filename << ":" << linenumber << std::endl;
-                       return false;
-               }*/
-
                switch(ch)
                {
                        case '\n':
@@ -1473,19 +1484,20 @@ bool ServerConfig::ReadFile(file_cache &F, const char* fname)
 
        F.clear();
 
-       if (*fname != '/')
+       if ((*fname != '/') && (*fname != '\\'))
        {
                std::string::size_type pos;
                std::string confpath = ServerInstance->ConfigFileName;
-               if((pos = confpath.rfind("/")) != std::string::npos)
-               {
-                       /* Leaves us with just the path */
-                       std::string newfile = confpath.substr(0, pos) + std::string("/") + fname;
-                       if (!FileExists(newfile.c_str()))
-                               return false;
-                       file =  fopen(newfile.c_str(), "r");
+               std::string newfile = fname;
 
-               }
+               if ((pos = confpath.rfind("/")) != std::string::npos)
+                       newfile = confpath.substr(0, pos) + std::string("/") + fname;
+               else if ((pos = confpath.rfind("\\")) != std::string::npos)
+                       newfile = confpath.substr(0, pos) + std::string("\\") + fname;
+
+               if (!FileExists(newfile.c_str()))
+                       return false;
+               file =  fopen(newfile.c_str(), "r");
        }
        else
        {
@@ -1539,7 +1551,7 @@ bool ServerConfig::FileExists(const char* file)
 char* ServerConfig::CleanFilename(char* name)
 {
        char* p = name + strlen(name);
-       while ((p != name) && (*p != '/')) p--;
+       while ((p != name) && (*p != '/') && (*p != '\\')) p--;
        return (p != name ? ++p : p);
 }
 
@@ -1604,7 +1616,18 @@ bool ServerConfig::DirValid(const char* dirandfile)
 std::string ServerConfig::GetFullProgDir()
 {
        char buffer[PATH_MAX+1];
-
+#ifdef WINDOWS
+       /* Windows has specific api calls to get the exe path that never fail.
+        * For once, windows has something of use, compared to the POSIX code
+        * for this, this is positively neato.
+        */
+       if (GetModuleFileName(NULL, buffer, MAX_PATH))
+       {
+               std::string fullpath = buffer;
+               std::string::size_type n = fullpath.rfind("\\inspircd.exe");
+               return std::string(fullpath, 0, n);
+       }
+#else
        // Get the current working directory
        if (getcwd(buffer, PATH_MAX))
        {
@@ -1621,7 +1644,7 @@ std::string ServerConfig::GetFullProgDir()
                std::string::size_type n = fullpath.rfind("/inspircd");
                return std::string(fullpath, 0, n);
        }
-
+#endif
        return "/";
 }