X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_xline_db.cpp;h=404bc6b027de2c2fa33e740b9566b060667e62fa;hb=b71f1affeaa2dbc1d4e5fdf799ab1527a190b0e1;hp=683c14afa408fedf96fcdd82ddad23d8dc4a37fc;hpb=2de11961b8281424fd6ad530862cae9f5e011cd1;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_xline_db.cpp b/src/modules/m_xline_db.cpp index 683c14afa..404bc6b02 100644 --- a/src/modules/m_xline_db.cpp +++ b/src/modules/m_xline_db.cpp @@ -21,6 +21,8 @@ #include "inspircd.h" #include "xline.h" +/* $ModConfig: + * Specify the filename for the xline database here*/ /* $ModDesc: Keeps a dynamic log of all XLines created, and stores them in a seperate conf file (xline.db). */ class ModuleXLineDB : public Module @@ -28,11 +30,22 @@ class ModuleXLineDB : public Module std::vector xlines; bool reading_db; // If this is true, addlines are as a result of db reading, so don't bother flushing the db to disk. // DO REMEMBER TO SET IT, otherwise it's annoying :P + std::string xlinedbpath; public: - ModuleXLineDB() { + void init() + { Implementation eventlist[] = { I_OnAddLine, I_OnDelLine, I_OnExpireLine }; - ServerInstance->Modules->Attach(eventlist, this, 3); + ServerInstance->Modules->Attach(eventlist, this, sizeof(eventlist)/sizeof(Implementation)); + /* Load the configuration + * Note: + * this is on purpose not in the OnRehash() method. It would be non-trivial to change the database on-the-fly. + * Imagine a scenario where the new file already exists. Merging the current XLines with the existing database is likely a bad idea + * ...and so is discarding all current in-memory XLines for the ones in the database. + */ + ConfigTag* Conf = ServerInstance->Config->ConfValue("xlinedb"); + xlinedbpath = Conf->getString("filename", DATA_PATH "/xline.db"); + reading_db = true; ReadDatabase(); reading_db = false; @@ -99,7 +112,8 @@ class ModuleXLineDB : public Module * -- w00t */ ServerInstance->Logs->Log("m_xline_db",DEBUG, "xlinedb: Opening temporary database"); - f = fopen("data/xline.db.new", "w"); + std::string xlinenewdbpath = xlinedbpath + ".new"; + f = fopen(xlinenewdbpath.c_str(), "w"); if (!f) { ServerInstance->Logs->Log("m_xline_db",DEBUG, "xlinedb: Cannot create database! %s (%d)", strerror(errno), errno); @@ -139,8 +153,16 @@ class ModuleXLineDB : public Module return false; } +#ifdef _WIN32 + if (remove(xlinedbpath.c_str())) + { + ServerInstance->Logs->Log("m_xline_db",DEBUG, "xlinedb: Cannot remove old database! %s (%d)", strerror(errno), errno); + ServerInstance->SNO->WriteToSnoMask('a', "database: cannot remove old database: %s (%d)", strerror(errno), errno); + return false; + } +#endif // Use rename to move temporary to new db - this is guarenteed not to fuck up, even in case of a crash. - if (rename("data/xline.db.new", "data/xline.db") < 0) + if (rename(xlinenewdbpath.c_str(), xlinedbpath.c_str()) < 0) { ServerInstance->Logs->Log("m_xline_db",DEBUG, "xlinedb: Cannot move new to old database! %s (%d)", strerror(errno), errno); ServerInstance->SNO->WriteToSnoMask('a', "database: cannot replace old with new db: %s (%d)", strerror(errno), errno); @@ -156,7 +178,7 @@ class ModuleXLineDB : public Module char linebuf[MAXBUF]; unsigned int lineno = 0; - f = fopen("data/xline.db", "r"); + f = fopen(xlinedbpath.c_str(), "r"); if (!f) { if (errno == ENOENT)