X-Git-Url: https://jfr.im/git/irc/rqf/shadowircd.git/blobdiff_plain/5366977b4f3c7a50d170bf7a1e29b14c74944db7..af81d5a0b09446188fd6f9c292b51519f2c1cedd:/src/chmode.c diff --git a/src/chmode.c b/src/chmode.c index fde7236..4f50f82 100644 --- a/src/chmode.c +++ b/src/chmode.c @@ -22,7 +22,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA * - * $Id: chmode.c 3161 2007-01-25 07:23:01Z nenolod $ + * $Id: chmode.c 3580 2007-11-07 23:45:14Z jilles $ */ #include "stdinc.h" @@ -65,7 +65,7 @@ void set_channel_mode(struct Client *, struct Client *, struct Channel *, struct membership *, int, const char **); int add_id(struct Client *source_p, struct Channel *chptr, - const char *banid, dlink_list * list, long mode_type); + const char *banid, rb_dlink_list * list, long mode_type); static struct ChModeChange mode_changes[BUFSIZE]; static int mode_count; @@ -89,31 +89,29 @@ get_channel_access(struct Client *source_p, struct membership *msptr) */ int add_id(struct Client *source_p, struct Channel *chptr, const char *banid, - dlink_list * list, long mode_type) + rb_dlink_list * list, long mode_type) { struct Ban *actualBan; - static char who[BANLEN]; + static char who[USERHOST_REPLYLEN]; char *realban = LOCAL_COPY(banid); - dlink_node *ptr; + rb_dlink_node *ptr; /* dont let local clients overflow the banlist, or set redundant * bans */ if(MyClient(source_p)) { - if((dlink_list_length(&chptr->banlist) + dlink_list_length(&chptr->exceptlist) + dlink_list_length(&chptr->invexlist) + dlink_list_length(&chptr->quietlist)) >= (chptr->mode.mode & MODE_EXLIMIT ? ConfigChannel.max_bans_large : ConfigChannel.max_bans)) + if((rb_dlink_list_length(&chptr->banlist) + rb_dlink_list_length(&chptr->exceptlist) + rb_dlink_list_length(&chptr->invexlist) + rb_dlink_list_length(&chptr->quietlist)) >= (chptr->mode.mode & MODE_EXLIMIT ? ConfigChannel.max_bans_large : ConfigChannel.max_bans)) { sendto_one(source_p, form_str(ERR_BANLISTFULL), me.name, source_p->name, chptr->chname, realban); return 0; } - collapse(realban); - DLINK_FOREACH(ptr, list->head) { actualBan = ptr->data; - if(match(actualBan->banstr, realban)) + if(mask_match(actualBan->banstr, realban)) return 0; } } @@ -130,14 +128,14 @@ add_id(struct Client *source_p, struct Channel *chptr, const char *banid, if(IsPerson(source_p)) - ircsprintf(who, "%s!%s@%s", source_p->name, source_p->username, source_p->host); + rb_sprintf(who, "%s!%s@%s", source_p->name, source_p->username, source_p->host); else strlcpy(who, source_p->name, sizeof(who)); actualBan = allocate_ban(realban, who); actualBan->when = CurrentTime; - dlinkAdd(actualBan, &actualBan->node, list); + rb_dlinkAdd(actualBan, &actualBan->node, list); /* invalidate the can_send() cache */ if(mode_type == CHFL_BAN || mode_type == CHFL_QUIET || mode_type == CHFL_EXCEPTION) @@ -153,9 +151,9 @@ add_id(struct Client *source_p, struct Channel *chptr, const char *banid, * side effects - given id is removed from the appropriate list */ int -del_id(struct Channel *chptr, const char *banid, dlink_list * list, long mode_type) +del_id(struct Channel *chptr, const char *banid, rb_dlink_list * list, long mode_type) { - dlink_node *ptr; + rb_dlink_node *ptr; struct Ban *banptr; if(EmptyString(banid)) @@ -167,7 +165,7 @@ del_id(struct Channel *chptr, const char *banid, dlink_list * list, long mode_ty if(irccmp(banid, banptr->banstr) == 0) { - dlinkDelete(&banptr->node, list); + rb_dlinkDelete(&banptr->node, list); free_ban(banptr); /* invalidate the can_send() cache */ @@ -241,7 +239,7 @@ pretty_mask(const char *idmask) if (*mask == '$') { - mask_pos += ircsprintf(mask_buf + mask_pos, "%s", mask) + 1; + mask_pos += rb_sprintf(mask_buf + mask_pos, "%s", mask) + 1; t = mask_buf + old_mask_pos + 1; if (*t == '!') *t = '~'; @@ -311,7 +309,7 @@ pretty_mask(const char *idmask) host[HOSTLEN] = '\0'; } - mask_pos += ircsprintf(mask_buf + mask_pos, "%s!%s@%s", nick, user, host) + 1; + mask_pos += rb_sprintf(mask_buf + mask_pos, "%s!%s@%s", nick, user, host) + 1; /* restore mask, since we may need to use it again later */ if(at) @@ -451,6 +449,14 @@ chm_staff(struct Client *source_p, struct Channel *chptr, *errors |= SM_ERR_NOPRIVS; return; } + if(MyClient(source_p) && !IsOperResv(source_p)) + { + if(!(*errors & SM_ERR_NOPRIVS)) + sendto_one(source_p, form_str(ERR_NOPRIVS), me.name, + source_p->name, "resv"); + *errors |= SM_ERR_NOPRIVS; + return; + } /* setting + */ if((dir == MODE_ADD) && !(chptr->mode.mode & mode_type)) @@ -486,8 +492,8 @@ chm_ban(struct Client *source_p, struct Channel *chptr, { const char *mask; const char *raw_mask; - dlink_list *list; - dlink_node *ptr; + rb_dlink_list *list; + rb_dlink_node *ptr; struct Ban *banptr; int errorval; int rpl_list; @@ -581,7 +587,10 @@ chm_ban(struct Client *source_p, struct Channel *chptr, me.name, source_p->name, chptr->chname, banptr->banstr, banptr->who, banptr->when); } - sendto_one(source_p, form_str(rpl_endlist), me.name, source_p->name, chptr->chname); + if (mode_type == CHFL_QUIET) + sendto_one(source_p, ":%s %d %s %s :End of Channel Quiet List", me.name, rpl_endlist, source_p->name, chptr->chname); + else + sendto_one(source_p, form_str(rpl_endlist), me.name, source_p->name, chptr->chname); return; } @@ -614,8 +623,11 @@ chm_ban(struct Client *source_p, struct Channel *chptr, else mask = pretty_mask(raw_mask); - /* we'd have problems parsing this, hyb6 does it too */ - if(strlen(mask) > (MODEBUFLEN - 2)) + /* we'd have problems parsing this, hyb6 does it too + * also make sure it will always fit on a line with channel + * name etc. + */ + if(strlen(mask) > IRCD_MIN(BANLEN, MODEBUFLEN - 5)) return; /* if we're adding a NEW id */ @@ -726,7 +738,6 @@ chm_op(struct Client *source_p, struct Channel *chptr, mode_changes[mode_count++].client = targ_p; mstptr->flags |= CHFL_CHANOP; - mstptr->flags &= ~CHFL_DEOPPED; } else { @@ -857,7 +868,7 @@ chm_limit(struct Client *source_p, struct Channel *chptr, if(EmptyString(lstr) || (limit = atoi(lstr)) <= 0) return; - ircsprintf(limitstr, "%d", limit); + rb_sprintf(limitstr, "%d", limit); mode_changes[mode_count].letter = c; mode_changes[mode_count].dir = MODE_ADD; @@ -1504,9 +1515,9 @@ set_channel_mode(struct Client *client_p, struct Client *source_p, return; if(IsServer(source_p)) - mlen = ircsprintf(modebuf, ":%s MODE %s ", fakesource_p->name, chptr->chname); + mlen = rb_sprintf(modebuf, ":%s MODE %s ", fakesource_p->name, chptr->chname); else - mlen = ircsprintf(modebuf, ":%s!%s@%s MODE %s ", + mlen = rb_sprintf(modebuf, ":%s!%s@%s MODE %s ", source_p->name, source_p->username, source_p->host, chptr->chname); @@ -1570,7 +1581,7 @@ set_channel_mode(struct Client *client_p, struct Client *source_p, if(mode_changes[i].arg != NULL) { paracount++; - len = ircsprintf(pbuf, "%s ", mode_changes[i].arg); + len = rb_sprintf(pbuf, "%s ", mode_changes[i].arg); pbuf += len; paralen += len; } @@ -1585,6 +1596,6 @@ set_channel_mode(struct Client *client_p, struct Client *source_p, } /* only propagate modes originating locally, or if we're hubbing */ - if(MyClient(source_p) || dlink_list_length(&serv_list) > 1) + if(MyClient(source_p) || rb_dlink_list_length(&serv_list) > 1) send_cap_mode_changes(client_p, source_p, chptr, mode_changes, mode_count); }