X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=include%2Fmodules.h;h=ff52cd600eba13df60f2e8bfa9d593152b439709;hb=6b27fae945e5310a76cb7fa2a5ff0059cd436ac9;hp=4e960ec6457bcae36e5ddd4f7c4152695fd3e77e;hpb=d9e3bb8d4343643504ab7ee6ab943a000065cc8a;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/include/modules.h b/include/modules.h index 4e960ec64..ff52cd600 100644 --- a/include/modules.h +++ b/include/modules.h @@ -30,6 +30,7 @@ class XLine; /** Used to define a set of behavior bits for a module */ enum ModuleFlags { + VF_NONE = 0, // module is not special at all VF_STATIC = 1, // module is static, cannot be /unloadmodule'd VF_VENDOR = 2, // module is a vendor module (came in the original tarball, not 3rd party) VF_SERVICEPROVIDER = 4, // module provides a service to other modules (can be a dependency) @@ -156,40 +157,16 @@ typedef std::map > interfacelist; } \ } while (0); -/** - * This #define allows us to call a method in all - * loaded modules in a readable simple way and pass - * an instance pointer to the macro. e.g.: - * 'FOREACH_MOD_I(Instance, OnConnect, OnConnect(user));' - */ -#define FOREACH_MOD_I(z,y,x) do { \ - EventHandlerIter safei; \ - for (EventHandlerIter _i = z->Modules->EventHandlers[y].begin(); _i != z->Modules->EventHandlers[y].end(); ) \ - { \ - safei = _i; \ - ++safei; \ - try \ - { \ - (*_i)->x ; \ - } \ - catch (CoreException& modexcept) \ - { \ - z->Logs->Log("MODULE",DEFAULT,"Exception caught: %s",modexcept.GetReason()); \ - } \ - _i = safei; \ - } \ -} while (0); - /** * Custom module result handling loop. This is a paired macro, and should only * be used with while_each_hook. * * See src/channels.cpp for an example of use. */ -#define DO_EACH_HOOK(z,n,v,args) \ +#define DO_EACH_HOOK(n,v,args) \ do { \ - EventHandlerIter iter_ ## n = z->Modules->EventHandlers[I_ ## n].begin(); \ - while (iter_ ## n != z->Modules->EventHandlers[I_ ## n].end()) \ + EventHandlerIter iter_ ## n = ServerInstance->Modules->EventHandlers[I_ ## n].begin(); \ + while (iter_ ## n != ServerInstance->Modules->EventHandlers[I_ ## n].end()) \ { \ Module* mod_ ## n = *iter_ ## n; \ iter_ ## n ++; \ @@ -197,11 +174,11 @@ do { \ { \ v = (mod_ ## n)->n args; -#define WHILE_EACH_HOOK(z,n) \ +#define WHILE_EACH_HOOK(n) \ } \ catch (CoreException& except_ ## n) \ { \ - z->Logs->Log("MODULE",DEFAULT,"Exception caught: %s", (except_ ## n).GetReason()); \ + ServerInstance->Logs->Log("MODULE",DEFAULT,"Exception caught: %s", (except_ ## n).GetReason()); \ (void) mod_ ## n; /* catch mismatched pairs */ \ } \ } \ @@ -212,16 +189,16 @@ do { \ * Runs the given hook until some module returns a useful result. * * Example: ModResult result; - * FIRST_MOD_RESULT(ServerInstance, OnUserPreNick, result, (user, newnick)) + * FIRST_MOD_RESULT(OnUserPreNick, result, (user, newnick)) */ -#define FIRST_MOD_RESULT(z,n,v,args) do { \ +#define FIRST_MOD_RESULT(n,v,args) do { \ v = MOD_RES_PASSTHRU; \ - DO_EACH_HOOK(z,n,v,args) \ + DO_EACH_HOOK(n,v,args) \ { \ if (v != MOD_RES_PASSTHRU) \ break; \ } \ - WHILE_EACH_HOOK(z,n); \ + WHILE_EACH_HOOK(n); \ } while (0) /** Represents a non-local user. @@ -239,7 +216,7 @@ do { \ /** Is a remote user */ #define IS_REMOTE(x) (x->GetFd() < 0) /** Is a fake user */ -#define IS_FAKE(x) (x->GetFd() == FD_FAKEUSER_NUMBER) +#define IS_SERVER(x) (x->GetFd() == FD_FAKEUSER_NUMBER) /** Is a module created user */ #define IS_MODULE_CREATED(x) (x->GetFd() == FD_MAGIC_NUMBER) /** Is an oper */ @@ -257,6 +234,9 @@ do { \ class CoreExport Version : public classbase { public: + /** Module description + */ + const std::string description; /** Version information. */ const std::string version; @@ -267,7 +247,7 @@ class CoreExport Version : public classbase /** Initialize version class */ - Version(const std::string &customver, int flags, + Version(const std::string &desc, int flags, int api_ver = API_VERSION, const std::string& src_rev = VERSION " r" REVISION); }; @@ -383,7 +363,7 @@ class CoreExport Event : public ModuleMessage * The return result of an Event::Send() will always be NULL as * no replies are expected. */ - char* Send(InspIRCd* ServerInstance); + char* Send(); }; /** Priority types which can be returned from Module::Prioritize() @@ -403,13 +383,12 @@ enum Implementation I_OnChangeHost, I_OnChangeName, I_OnAddLine, I_OnDelLine, I_OnExpireLine, I_OnCleanup, I_OnUserPostNick, I_OnPreMode, I_On005Numeric, I_OnKill, I_OnRemoteKill, I_OnLoadModule, I_OnUnloadModule, I_OnBackgroundTimer, I_OnPreCommand, I_OnCheckReady, I_OnCheckInvite, - I_OnRawMode, I_OnCheckKey, I_OnCheckLimit, I_OnCheckBan, I_OnCheckExtBan, I_OnCheckStringExtBan, + I_OnRawMode, I_OnCheckKey, I_OnCheckLimit, I_OnCheckBan, I_OnCheckChannelBan, I_OnExtBanCheck, I_OnStats, I_OnChangeLocalUserHost, I_OnChangeLocalUserGecos, I_OnPreTopicChange, I_OnPostTopicChange, I_OnEvent, I_OnRequest, I_OnGlobalOper, I_OnPostConnect, I_OnAddBan, - I_OnDelBan, I_OnRawSocketAccept, I_OnRawSocketClose, I_OnRawSocketWrite, I_OnRawSocketRead, - I_OnChangeLocalUserGECOS, I_OnUserRegister, I_OnChannelPreDelete, I_OnChannelDelete, + I_OnDelBan, I_OnChangeLocalUserGECOS, I_OnUserRegister, I_OnChannelPreDelete, I_OnChannelDelete, I_OnPostOper, I_OnSyncNetwork, I_OnSetAway, I_OnUserList, I_OnPostCommand, I_OnPostJoin, - I_OnWhoisLine, I_OnBuildExemptList, I_OnRawSocketConnect, I_OnGarbageCollect, I_OnBufferFlushed, + I_OnWhoisLine, I_OnBuildExemptList, I_OnGarbageCollect, I_OnText, I_OnPassCompare, I_OnRunTestSuite, I_OnNamesListItem, I_OnNumeric, I_OnHookIO, I_OnHostCycle, I_OnPreRehash, I_OnModuleRehash, I_OnSendWhoLine, I_OnChangeIdent, I_END @@ -434,7 +413,7 @@ class CoreExport Module : public Extensible * @param Me An instance of the InspIRCd class which will be saved into ServerInstance for your use * \exception ModuleException Throwing this class, or any class derived from ModuleException, causes loading of the module to abort. */ - Module(InspIRCd* Me); + Module(); /** Default destructor. * destroys a module class @@ -449,7 +428,7 @@ class CoreExport Module : public Extensible * The method should return a Version object with its version information assigned via * Version::Version */ - virtual Version GetVersion(); + virtual Version GetVersion() = 0; /** Called when a user connects. * The details of the connecting user are available to you in the parameter User *user @@ -857,13 +836,6 @@ class CoreExport Module : public Extensible */ virtual void ProtoSendMetaData(void* opaque, Extensible* target, const std::string &extname, const std::string &extdata); - /** - * Implemented by all modules that implement ProtoSendMetaData. - * Translates the item into a string format suitable for sending to other servers. - * Currently, this just translates nicks to their UID and channels to their name - */ - virtual std::string ProtoTranslate(Extensible* item); - /** Called after every WALLOPS command. * @param user The user sending the WALLOPS * @param text The content of the WALLOPS message @@ -1112,31 +1084,30 @@ class CoreExport Module : public Extensible */ virtual ModResult OnCheckLimit(User* user, Channel* chan); - /** Called whenever a user joins a channel, to determine if banlist checks should go ahead or not. - * This method will always be called for each join, wether or not the user actually matches a channel ban, and - * determines the outcome of an if statement around the whole section of ban checking code. - * return 1 to explicitly allow the join to go ahead or 0 to ignore the event. - * @param user The user joining the channel - * @param chan The channel being joined - * @return 1 to explicitly allow the join, 0 to proceed as normal. Return -1 to explicitly deny the - * join to the channel. + /** + * Checks for a user's ban from the channel + * @param user The user to check + * @param chan The channel to check in + * @return MOD_RES_DENY to mark as banned, MOD_RES_ALLOW to skip the + * ban check, or MOD_RES_PASSTHRU to check bans normally */ - virtual ModResult OnCheckBan(User* user, Channel* chan); + virtual ModResult OnCheckChannelBan(User* user, Channel* chan); - /* Called whenever checking whether or not a user is matched by an applicable extended bantype. - * NOTE: may also trigger extra OnCheckStringExtBan events! - * @param u The user to check - * @param c The channel the user is on - * @param type The type of extended ban to check for. - * @returns 1 = exempt, 0 = no match, -1 = banned + /** + * Checks for a user's match of a single ban + * @param user The user to check for match + * @param chan The channel on which the match is being checked + * @param mask The mask being checked + * @return MOD_RES_DENY to mark as banned, MOD_RES_ALLOW to skip the + * ban check, or MOD_RES_PASSTHRU to check bans normally */ - virtual ModResult OnCheckExtBan(User *u, Channel *c, char type); + virtual ModResult OnCheckBan(User* user, Channel* chan, const std::string& mask); - /** Called whenever checking whether or not a string is extbanned. NOTE: one OnCheckExtBan will also trigger a number of - * OnCheckStringExtBan events for seperate host/IP comnbinations. - * @returns 1 = exempt, 0 = no match, -1 = banned + /** Checks for a match on a given extban type + * @return MOD_RES_DENY to mark as banned, MOD_RES_ALLOW to skip the + * ban check, or MOD_RES_PASSTHRU to check bans normally */ - virtual ModResult OnCheckStringExtBan(const std::string &s, Channel *c, char type); + virtual ModResult OnExtBanCheck(User* user, Channel* chan, char type); /** Called on all /STATS commands * This method is triggered for all /STATS use, including stats symbols handled by the core. @@ -1250,9 +1221,9 @@ class CoreExport Module : public Extensible * @param user The item to possibly install the I/O hook on * @param via The port that connected on */ - virtual void OnHookIO(EventHandler* user, ListenSocketBase* via); + virtual void OnHookIO(StreamSocket*, ListenSocketBase* via); - /** Called immediately after any connection is accepted. This is intended for raw socket + /** Called immediately after any connection is accepted. This is intended for raw socket * processing (e.g. modules which wrap the tcp connection within another library) and provides * no information relating to a user record as the connection has not been assigned yet. * There are no return values from this call as all modules get an opportunity if required to @@ -1262,48 +1233,38 @@ class CoreExport Module : public Extensible * @param server The server IP address and port * @param localport The local port number the user connected to */ - virtual void OnRawSocketAccept(int fd, irc::sockets::sockaddrs* client, irc::sockets::sockaddrs* server); + virtual void OnStreamSocketAccept(StreamSocket*, irc::sockets::sockaddrs* client, irc::sockets::sockaddrs* server); - /** Called immediately before any write() operation on a user's socket in the core. Because - * this event is a low level event no user information is associated with it. It is intended - * for use by modules which may wrap connections within another API such as SSL for example. - * return a non-zero result if you have handled the write operation, in which case the core - * will not call write(). - * @param fd The file descriptor of the socket - * @param buffer A char* buffer being written - * @param Number of characters to write - * @return Number of characters actually written or 0 if you didn't handle the operation + /** + * Called when a hooked stream has data to write, or when the socket + * engine returns it as writable + * @param socket The socket in question + * @param sendq Data to send to the socket + * @return 1 if the sendq has been completely emptied, 0 if there is + * still data to send, and -1 if there was an error */ - virtual int OnRawSocketWrite(int fd, const char* buffer, int count); + virtual int OnStreamSocketWrite(StreamSocket*, std::string& sendq); /** Called immediately before any socket is closed. When this event is called, shutdown() * has not yet been called on the socket. * @param fd The file descriptor of the socket prior to close() */ - virtual void OnRawSocketClose(int fd); + virtual void OnStreamSocketClose(StreamSocket*); /** Called immediately upon connection of an outbound BufferedSocket which has been hooked * by a module. * @param fd The file descriptor of the socket immediately after connect() */ - virtual void OnRawSocketConnect(int fd); - - /** Called immediately before any read() operation on a client socket in the core. - * This occurs AFTER the select() or poll() so there is always data waiting to be read - * when this event occurs. - * Your event should return 1 if it has handled the reading itself, which prevents the core - * just using read(). You should place any data read into buffer, up to but NOT GREATER THAN - * the value of count. The value of readresult must be identical to an actual result that might - * be returned from the read() system call, for example, number of bytes read upon success, - * 0 upon EOF or closed socket, and -1 for error. If your function returns a nonzero value, - * you MUST set readresult. - * @param fd The file descriptor of the socket - * @param buffer A char* buffer being read to - * @param count The size of the buffer - * @param readresult The amount of characters read, or 0 - * @return nonzero if the event was handled, in which case readresult must be valid on exit - */ - virtual int OnRawSocketRead(int fd, char* buffer, unsigned int count, int &readresult); + virtual void OnStreamSocketConnect(StreamSocket*); + + /** + * Called when the stream socket has data to read + * @param socket The socket that is ready + * @param recvq The receive queue that new data should be appended to + * @return 1 if new data has been read, 0 if no new data is ready (but the + * socket is still connected), -1 if there was an error or close + */ + virtual int OnStreamSocketRead(StreamSocket*, std::string& recvq); /** Called whenever a user sets away or returns from being away. * The away message is available as a parameter, but should not be modified. @@ -1344,15 +1305,6 @@ class CoreExport Module : public Extensible */ virtual void OnGarbageCollect(); - /** Called whenever a user's write buffer has been completely sent. - * This is called when the user's write buffer is completely empty, and - * there are no more pending bytes to be written and no pending write events - * in the socket engine's queue. This may be used to refill the buffer with - * data which is being spooled in a controlled manner, e.g. LIST lines. - * @param user The user who's buffer is now empty. - */ - virtual void OnBufferFlushed(User* user); - /** Add test suite hooks here. These are used for testing functionality of a module * via the --testsuite debugging parameter. */ @@ -1398,7 +1350,6 @@ class CoreExport Module : public Extensible class CoreExport ConfigReader : public classbase { protected: - InspIRCd* ServerInstance; /** Error code */ long error; @@ -1408,7 +1359,7 @@ class CoreExport ConfigReader : public classbase * This constructor initialises the ConfigReader class to read the inspircd.conf file * as specified when running ./configure. */ - ConfigReader(InspIRCd* Instance); + ConfigReader(); /** Default destructor. * This method destroys the ConfigReader class. */ @@ -1490,7 +1441,6 @@ class CoreExport ConfigReader : public classbase */ class CoreExport FileReader : public classbase { - InspIRCd* ServerInstance; /** The file contents */ file_cache fc; @@ -1508,14 +1458,14 @@ class CoreExport FileReader : public classbase * This method does not load any file into memory, you must use the LoadFile method * after constructing the class this way. */ - FileReader(InspIRCd* Instance); + FileReader(); /** Secondary constructor. * This method initialises the class with a file loaded into it ready for GetLine and * and other methods to be called. If the file could not be loaded, FileReader::FileSize * returns 0. */ - FileReader(InspIRCd* Instance, const std::string &filename); + FileReader(const std::string &filename); /** Default destructor. * This deletes the memory allocated to the file. @@ -1594,10 +1544,6 @@ class CoreExport ModuleManager : public classbase */ int ModCount; - /** Our pointer to the main insp instance - */ - InspIRCd* Instance; - /** List of loaded modules and shared object/dll handles * keyed by module name */ @@ -1617,7 +1563,7 @@ class CoreExport ModuleManager : public classbase /** Simple, bog-standard, boring constructor. */ - ModuleManager(InspIRCd* Ins); + ModuleManager(); /** Destructor */ @@ -1848,9 +1794,9 @@ class CoreExport ModuleManager : public classbase #ifdef WINDOWS #define MODULE_INIT(y) \ - extern "C" DllExport Module * init_module(InspIRCd* Me) \ + extern "C" DllExport Module * init_module() \ { \ - return new y(Me); \ + return new y; \ } \ BOOLEAN WINAPI DllMain(HINSTANCE hDllHandle, DWORD nReason, LPVOID Reserved) \ { \ @@ -1866,9 +1812,9 @@ class CoreExport ModuleManager : public classbase #else #define MODULE_INIT(y) \ - extern "C" DllExport Module * init_module(InspIRCd* Me) \ + extern "C" DllExport Module * init_module() \ { \ - return new y(Me); \ + return new y; \ } #endif