From 3145c5054caa3f40f669b49e0f84852fcd307218 Mon Sep 17 00:00:00 2001 From: Alexey Sokolov Date: Sat, 28 Jul 2012 19:35:22 +0700 Subject: [PATCH] Allow perl modules to be loaded not by modperl --- modules/modperl.cpp | 17 ++++++++++++++--- modules/modperl/modperl.i | 2 +- modules/modperl/startup.pl | 7 ++++++- 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/modules/modperl.cpp b/modules/modperl.cpp index 7dd620ad..acef7725 100644 --- a/modules/modperl.cpp +++ b/modules/modperl.cpp @@ -115,6 +115,7 @@ public: virtual EModRet OnModuleUnloading(CModule* pModule, bool& bSuccess, CString& sRetMsg) { CPerlModule* pMod = AsPerlModule(pModule); if (pMod) { + EModRet result = HALT; CString sModName = pMod->GetModName(); PSTART; XPUSHs(pMod->GetPerlObj()); @@ -122,13 +123,23 @@ public: if (SvTRUE(ERRSV)) { bSuccess = false; sRetMsg = PString(ERRSV); + } else if (ret < 1 || 2 < ret) { + sRetMsg = "Error: Perl ZNC::Core::UnloadModule returned " + CString(ret) + " values."; + bSuccess = false; + result = HALT; } else { - bSuccess = true; - sRetMsg = "Module [" + sModName + "] unloaded"; + int bUnloaded = SvUV(ST(0)); + if (bUnloaded) { + bSuccess = true; + sRetMsg = "Module [" + sModName + "] unloaded"; + result = HALT; + } else { + result = CONTINUE; // module wasn't loaded by modperl. Perhaps a module-provider written in perl did that. + } } PEND; DEBUG(__PRETTY_FUNCTION__ << " " << sRetMsg); - return HALT; + return result; } return CONTINUE; } diff --git a/modules/modperl/modperl.i b/modules/modperl/modperl.i index e7989361..6c8b835e 100644 --- a/modules/modperl/modperl.i +++ b/modules/modperl/modperl.i @@ -264,4 +264,4 @@ typedef std::vector > VPair; *GetNicks = *_GetNicks_; %} -/* vim: set filetype=cpp noexpandtab: */ +/* vim: set filetype=cpp: */ diff --git a/modules/modperl/startup.pl b/modules/modperl/startup.pl index ce777388..3806c81e 100644 --- a/modules/modperl/startup.pl +++ b/modules/modperl/startup.pl @@ -20,8 +20,12 @@ my @allmods; sub UnloadModule { my ($pmod) = @_; + my @newallmods = grep {$pmod != $_} @allmods; + if ($#allmods == $#newallmods) { + return 0 + } + @allmods = @newallmods; $pmod->OnShutdown; - @allmods = grep {$pmod != $_} @allmods; my $cmod = $pmod->{_cmod}; my $modpath = $cmod->GetModPath; my $modname = $cmod->GetModName; @@ -43,6 +47,7 @@ sub UnloadModule { ZNC::_CleanupStash($modname); delete $INC{$modpath}; } + return 1 # here $cmod is deleted by perl (using DESTROY) }