]> jfr.im git - solanum.git/blobdiff - modules/m_alias.c
chmode: Get elevated access for op-only queries
[solanum.git] / modules / m_alias.c
index 2a5d01f0b6b2805c5c2e0da6e7543ee170564cb2..b8f1b03551149b8f599abd48f104467763ef57d2 100644 (file)
@@ -31,6 +31,7 @@
 #include "numeric.h"
 #include "send.h"
 #include "packet.h"
+#include "s_assert.h"
 
 static const char alias_desc[] = "Provides the system for services aliases";
 
@@ -56,13 +57,16 @@ create_aliases(void)
        rb_dictionary_iter iter;
        struct alias_entry *alias;
 
-       s_assert(rb_dlink_list_length(alias_messages) > 0);
+       s_assert(rb_dlink_list_length(&alias_messages) == 0);
 
        RB_DICTIONARY_FOREACH(alias, &iter, alias_dict)
        {
-               struct Message *message = rb_malloc(sizeof(struct Message));
+               struct Message *message = rb_malloc(sizeof(*message) + strlen(alias->name) + 1);
+               char *cmd = (char*)message + sizeof(*message);
 
-               message->cmd = alias->name;
+               /* copy the alias name as it will be freed early on a rehash */
+               strcpy(cmd, alias->name);
+               message->cmd = cmd;
                memcpy(message->handlers, alias_msgtab, sizeof(alias_msgtab));
 
                mod_add_cmd(message);
@@ -97,7 +101,7 @@ _moddeinit(void)
 }
 
 static int
-reload_aliases(hook_data *data __unused)
+reload_aliases(hook_data *data)
 {
        destroy_aliases(); /* Clear old aliases */
        create_aliases();
@@ -114,23 +118,16 @@ m_alias(struct MsgBuf *msgbuf, struct Client *client_p, struct Client *source_p,
 
        if(aptr == NULL)
        {
-               if(IsPerson(source_p))
-                       sendto_one(source_p, form_str(ERR_UNKNOWNCOMMAND),
-                               me.name, source_p->name, msgbuf->cmd);
+               /* This shouldn't happen... */
+               if(IsPerson(client_p))
+                       sendto_one(client_p, form_str(ERR_UNKNOWNCOMMAND),
+                               me.name, client_p->name, msgbuf->cmd);
 
                return;
        }
-       else if(parc < 2)
-       {
-               sendto_one(client_p, form_str(ERR_NEEDMOREPARAMS),
-                          me.name,
-                          EmptyString(client_p->name) ? "*" : client_p->name,
-                          msgbuf->cmd);
-               return;
-       }
 
-       if(!IsFloodDone(source_p) && source_p->localClient->receiveM > 20)
-               flood_endgrace(source_p);
+       if(!IsFloodDone(client_p) && client_p->localClient->receiveM > 20)
+               flood_endgrace(client_p);
 
        p = strchr(aptr->target, '@');
        if(p != NULL)
@@ -150,21 +147,19 @@ m_alias(struct MsgBuf *msgbuf, struct Client *client_p, struct Client *source_p,
 
        if(target_p == NULL)
        {
-               sendto_one_numeric(source_p, ERR_SERVICESDOWN, form_str(ERR_SERVICESDOWN), aptr->target);
+               sendto_one_numeric(client_p, ERR_SERVICESDOWN, form_str(ERR_SERVICESDOWN), aptr->target);
                return;
        }
 
-       if(*parv[1] == '\0')
+       msgbuf_reconstruct_tail(msgbuf, 1);
+       if(EmptyString(parv[1]))
        {
-               sendto_one(source_p, form_str(ERR_NOTEXTTOSEND), me.name, source_p->name);
+               sendto_one(client_p, form_str(ERR_NOTEXTTOSEND), me.name, target_p->name);
                return;
        }
 
-       /* increment the hitcounter on this alias */
-       aptr->hits++;
-
        sendto_one(target_p, ":%s PRIVMSG %s :%s",
-                       get_id(source_p, target_p),
+                       get_id(client_p, target_p),
                        p != NULL ? aptr->target : get_id(target_p, target_p),
                        parv[1]);
 }