*/
#include "channel.h"
#include "client.h"
-#include "gline.h" /* bad_channel */
#include "hash.h"
#include "ircd.h"
#include "ircd_alloc.h"
assert(m->channel == chptr);
if (m->user == cptr)
return m;
- m=m->next_member;
+ m = m->next_member;
}
}
/* Users on the other hand aren't allowed on more than 15 channels. 50%
assert(m->user == cptr);
if (m->channel == chptr)
return m;
- m=m->next_channel;
+ m = m->next_channel;
}
}
return 0;
return who;
if (!(who = get_history(user, KILLCHASETIMELIMIT))) {
- sendto_one(sptr, err_str(ERR_NOSUCHNICK), me.name, sptr->name, user);
+ send_reply(sptr, ERR_NOSUCHNICK, user);
return 0;
}
if (chasing)
const char* param, time_t creationtime)
{
if (IsServer(cptr) && DoesOp(mode) && creationtime)
- sendto_one(cptr, ":%s MODE %s %s %s " TIME_T_FMT,
+ sendto_one(cptr, ":%s MODE %s %s %s " TIME_T_FMT, /* XXX DEAD */
from, name, mode, param, creationtime);
else
- sendto_one(cptr, ":%s MODE %s %s %s", from, name, mode, param);
+ sendto_one(cptr, ":%s MODE %s %s %s", from, name, mode, param); /* XXX DEAD */
}
#endif /* 0 */
}
if (MyUser(cptr) && !removed_bans && (len > MAXBANLENGTH || (cnt >= MAXBANS)))
{
- sendto_one(cptr, err_str(ERR_BANLISTFULL), me.name, cptr->name,
- chptr->chname, banid);
+ send_reply(cptr, ERR_BANLISTFULL, chptr->chname, banid);
return -1;
}
if (change)
assert(0 != chptr);
for (lp = chptr->banlist; lp; lp = lp->next)
- sendto_one(cptr, rpl_str(RPL_BANLIST), me.name, cptr->name,
- chptr->chname, lp->value.ban.banstr, lp->value.ban.who,
- lp->value.ban.when);
- sendto_one(cptr, rpl_str(RPL_ENDOFBANLIST), me.name, cptr->name,
- chptr->chname);
+ send_reply(cptr, RPL_BANLIST, chptr->chname, lp->value.ban.banstr,
+ lp->value.ban.who, lp->value.ban.when);
+
+ send_reply(cptr, RPL_ENDOFBANLIST, chptr->chname);
}
/*
if (!(member_x = find_member_link(chptr, who)) ||
(MyUser(sptr) && IsZombie(member_x)))
{
- sendto_one(cptr, err_str(ERR_USERNOTINCHANNEL),
- me.name, cptr->name, who->name, chptr->chname);
+ send_reply(cptr, ERR_USERNOTINCHANNEL, who->name, chptr->chname);
break;
}
/*
* XXX - CHECKME
*/
if (MyUser(cptr)) {
- sendto_one(cptr, err_str(ERR_ISCHANSERVICE), me.name,
- cptr->name, parv[0], chptr->chname);
+ send_reply(cptr, ERR_ISCHANSERVICE, parv[0], chptr->chname);
break;
}
else {
if (whatt == MODE_DEL && IsOperOnLocalChannel(who, chptr->chname) &&
(who != sptr) && MyUser(cptr) && *curr == 'o')
{
- sendto_one(cptr, err_str(ERR_ISOPERLCHAN), me.name,
- cptr->name, parv[0], chptr->chname);
+ send_reply(cptr, ERR_ISOPERLCHAN, parv[0], chptr->chname);
break;
}
#endif
if (whatt == MODE_ADD)
{
if (*mode->key && !IsServer(cptr))
- sendto_one(cptr, err_str(ERR_KEYSET),
- me.name, cptr->name, chptr->chname);
+ send_reply(cptr, ERR_KEYSET, chptr->chname);
else if (!*mode->key || IsServer(cptr))
{
lp = &chops[opcnt++];
newmode &= ~*ip;
}
else if (!IsServer(cptr))
- sendto_one(cptr, err_str(ERR_UNKNOWNMODE),
- me.name, cptr->name, *curr);
+ send_reply(cptr, ERR_UNKNOWNMODE, *curr);
break;
}
curr++;
/* Bounce here */
if (!hacknotice && *bmodebuf && chptr->creationtime)
{
- sendto_one(cptr, "%s " TOK_MODE " %s %s %s " TIME_T_FMT,
- NumServ(&me), chptr->chname, bmodebuf, nbparambuf,
- *badop == 2 ? (time_t) 0 : chptr->creationtime);
+ sendcmdto_one(&me, CMD_MODE, cptr, "%H %s %s %Tu", chptr, bmodebuf,
+ nbparambuf, *badop == 2 ? (time_t) 0 : chptr->creationtime);
}
/* If there are possibly bans to re-add, bounce them now */
if (add_banid_called && bounce)
{
len[0] = strlen(ban[0]->value.ban.banstr);
cnt = 1; /* We already got one ban :) */
+ /* XXX sendbuf used to send ban bounces! */
sblen = sprintf_irc(sendbuf, ":%s MODE %s +b",
me.name, chptr->chname) - sendbuf;
total_len = sblen + 1 + len[0]; /* 1 = ' ' */
struct Membership* member_z;
struct Client *acptr;
if (IsServer(sptr))
+ /* XXX sendbuf used to send ban bounces! */
psblen = sprintf_irc(sendbuf, ":%s MODE %s -b",
sptr->name, chptr->chname) - sendbuf;
else /* We rely on IsRegistered(sptr) being true for MODE */
*/
void clean_channelname(char *cn)
{
- for (; *cn; ++cn) {
- if (!IsChannelChar(*cn)) {
- *cn = '\0';
+ int i;
+
+ for (i = 0; cn[i]; i++) {
+ if (i >= CHANNELLEN || !IsChannelChar(cn[i])) {
+ cn[i] = '\0';
return;
}
- if (IsChannelLower(*cn)) {
- *cn = ToLower(*cn);
+ if (IsChannelLower(cn[i])) {
+ cn[i] = ToLower(cn[i]);
#ifndef FIXME
/*
* Remove for .08+
* toupper(0xd0)
*/
- if ((unsigned char)(*cn) == 0xd0)
- *cn = (char) 0xf0;
+ if ((unsigned char)(cn[i]) == 0xd0)
+ cn[i] = (char) 0xf0;
#endif
}
}
chptr->topic_time < args->max_topic_time)))
{
if (ShowChannel(cptr,chptr))
- sendto_one(cptr, rpl_str(RPL_LIST), me.name, cptr->name,
- chptr->chname,
- chptr->users, chptr->topic);
+ send_reply(cptr, RPL_LIST, chptr->chname, chptr->users,
+ chptr->topic);
chptr = chptr->next;
break;
}
{
MyFree(cptr->listing);
cptr->listing = NULL;
- sendto_one(cptr, rpl_str(RPL_LISTEND), me.name, cptr->name);
+ send_reply(cptr, RPL_LISTEND);
break;
}
}
}
}
-
+/* XXX AIEEEE! sendbuf is an institution here :( */
void add_token_to_sendbuf(char *token, size_t *sblenp, int *firstp,
int *send_itp, char is_a_ban, int mode)
{
if (*count == -1) /* initialize ? */
{
+ /* XXX sendbuf used! */
sbp = sbpi =
sprintf_irc(sendbuf, ":%s MODE %s -", sptr->name, chptr->chname);
pb = parabuf;
if (MyUser(who)) /* server 4 */
{
if (IsServer(cptr)) /* Case b) ? */
- sendto_one(cptr, PartFmt1, who->name, chptr->chname);
+ sendcmdto_one(who, CMD_PART, cptr, "%H", chptr);
remove_user_from_channel(who, chptr);
return;
}
return count;
}
+/* XXX we can probably get rid of send_user_joins */
void send_user_joins(struct Client *cptr, struct Client *user)
{
struct Membership* chan;
if (cnt)
{
buf[len - 1] = '\0';
- sendto_one(cptr, "%s", buf);
+ sendto_one(cptr, "%s", buf); /* XXX Possibly DEAD */
}
*buf = ':';
strcpy(buf + 1, user->name);
}
}
if (*buf && cnt)
- sendto_one(cptr, "%s", buf);
+ sendto_one(cptr, "%s", buf); /* XXX Possibly DEAD */
}
/*
* This function prepares sendbuf with the server notices and wallops
* to be sent for all hacks. -Ghostwolf 18-May-97
*/
-
+/* XXX let's get rid of this if we can */
void send_hack_notice(struct Client *cptr, struct Client *sptr, int parc,
char *parv[], int badop, int mtype)
{
":%s NOTICE * :*** Notice -- %sHACK(%d): %s MODE %s %s%s ["
TIME_T_FMT "]", me.name, (badop == 3) ? "BOUNCE or " : "", badop,
parv[0], parv[1], parv[2], params, chptr->creationtime);
- sendbufto_op_mask((badop == 3) ? SNO_HACK3 : (badop ==
+ sendbufto_op_mask((badop == 3) ? SNO_HACK3 : (badop == /* XXX DYING */
4) ? SNO_HACK4 : SNO_HACK2);
if ((IsServer(sptr)) && (badop == 2))
{
sprintf_irc(sendbuf, ":%s DESYNCH :HACK: %s MODE %s %s%s",
me.name, parv[0], parv[1], parv[2], params);
- sendbufto_serv_butone(cptr);
+ sendbufto_serv_butone(cptr); /* XXX DYING */
}
break;
}
case 2: /* No conversion is needed for CREATE; the only numnick is sptr */
{
- sendto_serv_butone(cptr, ":%s DESYNCH :HACK: %s CREATE %s %s",
+ sendto_serv_butone(cptr, ":%s DESYNCH :HACK: %s CREATE %s %s", /* XXX DYING */
me.name, sptr->name, chptr->chname, parv[2]);
- sendto_op_mask(SNO_HACK2, "HACK(2): %s CREATE %s %s",
+ sendto_op_mask(SNO_HACK2, "HACK(2): %s CREATE %s %s", /* XXX DYING */
sptr->name, chptr->chname, parv[2]);
break;
}
sprintf_irc(sendbuf,
":%s NOTICE * :*** Notice -- HACK: %s KICK %s <%s> :%s",
me.name, sptr->name, parv[1], parv[2], parv[3]);
- sendbufto_op_mask(SNO_HACK4);
+ sendbufto_op_mask(SNO_HACK4); /* XXX DYING */
break;
}
}
* of course, str2 is not NULL)
*/
static void
-build_string(char *strptr, int *strptr_i, char *str1, char *str2)
+build_string(char *strptr, int *strptr_i, char *str1, char *str2, char c)
{
- strptr[(*strptr_i)++] = ' ';
+ if (c)
+ strptr[(*strptr_i)++] = c;
while (*str1)
strptr[(*strptr_i)++] = *(str1++);
/* deal with clients... */
if (MB_TYPE(mbuf, i) & (MODE_CHANOP | MODE_VOICE))
- build_string(strptr, strptr_i, MB_CLIENT(mbuf, i)->name, 0);
+ build_string(strptr, strptr_i, MB_CLIENT(mbuf, i)->name, 0, ' ');
/* deal with strings... */
else if (MB_TYPE(mbuf, i) & (MODE_KEY | MODE_BAN))
- build_string(strptr, strptr_i, MB_STRING(mbuf, i), 0);
+ build_string(strptr, strptr_i, MB_STRING(mbuf, i), 0, ' ');
/*
* deal with limit; note we cannot include the limit parameter if we're
*/
else if ((MB_TYPE(mbuf, i) & (MODE_ADD | MODE_LIMIT)) ==
(MODE_ADD | MODE_LIMIT))
- build_string(strptr, strptr_i, limitbuf, 0);
+ build_string(strptr, strptr_i, limitbuf, 0, ' ');
}
/* send the messages off to their destination */
if (mbuf->mb_dest & MODEBUF_DEST_HACK2) {
- sendto_op_mask(SNO_HACK2, "HACK(2): %s MODE %s %s%s%s%s%s%s [" TIME_T_FMT
- "]", app_source->name, mbuf->mb_channel->chname,
- rembuf_i ? "-" : "", rembuf, addbuf_i ? "+" : "", addbuf,
- remstr, addstr, mbuf->mb_channel->creationtime);
- sendto_serv_butone(mbuf->mb_connect, "%s " TOK_DESYNCH
- " :HACK: %s MODE %s %s%s%s%s%s%s [" TIME_T_FMT "]",
- NumServ(&me), app_source->name,
- mbuf->mb_channel->chname, rembuf_i ? "-" : "", rembuf,
- addbuf_i ? "+" : "", addbuf, remstr, addstr,
- mbuf->mb_channel->creationtime);
+ sendto_opmask_butone(0, SNO_HACK2, "HACK(2): %s MODE %s %s%s%s%s%s%s "
+ "[%Tu]", app_source->name, mbuf->mb_channel->chname,
+ rembuf_i ? "-" : "", rembuf, addbuf_i ? "+" : "",
+ addbuf, remstr, addstr,
+ mbuf->mb_channel->creationtime);
+ sendcmdto_serv_butone(&me, CMD_DESYNCH, mbuf->mb_connect,
+ ":HACK: %s MODE %s %s%s%s%s%s%s [%Tu]",
+ app_source->name, mbuf->mb_channel->chname,
+ rembuf_i ? "-" : "", rembuf,
+ addbuf_i ? "+" : "", addbuf, remstr, addstr,
+ mbuf->mb_channel->creationtime);
}
if (mbuf->mb_dest & MODEBUF_DEST_HACK3)
- sendto_op_mask(SNO_HACK3, "BOUNCE or HACK(3): %s MODE %s %s%s%s%s%s%s ["
- TIME_T_FMT "]", app_source->name,
- mbuf->mb_channel->chname, rembuf_i ? "-" : "", rembuf,
- addbuf_i ? "+" : "", addbuf, remstr, addstr,
- mbuf->mb_channel->creationtime);
+ sendto_opmask_butone(0, SNO_HACK3, "BOUNCE or HACK(3): %s MODE %s "
+ "%s%s%s%s%s%s [%Tu]", app_source->name,
+ mbuf->mb_channel->chname, rembuf_i ? "-" : "",
+ rembuf, addbuf_i ? "+" : "", addbuf, remstr, addstr,
+ mbuf->mb_channel->creationtime);
if (mbuf->mb_dest & MODEBUF_DEST_HACK4)
- sendto_op_mask(SNO_HACK4, "HACK(4): %s MODE %s %s%s%s%s%s%s [" TIME_T_FMT
- "]", app_source->name, mbuf->mb_channel->chname,
- rembuf_i ? "-" : "", rembuf, addbuf_i ? "+" : "", addbuf,
- remstr, addstr, mbuf->mb_channel->creationtime);
+ sendto_opmask_butone(0, SNO_HACK4, "HACK(4): %s MODE %s %s%s%s%s%s%s "
+ "[%Tu]", app_source->name, mbuf->mb_channel->chname,
+ rembuf_i ? "-" : "", rembuf, addbuf_i ? "+" : "",
+ addbuf, remstr, addstr,
+ mbuf->mb_channel->creationtime);
#ifdef OPATH
if (mbuf->mb_dest & MODEBUF_DEST_LOG) {
- if (IsServer(mbuf->mb_source))
- write_log(OPATH, TIME_T_FMT " %s OPMODE %s %s%s%s%s%s%s\n", TStime(),
- mbuf->mb_source->name, mbuf->mb_channel->chname,
- rembuf_i ? "-" : "", rembuf, addbuf_i ? "+" : "", addbuf,
- remstr, addstr);
- else
- write_log(OPATH, TIME_T_FMT " %s!%s@%s OPMODE %s %s%s%s%s%s%s\n",
- TStime(), mbuf->mb_source->name,
- mbuf->mb_source->user->username, mbuf->mb_source->user->host,
- mbuf->mb_channel->chname, rembuf_i ? "-" : "", rembuf,
- addbuf_i ? "+" : "", addbuf, remstr, addstr);
+ write_log(OPATH, "%Tu %#C OPMODE %H %s%s%s%s%s%s\n", TStime(),
+ mbuf->mb_source, mbuf->mb_channel, rembuf_i ? "-" : "", rembuf,
+ addbuf_i ? "+" : "", addbuf, remstr, addstr);
}
#endif
if (mbuf->mb_dest & MODEBUF_DEST_CHANNEL)
- sendto_channel_butserv(mbuf->mb_channel, app_source,
- ":%s MODE %s %s%s%s%s%s%s", app_source->name,
- mbuf->mb_channel->chname, rembuf_i ? "-" : "",
- rembuf, addbuf_i ? "+" : "", addbuf, remstr,
- addstr);
+ sendcmdto_channel_butserv(app_source, CMD_MODE, mbuf->mb_channel,
+ "%H %s%s%s%s%s%s", mbuf->mb_channel,
+ rembuf_i ? "-" : "", rembuf,
+ addbuf_i ? "+" : "", addbuf, remstr, addstr);
}
/* Now are we supposed to propagate to other servers? */
/* deal with modes that take clients */
if (MB_TYPE(mbuf, i) & (MODE_CHANOP | MODE_VOICE))
- build_string(strptr, strptr_i, NumNick(MB_CLIENT(mbuf, i)));
+ build_string(strptr, strptr_i, NumNick(MB_CLIENT(mbuf, i)), ' ');
/* deal with modes that take strings */
else if (MB_TYPE(mbuf, i) & (MODE_KEY | MODE_BAN))
- build_string(strptr, strptr_i, MB_STRING(mbuf, i), 0);
+ build_string(strptr, strptr_i, MB_STRING(mbuf, i), 0, ' ');
/*
* deal with the limit. Logic here is complicated; if HACK2 is set,
* include the original limit if it looks like it's being removed
*/
else if ((MB_TYPE(mbuf, i) & limitdel) == limitdel)
- build_string(strptr, strptr_i, limitbuf, 0);
+ build_string(strptr, strptr_i, limitbuf, 0, ' ');
}
/* we were told to deop the source */
if (mbuf->mb_dest & MODEBUF_DEST_DEOP) {
addbuf[addbuf_i++] = 'o'; /* remember, sense is reversed */
addbuf[addbuf_i] = '\0'; /* terminate the string... */
- build_string(addstr, &addstr_i, NumNick(mbuf->mb_source)); /* add user */
+ build_string(addstr, &addstr_i, NumNick(mbuf->mb_source), ' ');
/* mark that we've done this, so we don't do it again */
mbuf->mb_dest &= ~MODEBUF_DEST_DEOP;
if (mbuf->mb_dest & MODEBUF_DEST_OPMODE) {
/* If OPMODE was set, we're propagating the mode as an OPMODE message */
- if (IsServer(mbuf->mb_source))
- sendto_serv_butone(mbuf->mb_connect, "%s " TOK_OPMODE
- " %s %s%s%s%s%s%s", NumServ(mbuf->mb_source),
- mbuf->mb_channel->chname, rembuf_i ? "-" : "",
- rembuf, addbuf_i ? "+" : "", addbuf, remstr,
- addstr);
- else
- sendto_serv_butone(mbuf->mb_connect, "%s%s " TOK_OPMODE
- " %s %s%s%s%s%s%s", NumNick(mbuf->mb_source),
- mbuf->mb_channel->chname, rembuf_i ? "-" : "",
- rembuf, addbuf_i ? "+" : "", addbuf, remstr,
- addstr);
+ sendcmdto_serv_butone(mbuf->mb_source, CMD_OPMODE, mbuf->mb_connect,
+ "%H %s%s%s%s%s%s", mbuf->mb_channel,
+ rembuf_i ? "-" : "", rembuf, addbuf_i ? "+" : "",
+ addbuf, remstr, addstr);
} else if (mbuf->mb_dest & MODEBUF_DEST_BOUNCE) {
/*
* If HACK2 was set, we're bouncing; we send the MODE back to the
* connection we got it from with the senses reversed and a TS of 0;
* origin is us
*/
- sendto_one(mbuf->mb_connect, "%s " TOK_MODE " %s %s%s%s%s%s%s "
- TIME_T_FMT, NumServ(&me), mbuf->mb_channel->chname,
- addbuf_i ? "-" : "", addbuf, rembuf_i ? "+" : "", rembuf,
- addstr, remstr, mbuf->mb_channel->creationtime);
+ sendcmdto_one(&me, CMD_MODE, mbuf->mb_connect, "%H %s%s%s%s%s%s %Tu",
+ mbuf->mb_channel, addbuf_i ? "-" : "", addbuf,
+ rembuf_i ? "+" : "", rembuf, addstr, remstr,
+ mbuf->mb_channel->creationtime);
} else {
/*
* We're propagating a normal MODE command to the rest of the network;
* we send the actual channel TS unless this is a HACK3 or a HACK4
*/
if (IsServer(mbuf->mb_source))
- sendto_serv_butone(mbuf->mb_connect, "%s " TOK_MODE " %s %s%s%s%s%s%s "
- TIME_T_FMT, NumServ(mbuf->mb_source),
- mbuf->mb_channel->chname, rembuf_i ? "-" : "",
- rembuf, addbuf_i ? "+" : "", addbuf, remstr,
- addstr, (mbuf->mb_dest & MODEBUF_DEST_HACK4) ? 0 :
- mbuf->mb_channel->creationtime);
+ sendcmdto_serv_butone(mbuf->mb_source, CMD_MODE, mbuf->mb_connect,
+ "%H %s%s%s%s%s%s %Tu", mbuf->mb_channel,
+ rembuf_i ? "-" : "", rembuf, addbuf_i ? "+" : "",
+ addbuf, remstr, addstr,
+ (mbuf->mb_dest & MODEBUF_DEST_HACK4) ? 0 :
+ mbuf->mb_channel->creationtime);
else
- sendto_serv_butone(mbuf->mb_connect, "%s%s " TOK_MODE
- " %s %s%s%s%s%s%s", NumNick(mbuf->mb_source),
- mbuf->mb_channel->chname, rembuf_i ? "-" : "",
- rembuf, addbuf_i ? "+" : "", addbuf, remstr,
- addstr);
+ sendcmdto_serv_butone(mbuf->mb_source, CMD_MODE, mbuf->mb_connect,
+ "%H %s%s%s%s%s%s", mbuf->mb_channel,
+ rembuf_i ? "-" : "", rembuf, addbuf_i ? "+" : "",
+ addbuf, remstr, addstr);
}
}
if (state->done & DONE_NOTOPER)
return;
- sendto_one(state->sptr, err_str(state->flags & MODE_PARSE_NOTOPER ?
- ERR_CHANOPRIVSNEEDED : ERR_NOTONCHANNEL),
- me.name, state->sptr->name, state->chptr->chname);
+ send_reply(state->sptr, (state->flags & MODE_PARSE_NOTOPER) ?
+ ERR_CHANOPRIVSNEEDED : ERR_NOTONCHANNEL, state->chptr->chname);
state->done |= DONE_NOTOPER;
}
if ((state->dir == MODE_ADD && *state->chptr->mode.key) ||
(state->dir == MODE_DEL &&
ircd_strcmp(state->chptr->mode.key, t_str))) {
- sendto_one(state->sptr, err_str(ERR_KEYSET), me.name, state->sptr->name,
- state->chptr->chname);
+ send_reply(state->sptr, ERR_KEYSET, state->chptr->chname);
return;
}
} else {
if (state->flags & MODE_PARSE_SET && MyUser(state->sptr) &&
(len > MAXBANLENGTH || count >= MAXBANS)) {
- send_error_to_client(state->sptr, ERR_BANLISTFULL,
- state->chptr->chname, ban->value.ban.banstr);
+ send_reply(state->sptr, ERR_BANLISTFULL, state->chptr->chname,
+ ban->value.ban.banstr);
count--;
len -= banlen;
else
acptr = findNUser(t_str);
+ if (!acptr)
+ return; /* find_chasing() already reported an error to the user */
+
for (i = 0; i < MAXPARA; i++) /* find an element to stick them in */
if (!state->cli_change[i].flag || (state->cli_change[i].client == acptr &&
state->cli_change[i].flag & flag_p[0]))
state->cli_change[i].client)) ||
(MyUser(state->sptr) && IsZombie(member))) {
if (MyUser(state->sptr))
- sendto_one(state->sptr, err_str(ERR_USERNOTINCHANNEL), me.name,
- state->sptr->name, state->cli_change[i].client->name,
- state->chptr->chname);
+ send_reply(state->sptr, ERR_USERNOTINCHANNEL,
+ state->cli_change[i].client->name, state->chptr->chname);
continue;
}
/* prevent +k users from being deopped */
if (IsChannelService(state->cli_change[i].client)) {
if (state->flags & MODE_PARSE_FORCE) /* it was forced */
- sendto_op_mask(SNO_HACK4, ":%s NOTICE * :*** Notice -- "
- "Deop of +k user on %s by %s",me.name,
- state->chptr->chname,
- (IsServer(state->sptr) ? state->sptr->name :
- state->sptr->user->server->name));
+ sendto_opmask_butone(0, SNO_HACK4, "Deop of +k user on %H by %s",
+ state->chptr,
+ (IsServer(state->sptr) ? state->sptr->name :
+ state->sptr->user->server->name));
else if (MyUser(state->sptr) && state->flags & MODE_PARSE_SET) {
- sendto_one(state->sptr, err_str(ERR_ISCHANSERVICE), me.name,
- state->sptr->name, state->cli_change[i].client->name,
- state->chptr->chname);
+ send_reply(state->sptr, ERR_ISCHANSERVICE,
+ state->cli_change[i].client->name, state->chptr->chname);
continue;
}
}
if (MyUser(state->sptr) && state->cli_change[i].client != state->sptr &&
IsOperOnLocalChannel(state->cli_change[i].client,
state->chptr->chname)) {
- sendto_one(state->sptr, err_str(ERR_ISOPERLCHAN), me.name,
- state->sptr->name, state->cli_change[i].client->name,
- state->chptr->chname);
+ send_reply(state->sptr, ERR_ISOPERLCHAN,
+ state->cli_change[i].client->name, state->chptr->chname);
continue;
}
#endif
if (!flag_p[0]) { /* didn't find it? complain and continue */
if (MyUser(state.sptr))
- sendto_one(state.sptr, err_str(ERR_UNKNOWNMODE), me.name,
- state.sptr->name, *modestr);
+ send_reply(state.sptr, ERR_UNKNOWNMODE, *modestr);
continue;
}
return state.args_used; /* tell our parent how many args we gobbled */
}
+
+/*
+ * Initialize a join buffer
+ */
+void
+joinbuf_init(struct JoinBuf *jbuf, struct Client *source,
+ struct Client *connect, unsigned int type, char *comment,
+ time_t create)
+{
+ int i;
+
+ assert(0 != jbuf);
+ assert(0 != source);
+ assert(0 != connect);
+
+ jbuf->jb_source = source; /* just initialize struct JoinBuf */
+ jbuf->jb_connect = connect;
+ jbuf->jb_type = type;
+ jbuf->jb_comment = comment;
+ jbuf->jb_create = create;
+ jbuf->jb_count = 0;
+ jbuf->jb_strlen = (((type == JOINBUF_TYPE_JOIN ||
+ type == JOINBUF_TYPE_PART ||
+ type == JOINBUF_TYPE_PARTALL) ?
+ STARTJOINLEN : STARTCREATELEN) +
+ (comment ? strlen(comment) + 2 : 0));
+
+ for (i = 0; i < MAXJOINARGS; i++)
+ jbuf->jb_channels[i] = 0;
+}
+
+/*
+ * Add a channel to the join buffer
+ */
+void
+joinbuf_join(struct JoinBuf *jbuf, struct Channel *chan, unsigned int flags)
+{
+ unsigned int len;
+
+ assert(0 != jbuf);
+
+ if (chan) {
+ if (jbuf->jb_type == JOINBUF_TYPE_PART ||
+ jbuf->jb_type == JOINBUF_TYPE_PARTALL) {
+ /* Send notification to channel */
+ if (!(flags & CHFL_ZOMBIE))
+ sendcmdto_channel_butserv(jbuf->jb_source, CMD_PART, chan,
+ (flags & CHFL_BANNED || !jbuf->jb_comment) ?
+ ":%H" : "%H :%s", chan, jbuf->jb_comment);
+ else if (MyUser(jbuf->jb_source))
+ sendcmdto_one(jbuf->jb_source, CMD_PART, jbuf->jb_source,
+ (flags & CHFL_BANNED || !jbuf->jb_comment) ?
+ ":%H" : "%H :%s", chan, jbuf->jb_comment);
+ /* XXX: Shouldn't we send a PART here anyway? */
+
+ } else {
+ /* Add user to channel */
+ add_user_to_channel(chan, jbuf->jb_source, flags);
+
+ /* Send the notification to the channel */
+ sendcmdto_channel_butserv(jbuf->jb_source, CMD_JOIN, chan, ":%H", chan);
+
+ /* send an op, too, if needed */
+ if (jbuf->jb_type == JOINBUF_TYPE_CREATE &&
+ !IsModelessChannel(chan->chname))
+ sendcmdto_channel_butserv(jbuf->jb_source, CMD_MODE, chan, "%H +o %C",
+ chan, jbuf->jb_source);
+ }
+
+ if (jbuf->jb_type == JOINBUF_TYPE_PARTALL || IsLocalChannel(chan->chname))
+ return; /* don't send to remote */
+ }
+
+ /* figure out if channel name will cause buffer to be overflowed */
+ len = chan ? strlen(chan->chname) + 1 : 2;
+ if (jbuf->jb_strlen + len > IRC_BUFSIZE)
+ joinbuf_flush(jbuf);
+
+ /* add channel to list of channels to send and update counts */
+ jbuf->jb_channels[jbuf->jb_count++] = chan;
+ jbuf->jb_strlen += len;
+
+ /* if we've used up all slots, flush */
+ if (jbuf->jb_count >= MAXJOINARGS)
+ joinbuf_flush(jbuf);
+}
+
+/*
+ * Flush the channel list to remote servers
+ */
+int
+joinbuf_flush(struct JoinBuf *jbuf)
+{
+ char chanlist[IRC_BUFSIZE];
+ int chanlist_i = 0;
+ int i;
+
+ if (!jbuf->jb_count || jbuf->jb_type == JOINBUF_TYPE_PARTALL)
+ return 0; /* no joins to process */
+
+ for (i = 0; i < jbuf->jb_count; i++) { /* build channel list */
+ build_string(chanlist, &chanlist_i,
+ jbuf->jb_channels[i] ? jbuf->jb_channels[i]->chname : "0", 0,
+ i == 0 ? '\0' : ',');
+ if (JOINBUF_TYPE_PART == jbuf->jb_type)
+ /* Remove user from channel */
+ remove_user_from_channel(jbuf->jb_source, jbuf->jb_channels[i]);
+
+ jbuf->jb_channels[i] = 0; /* mark slot empty */
+ }
+
+ jbuf->jb_count = 0; /* reset base counters */
+ jbuf->jb_strlen = ((jbuf->jb_type == JOINBUF_TYPE_JOIN ||
+ jbuf->jb_type == JOINBUF_TYPE_PART ?
+ STARTJOINLEN : STARTCREATELEN) +
+ (jbuf->jb_comment ? strlen(jbuf->jb_comment) + 2 : 0));
+
+ /* and send the appropriate command */
+ switch (jbuf->jb_type) {
+ case JOINBUF_TYPE_JOIN:
+ sendcmdto_serv_butone(jbuf->jb_source, CMD_JOIN, jbuf->jb_connect,
+ "%s", chanlist);
+ break;
+
+ case JOINBUF_TYPE_CREATE:
+ sendcmdto_serv_butone(jbuf->jb_source, CMD_CREATE, jbuf->jb_connect,
+ "%s %Tu", chanlist, jbuf->jb_create);
+ break;
+
+ case JOINBUF_TYPE_PART:
+ sendcmdto_serv_butone(jbuf->jb_source, CMD_PART, jbuf->jb_connect,
+ jbuf->jb_comment ? "%s :%s" : "%s", chanlist,
+ jbuf->jb_comment);
+ break;
+ }
+
+ return 0;
+}