/* * pmodule.C: Protocol command management. * Rights to this code are documented in doc/pod/license.pod. * * Copyright © 2005-2007 Atheme Project (http://www.atheme.org) */ static char const rcsid[] = "$Id"; #include "atheme.h" #include "pmodule.h" dictionary_tree_t *pcommands; BlockHeap *pcommand_heap; BlockHeap *messagetree_heap; cmode_t *mode_list; extmode *ignore_mode_list; cmode_t *status_mode_list; cmode_t *prefix_mode_list; ircd_t *ircd; bool pmodule_loaded = false; bool backend_loaded = false; void pcommand_init (void) { pcommand_heap = BlockHeapCreate (sizeof (pcommand_t), 64); if (!pcommand_heap) { slog (LG_INFO, "pcommand_init(): block allocator failed."); exit (EXIT_FAILURE); } pcommands = dictionary_create ("pcommand", HASH_COMMAND, strcmp); } void pcommand_add (char *token, void (*handler) (sourceinfo_t *si, int parc, char *parv[]), int minparc, int sourcetype) { pcommand_t *pcmd; if ((pcmd = pcommand_find (token))) { slog (LG_INFO, "pcommand_add(): token %s is already registered", token); return; } pcmd = static_cast (BlockHeapAlloc (pcommand_heap)); pcmd->token = sstrdup (token); pcmd->handler = handler; pcmd->minparc = minparc; pcmd->sourcetype = sourcetype; dictionary_add (pcommands, pcmd->token, pcmd); } void pcommand_delete (char *token) { pcommand_t *pcmd; if (!(pcmd = pcommand_find (token))) { slog (LG_INFO, "pcommand_delete(): token %s is not registered", token); return; } dictionary_delete (pcommands, pcmd->token); free (pcmd->token); pcmd->handler = NULL; BlockHeapFree (pcommand_heap, pcmd); } pcommand_t * pcommand_find (char *token) { return static_cast (dictionary_retrieve (pcommands, token)); }