diff options
-rw-r--r-- | docs/conf/modules.conf.example | 11 | ||||
-rw-r--r-- | src/modules/m_nationalchars.cpp | 19 | ||||
-rw-r--r-- | win/CMakeLists.txt | 4 |
3 files changed, 25 insertions, 9 deletions
diff --git a/docs/conf/modules.conf.example b/docs/conf/modules.conf.example index 32701f0c4..364c30a14 100644 --- a/docs/conf/modules.conf.example +++ b/docs/conf/modules.conf.example @@ -1148,10 +1148,13 @@ # 2) Allows using custom (national) casemapping over the network. #<module name="m_nationalchars.so"> # -# file - filename of existing file in "locales" directory -# casemapping - custom value for 005 numeric (if you want it to be -# different from the filename). Set this to the name of -# the locale if you are specifying an absolute path. +# file - Location of the file which contains casemapping rules. If this +# is a relative path then it is relative to "<PWD>/../locales" +# on UNIX and "<PWD>/locales" on Windows. +# casemapping - The name of the casemapping sent to clients in the 005 +# numeric. If this is not set then it defaults to the name +# of the casemapping file unless the file name contains a +# space in which case you will have to specify it manually. #<nationalchars file="bynets/russian-w1251-charlink" casemapping="ru_RU.cp1251-charlink"> #-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-# diff --git a/src/modules/m_nationalchars.cpp b/src/modules/m_nationalchars.cpp index bf95f0f9f..bc90c9fad 100644 --- a/src/modules/m_nationalchars.cpp +++ b/src/modules/m_nationalchars.cpp @@ -284,11 +284,19 @@ class ModuleNationalChars : public Module { ConfigTag* tag = ServerInstance->Config->ConfValue("nationalchars"); charset = tag->getString("file"); - casemapping = tag->getString("casemapping", charset); + casemapping = tag->getString("casemapping", ServerConfig::CleanFilename(charset.c_str())); + if (casemapping.find(' ') != std::string::npos) + throw ModuleException("<nationalchars:casemapping> must not contain any spaces!"); +#if defined _WIN32 + if (!ServerInstance->Config->StartsWithWindowsDriveLetter(charset)) + charset.insert(0, "./locales/"); +#else if(charset[0] != '/') charset.insert(0, "../locales/"); +#endif unsigned char * tables[8] = { m_additional, m_additionalMB, m_additionalUp, m_lower, m_upper, m_additionalUtf8, m_additionalUtf8range, m_additionalUtf8interval }; - loadtables(charset, tables, 8, 5); + if (!loadtables(charset, tables, 8, 5)) + throw ModuleException("The locale file failed to load. Check your log file for more information."); forcequit = tag->getBool("forcequit"); CheckForceQuit("National character set changed"); CheckRehash(); @@ -330,13 +338,13 @@ class ModuleNationalChars : public Module } /*so Bynets Unreal distribution stuff*/ - void loadtables(std::string filename, unsigned char ** tables, unsigned char cnt, char faillimit) + bool loadtables(std::string filename, unsigned char ** tables, unsigned char cnt, char faillimit) { std::ifstream ifs(filename.c_str()); if (ifs.fail()) { ServerInstance->Logs->Log("m_nationalchars",DEFAULT,"loadtables() called for missing file: %s", filename.c_str()); - return; + return false; } for (unsigned char n=0; n< cnt; n++) @@ -351,11 +359,12 @@ class ModuleNationalChars : public Module if (loadtable(ifs, tables[n], 255) && (n < faillimit)) { ServerInstance->Logs->Log("m_nationalchars",DEFAULT,"loadtables() called for illegal file: %s (line %d)", filename.c_str(), n+1); - return; + return false; } } makereverse(m_additional, m_reverse_additional, sizeof(m_additional)); + return true; } unsigned char symtoi(const char *t,unsigned char base) diff --git a/win/CMakeLists.txt b/win/CMakeLists.txt index 087bd7970..10653cf74 100644 --- a/win/CMakeLists.txt +++ b/win/CMakeLists.txt @@ -74,6 +74,10 @@ install(FILES ${EXTRA_DLLS} DESTINATION .) file(GLOB_RECURSE EXAMPLE_CONFIGS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "${INSPIRCD_BASE}/docs/conf/*.example") install(FILES ${EXAMPLE_CONFIGS} DESTINATION conf) +# Install nationalchars files +file(GLOB_RECURSE EXAMPLE_LOCALES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "${INSPIRCD_BASE}/locales/*") +install(FILES ${EXAMPLE_LOCALES} DESTINATION locales) + # Create an empty data and logs directory and install them file(MAKE_DIRECTORY ${DATA_PATH}) install(DIRECTORY ${DATA_PATH} DESTINATION .) |