X-Git-Url: https://jfr.im/git/solanum.git/blobdiff_plain/6b8db2daf2e0307105a3dfab9bb5e0949b4bd5f9..428ca87b01ad6c0487b424ce478f775cb7d94519:/modules/core/m_mode.c diff --git a/modules/core/m_mode.c b/modules/core/m_mode.c index ac020801..355e382a 100644 --- a/modules/core/m_mode.c +++ b/modules/core/m_mode.c @@ -42,11 +42,11 @@ #include "packet.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 **); +static int m_mode(struct MsgBuf *, struct Client *, struct Client *, int, const char **); +static int ms_mode(struct MsgBuf *, struct Client *, struct Client *, int, const char **); +static int ms_tmode(struct MsgBuf *, struct Client *, struct Client *, int, const char **); +static int ms_mlock(struct MsgBuf *, struct Client *, struct Client *, int, const char **); +static int ms_bmask(struct MsgBuf *, struct Client *, struct Client *, int, const char **); struct Message mode_msgtab = { "MODE", 0, 0, 0, MFLG_SLOW, @@ -74,7 +74,7 @@ DECLARE_MODULE_AV1(mode, NULL, NULL, mode_clist, NULL, NULL, "$Revision: 1006 $" * parv[1] - channel */ static int -m_mode(struct Client *client_p, struct Client *source_p, int parc, const char *parv[]) +m_mode(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p, int parc, const char *parv[]) { struct Channel *chptr = NULL; struct membership *msptr; @@ -140,7 +140,7 @@ m_mode(struct Client *client_p, struct Client *source_p, int parc, const char *p /* Finish the flood grace period... */ if(MyClient(source_p) && !IsFloodDone(source_p)) { - if(!((parc == 3) && (parv[2][0] == 'b') && (parv[2][1] == '\0'))) + if(!((parc == 3) && (parv[2][0] == 'b' || parv[2][0] == 'q') && (parv[2][1] == '\0'))) flood_endgrace(source_p); } @@ -151,7 +151,7 @@ m_mode(struct Client *client_p, struct Client *source_p, int parc, const char *p } static int -ms_mode(struct Client *client_p, struct Client *source_p, int parc, const char *parv[]) +ms_mode(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p, int parc, const char *parv[]) { struct Channel *chptr; @@ -170,7 +170,7 @@ ms_mode(struct Client *client_p, struct Client *source_p, int parc, const char * } static int -ms_tmode(struct Client *client_p, struct Client *source_p, int parc, const char *parv[]) +ms_tmode(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p, int parc, const char *parv[]) { struct Channel *chptr = NULL; struct membership *msptr; @@ -210,7 +210,7 @@ ms_tmode(struct Client *client_p, struct Client *source_p, int parc, const char } static int -ms_mlock(struct Client *client_p, struct Client *source_p, int parc, const char *parv[]) +ms_mlock(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p, int parc, const char *parv[]) { struct Channel *chptr = NULL; @@ -235,19 +235,48 @@ ms_mlock(struct Client *client_p, struct Client *source_p, int parc, const char return 0; if(IsServer(source_p)) - set_channel_mlock(client_p, source_p, chptr, parv[3]); + set_channel_mlock(client_p, source_p, chptr, parv[3], TRUE); return 0; } +static void +possibly_remove_lower_forward(struct Client *fakesource_p, int mems, + struct Channel *chptr, rb_dlink_list *banlist, int mchar, + const char *mask, const char *forward) +{ + struct Ban *actualBan; + rb_dlink_node *ptr; + + RB_DLINK_FOREACH(ptr, banlist->head) + { + actualBan = ptr->data; + if(!irccmp(actualBan->banstr, mask) && + (actualBan->forward == NULL || + irccmp(actualBan->forward, forward) < 0)) + { + sendto_channel_local(mems, chptr, ":%s MODE %s -%c %s%s%s", + fakesource_p->name, + chptr->chname, + mchar, + actualBan->banstr, + actualBan->forward ? "$" : "", + actualBan->forward ? actualBan->forward : ""); + rb_dlinkDelete(&actualBan->node, banlist); + free_ban(actualBan); + return; + } + } +} + static int -ms_bmask(struct Client *client_p, struct Client *source_p, int parc, const char *parv[]) +ms_bmask(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p, int parc, const char *parv[]) { static char modebuf[BUFSIZE]; static char parabuf[BUFSIZE]; struct Channel *chptr; rb_dlink_list *banlist; - const char *s; + char *s, *forward; char *t; char *mbuf; char *pbuf; @@ -312,7 +341,7 @@ ms_bmask(struct Client *client_p, struct Client *source_p, int parc, const char fakesource_p = &me; else fakesource_p = source_p; - mlen = rb_sprintf(modebuf, ":%s MODE %s +", fakesource_p->name, chptr->chname); + mlen = sprintf(modebuf, ":%s MODE %s +", fakesource_p->name, chptr->chname); mbuf = modebuf + mlen; pbuf = parabuf; @@ -342,7 +371,18 @@ 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') + tlen--, forward = NULL; + else + possibly_remove_lower_forward(fakesource_p, + mems, chptr, banlist, + parv[3][0], s, forward); + } + + if(add_id(fakesource_p, chptr, s, forward, banlist, mode_type)) { /* this new one wont fit.. */ if(mlen + MAXMODEPARAMS + plen + tlen > BUFSIZE - 5 || @@ -351,16 +391,17 @@ ms_bmask(struct Client *client_p, struct Client *source_p, int parc, const char *mbuf = '\0'; *(pbuf - 1) = '\0'; sendto_channel_local(mems, chptr, "%s %s", modebuf, parabuf); - sendto_server(client_p, chptr, needcap, CAP_TS6, - "%s %s", modebuf, parabuf); mbuf = modebuf + mlen; pbuf = parabuf; plen = modecount = 0; } + if (forward != NULL) + forward[-1] = '$'; + *mbuf++ = parv[3][0]; - arglen = rb_sprintf(pbuf, "%s ", s); + arglen = sprintf(pbuf, "%s ", s); pbuf += arglen; plen += arglen; modecount++; @@ -386,11 +427,9 @@ ms_bmask(struct Client *client_p, struct Client *source_p, int parc, const char *mbuf = '\0'; *(pbuf - 1) = '\0'; sendto_channel_local(mems, chptr, "%s %s", modebuf, parabuf); - sendto_server(client_p, chptr, needcap, CAP_TS6, "%s %s", modebuf, parabuf); } sendto_server(client_p, chptr, CAP_TS6 | needcap, NOCAPS, ":%s BMASK %ld %s %s :%s", source_p->id, (long) chptr->channelts, chptr->chname, parv[3], parv[4]); return 0; } -