]> jfr.im git - solanum.git/blobdiff - modules/core/m_mode.c
Port ircd-seven banfowards to charybdis.
[solanum.git] / modules / core / m_mode.c
index b2ab73cd9e35456c519a151cf222ddad9e9f21ea..f4b837bc4d132486414cadf8f90aa588f9f0fdc8 100644 (file)
 #include "channel.h"
 #include "client.h"
 #include "hash.h"
-#include "irc_string.h"
+#include "match.h"
 #include "ircd.h"
 #include "numeric.h"
 #include "s_user.h"
 #include "s_conf.h"
 #include "s_serv.h"
-#include "s_log.h"
+#include "logger.h"
 #include "send.h"
 #include "msg.h"
 #include "parse.h"
 #include "modules.h"
 #include "packet.h"
-#include "sprintf_irc.h"
 #include "s_newconf.h"
 
 static int m_mode(struct Client *, struct Client *, int, const char **);
 static int ms_mode(struct Client *, struct Client *, int, const char **);
 static int ms_tmode(struct Client *, struct Client *, int, const char **);
+static int ms_mlock(struct Client *, struct Client *, int, const char **);
 static int ms_bmask(struct Client *, struct Client *, int, const char **);
 
 struct Message mode_msgtab = {
@@ -56,18 +56,21 @@ struct Message tmode_msgtab = {
        "TMODE", 0, 0, 0, MFLG_SLOW,
        {mg_ignore, mg_ignore, {ms_tmode, 4}, {ms_tmode, 4}, mg_ignore, mg_ignore}
 };
+struct Message mlock_msgtab = {
+       "MLOCK", 0, 0, 0, MFLG_SLOW,
+       {mg_ignore, mg_ignore, {ms_mlock, 3}, {ms_mlock, 3}, mg_ignore, mg_ignore}
+};
 struct Message bmask_msgtab = {
        "BMASK", 0, 0, 0, MFLG_SLOW,
        {mg_ignore, mg_ignore, mg_ignore, {ms_bmask, 5}, mg_ignore, mg_ignore}
 };
 
-mapi_clist_av1 mode_clist[] = { &mode_msgtab, &tmode_msgtab, &bmask_msgtab, NULL };
+mapi_clist_av1 mode_clist[] = { &mode_msgtab, &tmode_msgtab, &mlock_msgtab, &bmask_msgtab, NULL };
 
 DECLARE_MODULE_AV1(mode, NULL, NULL, mode_clist, NULL, NULL, "$Revision: 1006 $");
 
 /*
  * m_mode - MODE command handler
- * parv[0] - sender
  * parv[1] - channel
  */
 static int
@@ -206,6 +209,37 @@ ms_tmode(struct Client *client_p, struct Client *source_p, int parc, const char
        return 0;
 }
 
+static int
+ms_mlock(struct Client *client_p, struct Client *source_p, int parc, const char *parv[])
+{
+       struct Channel *chptr = NULL;
+
+       /* Now, try to find the channel in question */
+       if(!IsChanPrefix(parv[2][0]) || !check_channel_name(parv[2]))
+       {
+               sendto_one_numeric(source_p, ERR_BADCHANNAME, form_str(ERR_BADCHANNAME), parv[2]);
+               return 0;
+       }
+
+       chptr = find_channel(parv[2]);
+
+       if(chptr == NULL)
+       {
+               sendto_one_numeric(source_p, ERR_NOSUCHCHANNEL,
+                                  form_str(ERR_NOSUCHCHANNEL), parv[2]);
+               return 0;
+       }
+
+       /* TS is higher, drop it. */
+       if(atol(parv[1]) > chptr->channelts)
+               return 0;
+
+       if(IsServer(source_p))
+               set_channel_mlock(client_p, source_p, chptr, parv[3], TRUE);
+
+       return 0;
+}
+
 static int
 ms_bmask(struct Client *client_p, struct Client *source_p, int parc, const char *parv[])
 {
@@ -213,7 +247,7 @@ ms_bmask(struct Client *client_p, struct Client *source_p, int parc, const char
        static char parabuf[BUFSIZE];
        struct Channel *chptr;
        rb_dlink_list *banlist;
-       const char *s;
+       char *s, *forward;
        char *t;
        char *mbuf;
        char *pbuf;
@@ -308,7 +342,14 @@ ms_bmask(struct Client *client_p, struct Client *source_p, int parc, const char
                if(tlen > MODEBUFLEN)
                        break;
 
-               if(add_id(fakesource_p, chptr, s, banlist, mode_type))
+               if((forward = strchr(s+1, '$')) != NULL)
+               {
+                       *forward++ = '\0';
+                       if(*forward == '\0')
+                               forward = NULL;
+               }
+
+               if(add_id(fakesource_p, chptr, s, forward, banlist, mode_type))
                {
                        /* this new one wont fit.. */
                        if(mlen + MAXMODEPARAMS + plen + tlen > BUFSIZE - 5 ||