X-Git-Url: https://jfr.im/git/solanum.git/blobdiff_plain/81af5bcb394280ff1af82486961d852b102b923b..765d839d3c25cf804d7c0f8dbf82ad5f04b09a12:/modules/core/m_mode.c diff --git a/modules/core/m_mode.c b/modules/core/m_mode.c index b2ab73cd..f4b837bc 100644 --- a/modules/core/m_mode.c +++ b/modules/core/m_mode.c @@ -28,24 +28,24 @@ #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 ||