This covers the code changes for the datadir move (which is now finished)

Based on darix' patch I wrote this. Modperl's changes were not tested since I
didn't find someone who could test it. Well...

Ah and btw it regenerates configure


git-svn-id: https://znc.svn.sourceforge.net/svnroot/znc/trunk@902 726aef4b-f618-498e-8847-2d620e286838
This commit is contained in:
psychon
2007-12-12 21:15:44 +00:00
parent 608fbdbdb0
commit 1360effd31
8 changed files with 105 additions and 72 deletions
+16 -17
View File
@@ -201,13 +201,14 @@ CModule* CSocket::GetModule() const { return m_pModule; }
const CString& CSocket::GetLabel() const { return m_sLabel; }
/////////////////// !Socket ///////////////////
CModule::CModule(void* pDLL, CUser* pUser, const CString& sModName) {
CModule::CModule(void* pDLL, CUser* pUser, const CString& sModName, const CString& sDataDir) {
m_bFake = false;
m_pDLL = pDLL;
m_pManager = &(CZNC::Get().GetManager());;
m_pUser = pUser;
m_pClient = NULL;
m_sModName = sModName;
m_sDataDir = sDataDir;
if (m_pUser) {
m_sSavePath = m_pUser->GetUserPath() + "/moddata/" + m_sModName;
@@ -215,13 +216,14 @@ CModule::CModule(void* pDLL, CUser* pUser, const CString& sModName) {
}
}
CModule::CModule(void* pDLL, const CString& sModName) {
CModule::CModule(void* pDLL, const CString& sModName, const CString& sDataDir) {
m_bFake = false;
m_pDLL = pDLL;
m_pManager = &(CZNC::Get().GetManager());
m_pUser = NULL;
m_pClient = NULL;
m_sModName = sModName;
m_sDataDir = sDataDir;
m_sSavePath = CZNC::Get().GetZNCPath() + "/moddata/" + m_sModName;
LoadRegistry();
@@ -472,7 +474,6 @@ void CModule::ListSockets() {
}
}
const CString& CModule::GetModName() const { return m_sModName; }
CString CModule::GetModNick() const { return ((m_pUser) ? m_pUser->GetStatusPrefix() : "*") + m_sModName; }
bool CModule::OnLoad(const CString& sArgs, CString& sMessage) { sMessage = ""; return true; }
@@ -678,15 +679,15 @@ bool CModules::LoadModule(const CString& sModule, const CString& sArgs, CUser* p
return false;
}
CString sModPath = FindModPath(sModule);
CString sModPath, sDataPath;
if (sModPath.empty()) {
if (!CZNC::Get().FindModPath(sModule, sModPath, sDataPath)) {
sRetMsg = "Unable to find module [" + sModule + "]";
return false;
}
if (bFake) {
CModule* pModule = new CModule(NULL, sModule);
CModule* pModule = new CModule(NULL, sModule, sDataPath);
pModule->SetArgs(sArgs);
pModule->SetDescription("<<Fake Module>>");
pModule->SetFake(true);
@@ -751,7 +752,8 @@ bool CModules::LoadModule(const CString& sModule, const CString& sArgs, CUser* p
CModule* pModule = NULL;
if (pUser) {
typedef CModule* (*fp)(void*, CUser* pUser, const CString& sModName);
typedef CModule* (*fp)(void*, CUser* pUser,
const CString& sModName, const CString& sDataPath);
fp Load = (fp) dlsym(p, "Load");
if (!Load) {
@@ -760,9 +762,10 @@ bool CModules::LoadModule(const CString& sModule, const CString& sArgs, CUser* p
return false;
}
pModule = Load(p, pUser, sModule);
pModule = Load(p, pUser, sModule, sDataPath);
} else {
typedef CModule* (*fp)(void*, const CString& sModName);
typedef CModule* (*fp)(void*, const CString& sModName,
const CString& sDataPath);
fp Load = (fp) dlsym(p, "Load");
if (!Load) {
@@ -771,7 +774,7 @@ bool CModules::LoadModule(const CString& sModule, const CString& sArgs, CUser* p
return false;
}
pModule = Load(p, sModule);
pModule = Load(p, sModule, sDataPath);
}
pModule->SetDescription(GetDesc());
@@ -879,10 +882,6 @@ bool CModules::ReloadModule(const CString& sModule, const CString& sArgs, CUser*
return true;
}
CString CModules::FindModPath(const CString& sModule) {
return CZNC::Get().FindModPath(sModule);
}
bool CModules::GetModInfo(CModInfo& ModInfo, const CString& sModule) {
for (unsigned int a = 0; a < sModule.length(); a++) {
const char& c = sModule[a];
@@ -892,9 +891,9 @@ bool CModules::GetModInfo(CModInfo& ModInfo, const CString& sModule) {
}
}
CString sModPath = FindModPath(sModule);
if (sModPath.empty()) {
CString sModPath, sTmp;
if (!CZNC::Get().FindModPath(sModule, sModPath, sTmp)) {
return false;
}
+36 -23
View File
@@ -37,30 +37,39 @@ using std::set;
#endif
#define MODCONSTRUCTOR(CLASS) \
CLASS(void *pDLL, CUser* pUser, const CString& sModName) : CModule(pDLL, pUser, sModName)
CLASS(void *pDLL, CUser* pUser, const CString& sModName, \
const CString& sModPath) \
: CModule(pDLL, pUser, sModName, sModPath)
#define MODULEDEFS(CLASS, DESCRIPTION) \
extern "C" { \
CString GetDescription() { return DESCRIPTION; } \
bool IsGlobal() { return false; } \
CModule* Load(void* p, CUser* pUser, const CString& sModName); \
CModule* Load(void* p, CUser* pUser, const CString& sModName, \
const CString& sModPath); \
void Unload(CModule* pMod); double GetVersion(); } \
double GetVersion() { return VERSION; } \
CModule* Load(void* p, CUser* pUser, const CString& sModName) { return new CLASS(p, pUser, sModName); } \
CModule* Load(void* p, CUser* pUser, const CString& sModName, \
const CString& sModPath) \
{ return new CLASS(p, pUser, sModName, sModPath); } \
void Unload(CModule* pMod) { if (pMod) { delete pMod; } \
}
// !User Module Macros
// Global Module Macros
#define GLOBALMODCONSTRUCTOR(CLASS) \
CLASS(void *pDLL, const CString& sModName) : CGlobalModule(pDLL, sModName)
CLASS(void *pDLL, const CString& sModName, const CString& sModPath) \
: CGlobalModule(pDLL, sModName, sModPath)
#define GLOBALMODULEDEFS(CLASS, DESCRIPTION) \
extern "C" { \
CString GetDescription() { return DESCRIPTION; } \
bool IsGlobal() { return true; } \
CGlobalModule* Load(void* p, const CString& sModName); \
CGlobalModule* Load(void* p, const CString& sModName, \
const CString& sModPath); \
void Unload(CGlobalModule* pMod); double GetVersion(); } \
double GetVersion() { return VERSION; } \
CGlobalModule* Load(void* p, const CString& sModName) { return new CLASS(p, sModName); } \
CGlobalModule* Load(void* p, const CString& sModName, \
const CString& sModPath) \
{ return new CLASS(p, sModName, sModPath); } \
void Unload(CGlobalModule* pMod) { if (pMod) { delete pMod; } \
}
// !Global Module Macros
@@ -195,8 +204,9 @@ protected:
class CModule {
public:
CModule(void* pDLL, CUser* pUser, const CString& sModName);
CModule(void* pDLL, const CString& sModName);
CModule(void* pDLL, CUser* pUser, const CString& sModName,
const CString& sDataDir);
CModule(void* pDLL, const CString& sModName, const CString& sDataDir);
virtual ~CModule();
typedef enum {
@@ -272,7 +282,9 @@ public:
virtual bool PutModule(const CString& sLine, const CString& sIdent = "znc", const CString& sHost = "znc.com");
virtual bool PutModNotice(const CString& sLine, const CString& sIdent = "znc", const CString& sHost = "znc.com");
const CString& GetModName() const;
const CString& GetModName() const { return m_sModName; }
// This is where constant module data (e.g. webadmin skins) are saved
const CString& GetModDataDir() const { return m_sDataDir; }
CString GetModNick() const;
// Timer stuff
@@ -321,19 +333,20 @@ public:
// !Getters
protected:
bool m_bFake;
CString m_sDescription;
vector<CTimer*> m_vTimers;
vector<CSocket*> m_vSockets;
void* m_pDLL;
CSockManager* m_pManager;
CUser* m_pUser;
CClient* m_pClient;
CString m_sModName;
CString m_sSavePath;
CString m_sArgs;
bool m_bFake;
CString m_sDescription;
vector<CTimer*> m_vTimers;
vector<CSocket*> m_vSockets;
void* m_pDLL;
CSockManager* m_pManager;
CUser* m_pUser;
CClient* m_pClient;
CString m_sModName;
CString m_sDataDir;
CString m_sSavePath;
CString m_sArgs;
private:
MCString m_mssRegistry; //!< way to save name/value pairs. Note there is no encryption involved in this
MCString m_mssRegistry; //!< way to save name/value pairs. Note there is no encryption involved in this
};
class CModules : public vector<CModule*> {
@@ -399,7 +412,6 @@ public:
bool UnloadModule(const CString& sModule);
bool UnloadModule(const CString& sModule, CString& sRetMsg);
bool ReloadModule(const CString& sModule, const CString& sArgs, CUser* pUser, CString& sRetMsg);
CString FindModPath(const CString& sModule);
bool GetModInfo(CModInfo& ModInfo, const CString& sModule);
void GetAvailableMods(set<CModInfo>& ssMods, bool bGlobal = false);
@@ -410,7 +422,8 @@ protected:
class CGlobalModule : public CModule {
public:
CGlobalModule(void* pDLL, const CString& sModName) : CModule(pDLL, sModName) {}
CGlobalModule(void* pDLL, const CString& sModName,
const CString &sDataDir) : CModule(pDLL, sModName, sDataDir) {}
virtual ~CGlobalModule() {}
virtual EModRet OnConfigLine(const CString& sName, const CString& sValue, CUser* pUser, CChan* pChan);
Vendored
+18 -2
View File
@@ -641,6 +641,7 @@ NOSSL
PERL
SASL
MODDIR
DATADIR
LIBOBJS
LTLIBOBJS'
ac_subst_files=''
@@ -1243,6 +1244,8 @@ Optional Packages:
--with-module-prefix=/path/to/moduledir
--with-module-data-prefix=/path/to/moduledir
Some influential environment variables:
CXX C++ compiler command
@@ -3633,10 +3636,20 @@ fi
if test "${with_module_prefix+set}" = set; then
withval=$with_module_prefix; MODDIR=$withval
else
MODDIR="${prefix}/libexec/znc"
MODDIR="${libdir}/znc"
fi
# Check whether --with-module-data-prefix was given.
if test "${with_module_data_prefix+set}" = set; then
withval=$with_module_data_prefix; DATADIR=$withval
else
DATADIR="${datadir}/znc"
fi
if test "$MODULES" = "yes"; then
if test -z "$NOCHECK_DL"; then
@@ -3734,6 +3747,7 @@ fi
fi
appendCXX "-D_MODDIR_=\\\"${MODDIR}\\\""
appendCXX "-D_DATADIR_=\\\"${DATADIR}\\\""
if test -z "$NOPERL"; then
echo -n "checking for perl... "
@@ -3915,6 +3929,7 @@ VERSION=0.053
ac_config_files="$ac_config_files Makefile"
ac_config_files="$ac_config_files znc-config"
@@ -4618,11 +4633,12 @@ NOSSL!$NOSSL$ac_delim
PERL!$PERL$ac_delim
SASL!$SASL$ac_delim
MODDIR!$MODDIR$ac_delim
DATADIR!$DATADIR$ac_delim
LIBOBJS!$LIBOBJS$ac_delim
LTLIBOBJS!$LTLIBOBJS$ac_delim
_ACEOF
if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 67; then
if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 68; then
break
elif $ac_last_try; then
{ { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+5 -1
View File
@@ -13,7 +13,11 @@
#define VERSION 0.053
#ifndef _MODDIR_
#define _MODDIR_ "/usr/libexec/znc"
#define _MODDIR_ "/usr/lib/znc"
#endif
#ifndef _DATADIR_
#define _DATADIR_ "/usr/share/znc"
#endif
#ifdef _MODULES
+6 -4
View File
@@ -238,8 +238,9 @@ public:
void SetupZNCScript()
{
CString sModule = CZNC::Get().FindModPath( "modperl.pm" );
if ( !sModule.empty() )
CString sModule, sTmp;
if ( CZNC::Get().FindModPath( "modperl.pm", sModule, sTmp) )
{
CString sBuffer, sScript;
CFile cFile( sModule );
@@ -1035,8 +1036,9 @@ void CModPerl::LoadPerlMod( const CString & sModule )
return;
}
CString sModPath = CZNC::Get().FindModPath( sModule );
if ( sModPath.empty() )
CString sModPath, sTmp;
if ( !CZNC::Get().FindModPath(sModule, sModPath, sTmp))
PutStatus( "No such module " + sModule );
else
{
+3 -12
View File
@@ -221,23 +221,14 @@ private:
};
CString CWebAdminSock::GetSkinDir() {
CString sModPath = CZNC::Get().FindModPath(m_pModule->GetModName()); // @todo store the path to the module at load time and store it in a member var which can be used here
// Remove the file.so portion from the path
while (!sModPath.empty() && sModPath.Right(1) != "/") {
sModPath.RightChomp();
}
// Remove the last /
sModPath.RightChomp();
CString sSkinDir = sModPath + "/" + m_pModule->GetModName() + "/skins/" + m_pModule->GetSkinName() + "/";
CString sSkinDir = m_pModule->GetModDataDir() + "/skins/"
+ m_pModule->GetSkinName() + "/";
if (CDir::Exists(sSkinDir)) {
return sSkinDir;
}
return sModPath + "/" + m_pModule->GetModName() + "/skins/default/";
return m_pModule->GetModDataDir() + "/skins/default/";
}
void CWebAdminSock::PrintPage(CString& sPageRet, const CString& sTmplName) {
+17 -12
View File
@@ -1261,28 +1261,33 @@ void CZNC::Broadcast(const CString& sMessage, CUser* pUser) {
}
}
CString CZNC::FindModPath(const CString& sModule) const {
CString sModPath = GetCurPath() + "/modules/" + sModule;
sModPath += (sModule.find(".") == CString::npos) ? ".so" : "";
bool CZNC::FindModPath(const CString& sModule, CString& sModPath,
CString& sDataPath) const {
CString sMod = sModule;
CString sDir = sMod;
if (sModule.find(".") == CString::npos)
sMod += ".so";
sDataPath = GetCurPath() + "/modules/";
sModPath = sDataPath + sMod;
if (!CFile::Exists(sModPath)) {
//DEBUG_ONLY(cout << "[" << sModPath << "] Not found..." << endl);
sModPath = GetModPath() + "/" + sModule;
sModPath += (sModule.find(".") == CString::npos) ? ".so" : "";
sDataPath = GetModPath() + "/";
sModPath = sDataPath + sMod;
if (!CFile::Exists(sModPath)) {
//DEBUG_ONLY(cout << "[" << sModPath << "] Not found..." << endl);
sModPath = _MODDIR_ + CString("/") + sModule;
sModPath += (sModule.find(".") == CString::npos) ? ".so" : "";
sDataPath = _DATADIR_ + CString("/");
sModPath = _MODDIR_ + CString("/") + sMod;
if (!CFile::Exists(sModPath)) {
//DEBUG_ONLY(cout << "[" << sModPath << "] Not found... giving up!" << endl);
return "";
return false;
}
}
}
return sModPath;
sDataPath += sDir;
return true;
}
CUser* CZNC::FindUser(const CString& sUsername) {
+4 -1
View File
@@ -109,7 +109,10 @@ public:
bool WriteNewConfig(const CString& sConfig);
bool WriteConfig();
static CString GetTag(bool bIncludeVersion = true);
CString FindModPath(const CString& sModule) const;
// This returns the path to the .so and to the data dir
// which is where static data (webadmin skins) are saved
bool FindModPath(const CString& sModule, CString& sModPath,
CString& sDataPath) const;
void ClearVHosts();
bool AddVHost(const CString& sHost);
bool RemVHost(const CString& sHost);