1
0
mirror of https://github.com/anope/anope.git synced 2026-07-06 14:33:13 +02:00

Make module version system work

This commit is contained in:
Adam
2015-02-03 19:38:23 -05:00
parent dc5039e994
commit 64ca357b13
6 changed files with 166 additions and 79 deletions
+1 -6
View File
@@ -11,7 +11,7 @@
*/
#include "services.h"
#include "version.h"
#include "build.h"
#include "modules.h"
#include "lists.h"
#include "config.h"
@@ -617,11 +617,6 @@ const Anope::string Anope::LastError()
#endif
}
ModuleVersion Module::GetVersion() const
{
return ModuleVersion(VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH);
}
Anope::string Anope::Version()
{
#ifdef VERSION_GIT
+58 -28
View File
@@ -166,6 +166,46 @@ ModuleReturn ModuleManager::LoadModule(const Anope::string &modname, User *u)
return MOD_ERR_NOLOAD;
}
try
{
ModuleVersion v = GetVersion(handle);
if (v.GetMajor() < Anope::VersionMajor() || (v.GetMajor() == Anope::VersionMajor() && v.GetMinor() < Anope::VersionMinor()))
{
Log() << "Module " << modname << " is compiled against an older version of Anope " << v.GetMajor() << "." << v.GetMinor() << ", this is " << Anope::VersionShort();
dlclose(handle);
return MOD_ERR_VERSION;
}
else if (v.GetMajor() > Anope::VersionMajor() || (v.GetMajor() == Anope::VersionMajor() && v.GetMinor() > Anope::VersionMinor()))
{
Log() << "Module " << modname << " is compiled against a newer version of Anope " << v.GetMajor() << "." << v.GetMinor() << ", this is " << Anope::VersionShort();
dlclose(handle);
return MOD_ERR_VERSION;
}
else if (v.GetPatch() < Anope::VersionPatch())
{
Log() << "Module " << modname << " is compiled against an older version of Anope, " << v.GetMajor() << "." << v.GetMinor() << "." << v.GetPatch() << ", this is " << Anope::VersionShort();
dlclose(handle);
return MOD_ERR_VERSION;
}
else if (v.GetPatch() > Anope::VersionPatch())
{
Log() << "Module " << modname << " is compiled against a newer version of Anope, " << v.GetMajor() << "." << v.GetMinor() << "." << v.GetPatch() << ", this is " << Anope::VersionShort();
dlclose(handle);
return MOD_ERR_VERSION;
}
else
{
Log(LOG_DEBUG_2) << "Module " << modname << " is compiled against current version of Anope " << Anope::VersionShort();
}
}
catch (const ModuleException &ex)
{
/* this error has already been logged */
dlclose(handle);
return MOD_ERR_NOLOAD;
}
dlerror();
Module *(*func)(const Anope::string &, const Anope::string &) = function_cast<Module *(*)(const Anope::string &, const Anope::string &)>(dlsym(handle, "AnopeInit"));
err = dlerror();
@@ -206,34 +246,6 @@ ModuleReturn ModuleManager::LoadModule(const Anope::string &modname, User *u)
m->filename = pbuf;
m->handle = handle;
ModuleVersion v = m->GetVersion();
if (v.GetMajor() < Anope::VersionMajor() || (v.GetMajor() == Anope::VersionMajor() && v.GetMinor() < Anope::VersionMinor()))
{
Log() << "Module " << modname << " is compiled against an older version of Anope " << v.GetMajor() << "." << v.GetMinor() << ", this is " << Anope::VersionShort();
DeleteModule(m);
return MOD_ERR_VERSION;
}
else if (v.GetMajor() > Anope::VersionMajor() || (v.GetMajor() == Anope::VersionMajor() && v.GetMinor() > Anope::VersionMinor()))
{
Log() << "Module " << modname << " is compiled against a newer version of Anope " << v.GetMajor() << "." << v.GetMinor() << ", this is " << Anope::VersionShort();
DeleteModule(m);
return MOD_ERR_VERSION;
}
else if (v.GetPatch() < Anope::VersionPatch())
{
Log() << "Module " << modname << " is compiled against an older version of Anope, " << v.GetMajor() << "." << v.GetMinor() << "." << v.GetPatch() << ", this is " << Anope::VersionShort();
DeleteModule(m);
return MOD_ERR_VERSION;
}
else if (v.GetPatch() > Anope::VersionPatch())
{
Log() << "Module " << modname << " is compiled against a newer version of Anope, " << v.GetMajor() << "." << v.GetMinor() << "." << v.GetPatch() << ", this is " << Anope::VersionShort();
DeleteModule(m);
return MOD_ERR_VERSION;
}
else
Log(LOG_DEBUG_2) << "Module " << modname << " is compiled against current version of Anope " << Anope::VersionShort();
/* Initialize config */
try
{
@@ -272,6 +284,24 @@ ModuleReturn ModuleManager::LoadModule(const Anope::string &modname, User *u)
return MOD_ERR_OK;
}
ModuleVersion ModuleManager::GetVersion(void *handle)
{
dlerror();
ModuleVersion (*func)() = function_cast<ModuleVersion (*)()>(dlsym(handle, "AnopeVersion"));;
if (!func)
{
Log() << "No version function found, not an Anope module";
const char *err = dlerror();
if (err && *err)
Log(LOG_DEBUG) << err;
throw ModuleException("No version");
}
return func();
}
ModuleReturn ModuleManager::UnloadModule(Module *m, User *u)
{
if (!m)
+3 -3
View File
@@ -1,7 +1,7 @@
#!/bin/sh
VERSION_MAJOR="2"
VERSION_MINOR="0"
VERSION_PATCH="2"
VERSION_MAJOR=2
VERSION_MINOR=0
VERSION_PATCH=2
VERSION_EXTRA="-git"