diff --git a/include/h.h b/include/h.h index 88d886b5c..a613d01a9 100644 --- a/include/h.h +++ b/include/h.h @@ -435,17 +435,10 @@ extern int checkprotoflags(aClient *, int, char *, int); extern char *inetntop(int af, const void *in, char *local_dummy, size_t the_size); -/* - * CommandHash -Stskeeps -*/ +/* Internal command stuff - not for modules */ extern MODVAR aCommand *CommandHash[256]; -extern void init_CommandHash(void); +extern void init_CommandHash(void); extern aCommand *add_Command_backend(char *cmd); -extern void add_Command(char *cmd, int (*func)(), unsigned char parameters); -extern void add_Command_to_list(aCommand *item, aCommand **list); -extern aCommand *del_Command_from_list(aCommand *item, aCommand **list); -extern int del_Command(char *cmd, int (*func)()); -extern void add_CommandX(char *cmd, int (*func)(), unsigned char parameters, int flags); /* CRULE */ char *crule_parse(char *); diff --git a/include/modules.h b/include/modules.h index 523b73fc4..d0b316cbb 100644 --- a/include/modules.h +++ b/include/modules.h @@ -714,6 +714,7 @@ extern Efunction *EfunctionDel(Efunction *cb); extern Command *CommandAdd(Module *module, char *cmd, CmdFunc func, unsigned char params, int flags); extern Command *AliasAdd(Module *module, char *cmd, AliasCmdFunc aliasfunc, unsigned char params, int flags); extern void CommandDel(Command *command); +extern void CommandDelX(Command *command, aCommand *cmd); extern int CommandExists(char *name); extern Cmdoverride *CmdoverrideAdd(Module *module, char *cmd, OverrideCmdFunc func); extern Cmdoverride *CmdoverrideAddEx(Module *module, char *name, int priority, OverrideCmdFunc func); diff --git a/src/api-command.c b/src/api-command.c index cd51670ef..67cfe3555 100644 --- a/src/api-command.c +++ b/src/api-command.c @@ -107,27 +107,36 @@ Command *AliasAdd(Module *module, char *cmd, AliasCmdFunc aliasfunc, unsigned ch return CommandAddInternal(module, cmd, NULL, aliasfunc, params, flags); } -void CommandDel(Command *command) +void CommandDelX(Command *command, aCommand *cmd) { Cmdoverride *ovr, *ovrnext; - DelListItem(command->cmd, CommandHash[toupper(*command->cmd->cmd)]); - if (command->cmd->owner) { + DelListItem(cmd, CommandHash[toupper(*cmd->cmd)]); + if (command && cmd->owner) + { ModuleObject *cmdobj; - for (cmdobj = command->cmd->owner->objects; cmdobj; cmdobj = cmdobj->next) { - if (cmdobj->type == MOBJ_COMMAND && cmdobj->object.command == command) { - DelListItem(cmdobj,command->cmd->owner->objects); + for (cmdobj = cmd->owner->objects; cmdobj; cmdobj = cmdobj->next) + { + if (cmdobj->type == MOBJ_COMMAND && cmdobj->object.command == command) + { + DelListItem(cmdobj,cmd->owner->objects); MyFree(cmdobj); break; } } } - for (ovr = command->cmd->overriders; ovr; ovr = ovrnext) + for (ovr = cmd->overriders; ovr; ovr = ovrnext) { ovrnext = ovr->next; CmdoverrideDel(ovr); } - MyFree(command->cmd->cmd); - MyFree(command->cmd); - MyFree(command); + MyFree(cmd->cmd); + MyFree(cmd); + if (command) + MyFree(command); +} + +void CommandDel(Command *command) +{ + return CommandDelX(command, command->cmd); } diff --git a/src/packet.c b/src/packet.c index dd6c87b3a..0bf466240 100644 --- a/src/packet.c +++ b/src/packet.c @@ -125,31 +125,6 @@ aCommand *find_CommandEx(char *cmd, int (*func)(), int token) } -int del_Command(char *cmd, int (*func)()) -{ - aCommand *p; - int i = 0; - p = find_CommandEx(cmd, func, 0); - if (!p) - i--; - else - { - Cmdoverride *ovr, *ovrnext; - DelListItem(p, CommandHash[toupper(*cmd)]); - for (ovr = p->overriders; ovr; ovr = ovrnext) - { - ovrnext = ovr->next; - CmdoverrideDel(ovr); - } - - if (p->cmd) - MyFree(p->cmd); - MyFree(p); - } - return i; - -} - static inline aCommand *find_Cmd(char *cmd, int flags) { aCommand *p; diff --git a/src/s_conf.c b/src/s_conf.c index 2af04f22a..31460af61 100644 --- a/src/s_conf.c +++ b/src/s_conf.c @@ -2345,7 +2345,7 @@ void config_rehash() next = (ListStruct *)alias_ptr->next; safefree(alias_ptr->nick); if (cmptr) - del_Command(alias_ptr->alias, cmptr->func); + CommandDelX(NULL, cmptr); safefree(alias_ptr->alias); if (alias_ptr->format && (alias_ptr->type == ALIAS_COMMAND)) { for (fmt = (ConfigItem_alias_format *) alias_ptr->format; fmt; fmt = (ConfigItem_alias_format *) next2) @@ -9702,7 +9702,7 @@ int _conf_alias(ConfigFile *conf, ConfigEntry *ce) aCommand *cmptr; if ((cmptr = find_Command(ce->ce_vardata, 0, M_ALIAS))) - del_Command(ce->ce_vardata, cmptr->func); + CommandDelX(NULL, cmptr); if (find_Command_simple(ce->ce_vardata)) { config_warn("%s:%i: Alias '%s' would conflict with command (or server token) '%s', alias not added.",