From c55340704100a4860093d9a86c5c2065b8d1094b Mon Sep 17 00:00:00 2001 From: imaginos Date: Wed, 18 May 2005 22:59:46 +0000 Subject: [PATCH] fix module reloading, works now git-svn-id: https://znc.svn.sourceforge.net/svnroot/znc/trunk@343 726aef4b-f618-498e-8847-2d620e286838 --- modules/modperl.cpp | 23 +++++++++++++---------- modules/modperl.pm | 9 +++++++-- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/modules/modperl.cpp b/modules/modperl.cpp index 23521108..287b86a1 100644 --- a/modules/modperl.cpp +++ b/modules/modperl.cpp @@ -441,9 +441,12 @@ public: if ( sCommand == "loadmod" ) LoadPerlMod( sModule ); else if ( sCommand == "unloadmod" ) - UnLoadPerlMod( sModule ); + UnloadPerlMod( sModule ); else - PutModule( "Perl modules can not be reloaded one at a time, you have to reload the interpreter to pick up code changes (reloadmod modperl)" ); + { + UnloadPerlMod( sModule ); + LoadPerlMod( sModule ); + } return( HALT ); } } @@ -451,7 +454,7 @@ public: } void LoadPerlMod( const CString & sModule ); - void UnLoadPerlMod( const CString & sModule ); + void UnloadPerlMod( const CString & sModule ); private: PerlInterpreter *m_pPerl; @@ -558,11 +561,11 @@ XS(XS_ZNC_LoadMod) } } -XS(XS_ZNC_UnLoadMod) +XS(XS_ZNC_UnloadMod) { dXSARGS; if ( items != 1 ) - Perl_croak( aTHX_ "Usage: UnLoadMod( module )" ); + Perl_croak( aTHX_ "Usage: UnloadMod( module )" ); SP -= items; ax = (SP - PL_stack_base) + 1 ; @@ -570,7 +573,7 @@ XS(XS_ZNC_UnLoadMod) if ( g_ModPerl ) { CString sModule = (char *)SvPV(ST(0),PL_na); - g_ModPerl->UnLoadPerlMod( sModule ); + g_ModPerl->UnloadPerlMod( sModule ); } PUTBACK; } @@ -792,7 +795,7 @@ XS(XS_ZNC_COREListen) pSock->SetPemLocation( g_ModPerl->GetUser()->GetPemLocation() ); else { - PutModule( "PEM File does not exist! (looking for " + g_ModPerl->GetUser()->GetPemLocation() + ")" ); + g_ModPerl->PutModule( "PEM File does not exist! (looking for " + g_ModPerl->GetUser()->GetPemLocation() + ")" ); bContinue = false; } } @@ -938,7 +941,7 @@ bool CModPerl::OnLoad( const CString & sArgs ) newXS( "ZNC::GetNicks", XS_ZNC_GetNicks, (char *)file ); newXS( "ZNC::GetString", XS_ZNC_GetString, (char *)file ); newXS( "ZNC::LoadMod", XS_ZNC_LoadMod, (char *)file ); - newXS( "ZNC::UnLoadMod", XS_ZNC_UnLoadMod, (char *)file ); + newXS( "ZNC::UnloadMod", XS_ZNC_UnloadMod, (char *)file ); newXS( "ZNC::WriteSock", XS_ZNC_WriteSock, (char *)file ); newXS( "ZNC::CloseSock", XS_ZNC_CloseSock, (char *)file ); @@ -989,10 +992,10 @@ void CModPerl::DestroyAllSocks() } } } -void CModPerl::UnLoadPerlMod( const CString & sModule ) +void CModPerl::UnloadPerlMod( const CString & sModule ) { DestroyAllSocks(); - Eval( "ZNC::COREUnLoadMod( '" + m_pUser->GetUserName() + "', '" + sModule + "');" ); + Eval( "ZNC::COREUnloadMod( '" + m_pUser->GetUserName() + "', '" + sModule + "');" ); } diff --git a/modules/modperl.pm b/modules/modperl.pm index 748cba98..4403995a 100644 --- a/modules/modperl.pm +++ b/modules/modperl.pm @@ -98,6 +98,11 @@ sub CORELoadMod close( INMOD ); close( OUTMOD ); + if ( $INC{$FileName} ) + { # force a delete on this guy + delete $INC{$FileName}; + } + require $FileName; my $NewMod = $Username . $Module; @@ -118,7 +123,7 @@ sub CORELoadMod ZNC::PutModule( "Loaded $Module" ); } -sub COREUnLoadMod +sub COREUnloadMod { my ( $Username, $Module ) = @_; @@ -136,7 +141,7 @@ sub COREUnLoadMod { undef $MODS[$i]; splice( @MODS, $i, 1 ); - ZNC::PutModule( "UnLoaded $Module" ); + ZNC::PutModule( "Unloaded $Module" ); return( CONTINUE() ); } }