X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_testnet.cpp;h=401766d8a2eaa358f7833545da6f15e0cc3eac6c;hb=68211809ee3111bdc9609fbd46dc3c875fbb5ea6;hp=6a0cfa303311667f05ad21390ea424b9e3a05ec8;hpb=de25d946733f774e3a5b53a58438a9c92af0acbe;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_testnet.cpp b/src/modules/m_testnet.cpp index 6a0cfa303..401766d8a 100644 --- a/src/modules/m_testnet.cpp +++ b/src/modules/m_testnet.cpp @@ -1,20 +1,183 @@ -/* +------------------------------------+ - * | Inspire Internet Relay Chat Daemon | - * +------------------------------------+ +/* + * InspIRCd -- Internet Relay Chat Daemon * - * InspIRCd: (C) 2002-2009 InspIRCd Development Team - * See: http://wiki.inspircd.org/Credits + * Copyright (C) 2009 Daniel De Graaf * - * This program is free but copyrighted software; see - * the file COPYING for details. + * This file is part of InspIRCd. InspIRCd is free software: you can + * redistribute it and/or modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation, version 2. * - * --------------------------------------------------- + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . */ + /* $ModDesc: Provides a module for testing the server while linked in a network */ #include "inspircd.h" +struct vtbase +{ + virtual void isok(const char* name, int impl, Module* basemod, std::vector& allmods) = 0; + virtual ~vtbase() {} +}; + +template struct vtable : public vtbase +{ + union u { + T function; + struct v { + size_t delta; + size_t vtoff; + } v; + } u; + vtable(T t) { + u.function = t; + } + /** member function pointer dereference from vtable; depends on the GCC 4.4 ABI (x86_64) */ + template void* read(E* obj) + { + if (u.v.delta & 1) + { + uint8_t* optr = reinterpret_cast(obj); + optr += u.v.vtoff; + uint8_t* vptr = *reinterpret_cast(optr); + vptr += u.v.delta - 1; + return *reinterpret_cast(vptr); + } + else + return reinterpret_cast(u.v.delta); + } + void isok(const char* name, int impl, Module* basemod, std::vector& allmods) + { + void* base = read(basemod); + for(unsigned int i=0; i < allmods.size(); ++i) + { + Module* mod = ServerInstance->Modules->Find(allmods[i]); + void* fptr = read(mod); + for(EventHandlerIter j = ServerInstance->Modules->EventHandlers[impl].begin(); + j != ServerInstance->Modules->EventHandlers[impl].end(); j++) + { + if (mod == *j) + { + if (fptr == base) + { + ServerInstance->SNO->WriteToSnoMask('a', "Module %s implements %s but uses default function", + mod->ModuleSourceFile.c_str(), name); + } + goto done; + } + } + if (fptr != base) + { + ServerInstance->SNO->WriteToSnoMask('a', "Module %s does not implement %s but overrides function", + mod->ModuleSourceFile.c_str(), name); + } + done:; + } + } +}; + +template vtbase* vtinit(T t) +{ + return new vtable(t); +} + +static void checkall(Module* noimpl) +{ + std::vector allmods = ServerInstance->Modules->GetAllModuleNames(0); +#define CHK(name) do { \ + vtbase* vt = vtinit(&Module::name); \ + vt->isok(#name, I_ ## name, noimpl, allmods); \ + delete vt; \ +} while (0) + CHK(OnUserConnect); + CHK(OnUserQuit); + CHK(OnUserDisconnect); + CHK(OnUserJoin); + CHK(OnUserPart); + CHK(OnRehash); + CHK(OnSendSnotice); + CHK(OnUserPreJoin); + CHK(OnUserPreKick); + CHK(OnUserKick); + CHK(OnOper); + CHK(OnInfo); + CHK(OnWhois); + CHK(OnUserPreInvite); + CHK(OnUserInvite); + CHK(OnUserPreMessage); + CHK(OnUserPreNotice); + CHK(OnUserPreNick); + CHK(OnUserMessage); + CHK(OnUserNotice); + CHK(OnMode); + CHK(OnGetServerDescription); + CHK(OnSyncUser); + CHK(OnSyncChannel); + CHK(OnDecodeMetaData); + CHK(OnWallops); + CHK(OnAcceptConnection); + CHK(OnChangeHost); + CHK(OnChangeName); + CHK(OnAddLine); + CHK(OnDelLine); + CHK(OnExpireLine); + CHK(OnUserPostNick); + CHK(OnPreMode); + CHK(On005Numeric); + CHK(OnKill); + CHK(OnRemoteKill); + CHK(OnLoadModule); + CHK(OnUnloadModule); + CHK(OnBackgroundTimer); + CHK(OnPreCommand); + CHK(OnCheckReady); + CHK(OnCheckInvite); + CHK(OnRawMode); + CHK(OnCheckKey); + CHK(OnCheckLimit); + CHK(OnCheckBan); + CHK(OnCheckChannelBan); + CHK(OnExtBanCheck); + CHK(OnStats); + CHK(OnChangeLocalUserHost); + CHK(OnPreTopicChange); + CHK(OnPostTopicChange); + CHK(OnEvent); + CHK(OnGlobalOper); + CHK(OnPostConnect); + CHK(OnAddBan); + CHK(OnDelBan); + CHK(OnChangeLocalUserGECOS); + CHK(OnUserRegister); + CHK(OnChannelPreDelete); + CHK(OnChannelDelete); + CHK(OnPostOper); + CHK(OnSyncNetwork); + CHK(OnSetAway); + CHK(OnPostCommand); + CHK(OnPostJoin); + CHK(OnWhoisLine); + CHK(OnBuildNeighborList); + CHK(OnGarbageCollect); + CHK(OnText); + CHK(OnPassCompare); + CHK(OnRunTestSuite); + CHK(OnNamesListItem); + CHK(OnNumeric); + CHK(OnHookIO); + CHK(OnPreRehash); + CHK(OnModuleRehash); + CHK(OnSendWhoLine); + CHK(OnChangeIdent); +} + class CommandTest : public Command { public: @@ -32,14 +195,14 @@ class CommandTest : public Command for(unsigned int i=0; i < count; i++) user->Write(line); } - else if (parameters[0] == "freeze") + else if (parameters[0] == "freeze" && IS_LOCAL(user) && parameters.size() > 1) { - user->Penalty += 100; + IS_LOCAL(user)->CommandFloodPenalty += atoi(parameters[1].c_str()); } - else if (parameters[0] == "shutdown") + else if (parameters[0] == "check") { - int i = parameters.size() > 1 ? atoi(parameters[1].c_str()) : 2; - ServerInstance->SE->Shutdown(user->GetFd(), i); + checkall(creator); + ServerInstance->SNO->WriteToSnoMask('a', "Module check complete"); } return CMD_SUCCESS; } @@ -50,10 +213,14 @@ class ModuleTest : public Module CommandTest cmd; public: ModuleTest() : cmd(this) + { + } + + void init() { if (!strstr(ServerInstance->Config->ServerName.c_str(), ".test")) throw ModuleException("Don't load modules without reading their descriptions!"); - ServerInstance->AddCommand(&cmd); + ServerInstance->Modules->AddService(cmd); } Version GetVersion()