diff options
-rw-r--r-- | include/anope.h | 22 | ||||
-rw-r--r-- | modules/database/db_atheme.cpp | 2 | ||||
-rw-r--r-- | modules/database/db_flatfile.cpp | 16 | ||||
-rw-r--r-- | modules/database/db_old.cpp | 2 | ||||
-rw-r--r-- | modules/extra/sqlite.cpp | 3 | ||||
-rw-r--r-- | modules/operserv/os_logsearch.cpp | 2 | ||||
-rw-r--r-- | modules/webcpanel/webcpanel.cpp | 2 | ||||
-rw-r--r-- | src/config.cpp | 4 | ||||
-rw-r--r-- | src/init.cpp | 7 | ||||
-rw-r--r-- | src/logger.cpp | 2 | ||||
-rw-r--r-- | src/misc.cpp | 24 | ||||
-rw-r--r-- | src/module.cpp | 2 | ||||
-rw-r--r-- | src/modulemanager.cpp | 8 |
13 files changed, 69 insertions, 27 deletions
diff --git a/include/anope.h b/include/anope.h index 91d073133..e1505652a 100644 --- a/include/anope.h +++ b/include/anope.h @@ -579,6 +579,28 @@ namespace Anope /** Update the current time. */ extern CoreExport void UpdateTime(); + + /** Expands a path fragment that is relative to the base directory. + * @param base The base directory that it is relative to. + * @param fragment The fragment to expand. + */ + extern CoreExport Anope::string Expand(const Anope::string &base, const Anope::string &fragment); + + /** Expands a config path. */ + inline auto ExpandConfig(const Anope::string &path) { return Expand(ConfigDir, path); } + + /** Expands a data path. */ + inline auto ExpandData(const Anope::string &path) { return Expand(DataDir, path); } + + /** Expands a locale path. */ + inline auto ExpandLocale(const Anope::string &path) { return Expand(LocaleDir, path); } + + /** Expands a log path. */ + inline auto ExpandLog(const Anope::string &path) { return Expand(LogDir, path); } + + /** Expands a module path. */ + inline auto ExpandModule(const Anope::string &path) { return Expand(ModuleDir, path); } + } /** sepstream allows for splitting token separated lists. diff --git a/modules/database/db_atheme.cpp b/modules/database/db_atheme.cpp index ca53e955b..60870f7a7 100644 --- a/modules/database/db_atheme.cpp +++ b/modules/database/db_atheme.cpp @@ -1290,7 +1290,7 @@ public: EventReturn OnLoadDatabase() override { - const auto dbname = Anope::DataDir + "/" + Config->GetModule(this)->Get<const Anope::string>("database", "atheme.db"); + const auto dbname = Anope::ExpandData(Config->GetModule(this)->Get<const Anope::string>("database", "atheme.db")); std::ifstream fd(dbname.str()); if (!fd.is_open()) { diff --git a/modules/database/db_flatfile.cpp b/modules/database/db_flatfile.cpp index 63c18f744..471c5fc00 100644 --- a/modules/database/db_flatfile.cpp +++ b/modules/database/db_flatfile.cpp @@ -130,8 +130,8 @@ class DBFlatFile final for (const auto &db : dbs) { - const Anope::string &oldname = Anope::DataDir + "/" + db; - Anope::string newname = Anope::DataDir + "/backups/" + db + "-" + Anope::ToString(tm->tm_year + 1900) + Anope::printf("-%02i-", tm->tm_mon + 1) + Anope::printf("%02i", tm->tm_mday); + const auto oldname = Anope::ExpandData(db); + const auto newname = Anope::ExpandData("backups/" + db + "-" + Anope::ToString(tm->tm_year + 1900) + Anope::printf("-%02i-", tm->tm_mon + 1) + Anope::printf("%02i", tm->tm_mday)); /* Backup already exists or no database to backup */ if (Anope::IsFile(newname) || !Anope::IsFile(oldname)) @@ -216,7 +216,7 @@ public: { std::set<Anope::string> tried_dbs; - const Anope::string &db_name = Anope::DataDir + "/" + Config->GetModule(this)->Get<const Anope::string>("database", "anope.db"); + const auto db_name = Anope::ExpandData(Config->GetModule(this)->Get<const Anope::string>("database", "anope.db")); std::fstream fd(db_name.c_str(), std::ios_base::in | std::ios_base::binary); if (!fd.is_open()) @@ -296,9 +296,9 @@ public: Anope::string db_name; if (s_type->GetOwner()) - db_name = Anope::DataDir + "/module_" + s_type->GetOwner()->name + ".db"; + db_name = Anope::ExpandData("module_" + s_type->GetOwner()->name + ".db"); else - db_name = Anope::DataDir + "/" + Config->GetModule(this)->Get<const Anope::string>("database", "anope.db"); + db_name = Anope::ExpandData(Config->GetModule(this)->Get<const Anope::string>("database", "anope.db")); std::fstream *fs = databases[s_type->GetOwner()] = new std::fstream((db_name + ".tmp").c_str(), std::ios_base::out | std::ios_base::trunc | std::ios_base::binary); @@ -325,7 +325,7 @@ public: for (auto &[mod, f] : databases) { - const Anope::string &db_name = Anope::DataDir + "/" + (mod ? (mod->name + ".db") : Config->GetModule(this)->Get<const Anope::string>("database", "anope.db")); + const auto db_name = Anope::ExpandData((mod ? (mod->name + ".db") : Config->GetModule(this)->Get<const Anope::string>("database", "anope.db"))); if (!f->is_open() || !f->good()) { @@ -367,9 +367,9 @@ public: Anope::string db_name; if (stype->GetOwner()) - db_name = Anope::DataDir + "/module_" + stype->GetOwner()->name + ".db"; + db_name = Anope::ExpandData("module_" + stype->GetOwner()->name + ".db"); else - db_name = Anope::DataDir + "/" + Config->GetModule(this)->Get<const Anope::string>("database", "anope.db"); + db_name = Anope::ExpandData(Config->GetModule(this)->Get<const Anope::string>("database", "anope.db")); std::fstream fd(db_name.c_str(), std::ios_base::in | std::ios_base::binary); if (!fd.is_open()) diff --git a/modules/database/db_old.cpp b/modules/database/db_old.cpp index 1cb4a699a..ba861938d 100644 --- a/modules/database/db_old.cpp +++ b/modules/database/db_old.cpp @@ -321,7 +321,7 @@ static dbFILE *open_db_read(const char *service, const char *filename, int versi int myversion; f = new dbFILE; - strscpy(f->filename, (Anope::DataDir + "/" + filename).c_str(), sizeof(f->filename)); + strscpy(f->filename, Anope::ExpandData(filename).c_str(), sizeof(f->filename)); f->mode = 'r'; fp = fopen(f->filename, "rb"); if (!fp) diff --git a/modules/extra/sqlite.cpp b/modules/extra/sqlite.cpp index 4968e8e0d..2454c838c 100644 --- a/modules/extra/sqlite.cpp +++ b/modules/extra/sqlite.cpp @@ -118,8 +118,7 @@ public: if (this->SQLiteServices.find(connname) == this->SQLiteServices.end()) { - Anope::string database = Anope::DataDir + "/" + block->Get<const Anope::string>("database", "anope"); - + auto database = Anope::ExpandData(block->Get<const Anope::string>("database", "anope")); try { auto *ss = new SQLiteService(this, connname, database); diff --git a/modules/operserv/os_logsearch.cpp b/modules/operserv/os_logsearch.cpp index 0282644b2..cd85241e7 100644 --- a/modules/operserv/os_logsearch.cpp +++ b/modules/operserv/os_logsearch.cpp @@ -24,7 +24,7 @@ class CommandOSLogSearch final strftime(timestamp, sizeof(timestamp), "%Y%m%d", tm); - return Anope::LogDir + "/" + file + "." + timestamp; + return Anope::ExpandLog(file + "." + timestamp); } public: diff --git a/modules/webcpanel/webcpanel.cpp b/modules/webcpanel/webcpanel.cpp index 97ca439e4..0ff4beb1a 100644 --- a/modules/webcpanel/webcpanel.cpp +++ b/modules/webcpanel/webcpanel.cpp @@ -61,7 +61,7 @@ public: Configuration::Block *block = Config->GetModule(this); provider_name = block->Get<const Anope::string>("server", "httpd/main"); template_name = block->Get<const Anope::string>("template", "default"); - template_base = Anope::DataDir + "/modules/webcpanel/templates/" + template_name; + template_base = Anope::ExpandData("modules/webcpanel/templates/" + template_name); page_title = block->Get<const Anope::string>("title", "Anope IRC Services"); provider = ServiceReference<HTTPProvider>("HTTPProvider", provider_name); diff --git a/src/config.cpp b/src/config.cpp index 6a8380464..7b322f8c9 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -697,7 +697,7 @@ const Anope::string &File::GetName() const Anope::string File::GetPath() const { - return (this->executable ? "" : Anope::ConfigDir + "/") + this->name; + return this->executable ? this->name : Anope::ExpandConfig(this->name); } bool File::IsOpen() const @@ -708,7 +708,7 @@ bool File::IsOpen() const bool File::Open() { this->Close(); - this->fp = (this->executable ? popen(this->name.c_str(), "r") : fopen((Anope::ConfigDir + "/" + this->name).c_str(), "r")); + this->fp = (this->executable ? popen(GetPath().c_str(), "r") : fopen(GetPath().c_str(), "r")); return this->fp != NULL; } diff --git a/src/init.cpp b/src/init.cpp index fa7fcff15..7cb136844 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -417,12 +417,9 @@ bool Anope::Init(int ac, char **av) } Log(LOG_TERMINAL) << "Anope " << Anope::Version() << ", " << Anope::VersionBuildString(); + Log(LOG_TERMINAL) << "Using configuration file " << Anope::ExpandConfig(ServicesConf.GetName()); -#ifdef _WIN32 - Log(LOG_TERMINAL) << "Using configuration file " << Anope::ConfigDir << "\\" << ServicesConf.GetName(); -#else - Log(LOG_TERMINAL) << "Using configuration file " << Anope::ConfigDir << "/" << ServicesConf.GetName(); - +#ifndef _WIN32 /* Fork to background */ if (!Anope::NoFork) { diff --git a/src/logger.cpp b/src/logger.cpp index 9813ae150..6290831be 100644 --- a/src/logger.cpp +++ b/src/logger.cpp @@ -52,7 +52,7 @@ static inline Anope::string CreateLogName(const Anope::string &file, time_t t = tm *tm = localtime(&t); strftime(timestamp, sizeof(timestamp), "%Y%m%d", tm); - return Anope::LogDir + "/" + file + "." + timestamp; + return Anope::ExpandLog(file + "." + timestamp); } LogFile::LogFile(const Anope::string &name) : filename(name), stream(name.c_str(), std::ios_base::out | std::ios_base::app) diff --git a/src/misc.cpp b/src/misc.cpp index 1984477f7..861e6ee20 100644 --- a/src/misc.cpp +++ b/src/misc.cpp @@ -23,6 +23,7 @@ #include <climits> #include <numeric> #include <random> +#include <filesystem> #include <sys/stat.h> #include <sys/types.h> #ifndef _WIN32 @@ -808,3 +809,26 @@ void Anope::UpdateTime() CurTimeNs = tv.tv_usec * 1000; #endif } + +Anope::string Anope::Expand(const Anope::string& base, const Anope::string& fragment) +{ + // The fragment is an absolute path, don't modify it. + if (std::filesystem::path(fragment.str()).is_absolute()) + return fragment; + +#ifdef _WIN32 + static constexpr const char separator = '\\'; +#else + static constexpr const char separator = '/'; +#endif + + // The fragment is relative to a home directory, expand that. + if (!fragment.compare(0, 2, "~/", 2)) + { + const auto *homedir = getenv("HOME"); + if (homedir && *homedir) + return Anope::printf("%s%c%s", homedir, separator, fragment.c_str() + 2); + } + + return Anope::printf("%s%c%s", base.c_str(), separator, fragment.c_str()); +} diff --git a/src/module.cpp b/src/module.cpp index 63442e623..0511ad026 100644 --- a/src/module.cpp +++ b/src/module.cpp @@ -46,7 +46,7 @@ Module::Module(const Anope::string &modname, const Anope::string &, ModType modt Anope::string lang; sepstream(language, '.').GetToken(lang); - if (Anope::IsFile(Anope::LocaleDir + "/" + lang + "/LC_MESSAGES/" + modname + ".mo")) + if (Anope::IsFile(Anope::ExpandLocale(lang + "/LC_MESSAGES/" + modname + ".mo"))) { if (!bindtextdomain(this->name.c_str(), Anope::LocaleDir.c_str())) Log() << "Error calling bindtextdomain, " << Anope::LastError(); diff --git a/src/modulemanager.cpp b/src/modulemanager.cpp index c350f8efd..96cb848b6 100644 --- a/src/modulemanager.cpp +++ b/src/modulemanager.cpp @@ -27,7 +27,7 @@ std::vector<Module *> ModuleManager::EventHandlers[I_SIZE]; #ifdef _WIN32 void ModuleManager::CleanupRuntimeDirectory() { - Anope::string dirbuf = Anope::DataDir + "/runtime"; + Anope::string dirbuf = Anope::ExpandData("runtime"); Log(LOG_DEBUG) << "Cleaning out Module run time directory (" << dirbuf << ") - this may take a moment, please wait"; try @@ -55,7 +55,7 @@ void ModuleManager::CleanupRuntimeDirectory() */ static ModuleReturn moduleCopyFile(const Anope::string &name, Anope::string &output) { - Anope::string input = Anope::ModuleDir + "/modules/" + name + DLL_EXT; + const auto input = Anope::ExpandModule("modules/" + name + DLL_EXT); struct stat s; if (stat(input.c_str(), &s) == -1) @@ -133,7 +133,7 @@ ModuleReturn ModuleManager::LoadModule(const Anope::string &modname, User *u) #ifdef _WIN32 /* Generate the filename for the temporary copy of the module */ - Anope::string pbuf = Anope::DataDir + "/runtime/" + modname + DLL_EXT ".XXXXXX"; + const auto pbuf = Anope::ExpandData("runtime/" + modname + DLL_EXT ".XXXXXX"); /* Don't skip return value checking! -GD */ ModuleReturn ret = moduleCopyFile(modname, pbuf); @@ -146,7 +146,7 @@ ModuleReturn ModuleManager::LoadModule(const Anope::string &modname, User *u) return ret; } #else - Anope::string pbuf = Anope::ModuleDir + "/modules/" + modname + DLL_EXT; + const auto pbuf = Anope::ExpandModule("modules/" + modname + DLL_EXT); #endif dlerror(); |