Thread: [srvx-commits] CVS: services/src chanserv.c,1.269,1.270 common.h,1.77,1.78 hash.c,1.162,1.163 hash.h
Brought to you by:
entrope
Update of /cvsroot/srvx/services/src
In directory usw-pr-cvs1:/tmp/cvs-serv778/src
Modified Files:
chanserv.c common.h hash.c hash.h opserv.c proto-bahamut.c
proto-p10.c proto.h tools.c
Log Message:
Make the individual protocol modules responsible for channel mode parsing.
Index: chanserv.c
===================================================================
RCS file: /cvsroot/srvx/services/src/chanserv.c,v
retrieving revision 1.269
retrieving revision 1.270
diff -C2 -r1.269 -r1.270
*** chanserv.c 11 Aug 2002 03:26:16 -0000 1.269
--- chanserv.c 14 Aug 2002 01:36:11 -0000 1.270
***************
*** 1246,1250 ****
if(removed->used)
{
! DelChannelBan(removed->used, removed->list, channel->channel, chanserv, 1);
}
--- 1246,1250 ----
if(removed->used)
{
! DelChannelBan(removed->used, (const char **)removed->list, channel->channel, chanserv, 1);
}
***************
*** 1772,1776 ****
parse_mode_lock(&CHANSERV_DEFAULT_MODES, 1, cData);
! mod_chanmode(channel, CHANSERV_DEFAULT_MODES, NULL, 0);
irc_mode(chanserv, channel, CHANSERV_DEFAULT_MODES);
--- 1772,1776 ----
parse_mode_lock(&CHANSERV_DEFAULT_MODES, 1, cData);
! mod_chanmode(channel, chanserv, CHANSERV_DEFAULT_MODES, NULL, 0);
irc_mode(chanserv, channel, CHANSERV_DEFAULT_MODES);
***************
*** 2989,2993 ****
else
{
! AddChannelBan(1, &ban, channel, chanserv, now, 1);
}
}
--- 2989,2993 ----
else
{
! AddChannelBan(1, (const char **)&ban, channel, chanserv, now, 1);
}
}
***************
*** 3113,3117 ****
if(removed->used)
{
! DelChannelBan(removed->used, removed->list, channel, chanserv, 1);
acted = 1;
}
--- 3113,3117 ----
if(removed->used)
{
! DelChannelBan(removed->used, (const char **)removed->list, channel, chanserv, 1);
acted = 1;
}
***************
*** 3207,3211 ****
string_list_append(removed, ban);
}
! DelChannelBan(removed->used, removed->list, channel, chanserv, 1);
free_string_list(removed);
--- 3207,3211 ----
string_list_append(removed, ban);
}
! DelChannelBan(removed->used, (const char **)removed->list, channel, chanserv, 1);
free_string_list(removed);
***************
*** 3229,3233 ****
}
! mod_chanmode(channel, change, NULL, 0);
irc_mode(chanserv, channel, change);
--- 3229,3233 ----
}
! mod_chanmode(channel, chanserv, change, NULL, 0);
irc_mode(chanserv, channel, change);
***************
*** 3835,3839 ****
create_mode_lock(modes, channel->channel_info);
! mod_chanmode(channel, modes, NULL, 0);
irc_mode(chanserv, channel, modes);
}
--- 3835,3839 ----
create_mode_lock(modes, channel->channel_info);
! mod_chanmode(channel, chanserv, modes, NULL, 0);
irc_mode(chanserv, channel, modes);
}
***************
*** 3853,3857 ****
}
! mod_chanmode(channel, changes, NULL, 0);
if(!check_user_level(user, channel, channel->channel_info->options[optEnfModes], 1, 0))
--- 3853,3857 ----
}
! mod_chanmode(channel, chanserv, changes, NULL, 0);
if(!check_user_level(user, channel, channel->channel_info->options[optEnfModes], 1, 0))
***************
*** 3863,3867 ****
create_mode_lock(modes, channel->channel_info);
! mod_chanmode(channel, modes, NULL, 0);
irc_mode(chanserv, channel, modes);
--- 3863,3867 ----
create_mode_lock(modes, channel->channel_info);
! mod_chanmode(channel, chanserv, modes, NULL, 0);
irc_mode(chanserv, channel, modes);
***************
*** 5122,5126 ****
create_mode_lock(modes, channel->channel_info);
! mod_chanmode(channel, modes, NULL, 0);
irc_mode(chanserv, channel, modes);
}
--- 5122,5126 ----
create_mode_lock(modes, channel->channel_info);
! mod_chanmode(channel, chanserv, modes, NULL, 0);
irc_mode(chanserv, channel, modes);
}
***************
*** 5759,5763 ****
char modes[MODELEN];
create_mode_lock(modes, cData);
! mod_chanmode(channel, modes, NULL, 0);
irc_mode(chanserv, channel, modes);
}
--- 5759,5763 ----
char modes[MODELEN];
create_mode_lock(modes, cData);
! mod_chanmode(channel, chanserv, modes, NULL, 0);
irc_mode(chanserv, channel, modes);
}
***************
*** 5850,5854 ****
ban = bData->mask;
! AddChannelBan(1, &ban, channel, chanserv, now, 1);
KickChannelUser(user, channel, chanserv, kick_reason);
return;
--- 5850,5854 ----
ban = bData->mask;
! AddChannelBan(1, (const char **)&ban, channel, chanserv, now, 1);
KickChannelUser(user, channel, chanserv, kick_reason);
return;
***************
*** 6073,6077 ****
create_mode_lock(correct, channel->channel_info);
! mod_chanmode(channel, correct, NULL, 0);
irc_mode(chanserv, channel, correct);
--- 6073,6077 ----
create_mode_lock(correct, channel->channel_info);
! mod_chanmode(channel, chanserv, correct, NULL, 0);
irc_mode(chanserv, channel, correct);
***************
*** 6115,6119 ****
{
char *remove = change;
! DelChannelBan(1, &remove, channel, chanserv, 1);
chanserv_notice(user, CSMSG_MASK_PROTECTED, remove);
}
--- 6115,6119 ----
{
char *remove = change;
! DelChannelBan(1, (const char **)&remove, channel, chanserv, 1);
chanserv_notice(user, CSMSG_MASK_PROTECTED, remove);
}
Index: common.h
===================================================================
RCS file: /cvsroot/srvx/services/src/common.h,v
retrieving revision 1.77
retrieving revision 1.78
diff -C2 -r1.77 -r1.78
*** common.h 5 Aug 2002 03:22:19 -0000 1.77
--- common.h 14 Aug 2002 01:36:11 -0000 1.78
***************
*** 90,94 ****
int getusermodes(char *sender);
void mod_usermode(struct userNode *user, const char *modes);
- void mod_chanmode(struct chanNode *channel, const char *mode_change, const char *key, int limit);
int verify_chanmode(const char *modes);
int split_line(unsigned char *line, int irc_colon, int argv_size, unsigned char *argv[]);
--- 90,93 ----
Index: hash.c
===================================================================
RCS file: /cvsroot/srvx/services/src/hash.c,v
retrieving revision 1.162
retrieving revision 1.163
diff -C2 -r1.162 -r1.163
*** hash.c 8 Aug 2002 02:15:57 -0000 1.162
--- hash.c 14 Aug 2002 01:36:11 -0000 1.163
***************
*** 341,345 ****
strcpy(orig_key, cNode->key);
cNode->modes = 0;
! mod_chanmode(cNode, modes, key, limit);
cNode->timestamp = time_;
rel_age = 1;
--- 341,345 ----
strcpy(orig_key, cNode->key);
cNode->modes = 0;
! mod_chanmode(cNode, NULL, modes, key, limit);
cNode->timestamp = time_;
rel_age = 1;
***************
*** 381,385 ****
}
modebuf[nn] = 0;
! mod_chanmode(cNode, modebuf, 0, 0);
irc_mode(reops.list[0], cNode, modebuf);
}
--- 381,385 ----
}
modebuf[nn] = 0;
! mod_chanmode(cNode, NULL, modebuf, 0, 0);
irc_mode(reops.list[0], cNode, modebuf);
}
***************
*** 409,413 ****
while (banlist[nn] != ' ' && banlist[nn]) nn++;
while (banlist[nn] == ' ') banlist[nn++] = 0;
! AddChannelBan(1, &ban, cNode, NULL, now, 0);
}
}
--- 409,413 ----
while (banlist[nn] != ' ' && banlist[nn]) nn++;
while (banlist[nn] == ' ') banlist[nn++] = 0;
! AddChannelBan(1, (const char **)&ban, cNode, NULL, now, 0);
}
}
***************
*** 454,458 ****
for (n=channel->banlist.used; n>0; ) {
argh = channel->banlist.list[--n]->ban;
! DelChannelBan(1, &argh, channel, NULL, 0);
}
--- 454,458 ----
for (n=channel->banlist.used; n>0; ) {
argh = channel->banlist.list[--n]->ban;
! DelChannelBan(1, (const char **)&argh, channel, NULL, 0);
}
***************
*** 609,613 ****
static void
! chan_apply_bans(struct userNode *who, struct chanNode *channel, char *what, unsigned int count, char **list)
{
char buffer[400];
--- 609,613 ----
static void
! chan_apply_bans(struct userNode *who, struct chanNode *channel, char *what, unsigned int count, const char **list)
{
char buffer[400];
***************
*** 695,699 ****
}
! int ChannelBanExists(struct chanNode *channel, char *ban)
{
unsigned int n;
--- 695,699 ----
}
! int ChannelBanExists(struct chanNode *channel, const char *ban)
{
unsigned int n;
***************
*** 710,714 ****
void
! AddChannelBan(unsigned int num, char **banset, struct chanNode* channel, struct userNode *who, time_t set, int announce)
{
unsigned int n, i;
--- 710,714 ----
void
! AddChannelBan(unsigned int num, const char **banset, struct chanNode* channel, struct userNode *who, time_t set, int announce)
{
unsigned int n, i;
***************
*** 747,751 ****
silently. */
if (remove) {
! DelChannelBan(remove->used, remove->list, channel, who, announce);
free_string_list(remove);
}
--- 747,751 ----
silently. */
if (remove) {
! DelChannelBan(remove->used, (const char **)remove->list, channel, who, announce);
free_string_list(remove);
}
***************
*** 754,758 ****
void
! DelChannelBan(unsigned int num, char **banset, struct chanNode* channel, struct userNode *who, int announce)
{
unsigned int n, m;
--- 754,758 ----
void
! DelChannelBan(unsigned int num, const char **banset, struct chanNode* channel, struct userNode *who, int announce)
{
unsigned int n, m;
Index: hash.h
===================================================================
RCS file: /cvsroot/srvx/services/src/hash.h,v
retrieving revision 1.87
retrieving revision 1.88
diff -C2 -r1.87 -r1.88
*** hash.h 13 Aug 2002 03:04:07 -0000 1.87
--- hash.h 14 Aug 2002 01:36:11 -0000 1.88
***************
*** 225,231 ****
! int ChannelBanExists(struct chanNode *channel, char *ban);
! void AddChannelBan(unsigned int num, char **banset, struct chanNode* channel, struct userNode *who, time_t set, int announce);
! void DelChannelBan(unsigned int num, char **banset, struct chanNode* channel, struct userNode *who, int announce);
void AddChannelOp(unsigned int num, struct userNode **newops, struct chanNode *channel, struct userNode *who, int announce);
--- 225,231 ----
! int ChannelBanExists(struct chanNode *channel, const char *ban);
! void AddChannelBan(unsigned int num, const char **banset, struct chanNode* channel, struct userNode *who, time_t set, int announce);
! void DelChannelBan(unsigned int num, const char **banset, struct chanNode* channel, struct userNode *who, int announce);
void AddChannelOp(unsigned int num, struct userNode **newops, struct chanNode *channel, struct userNode *who, int announce);
Index: opserv.c
===================================================================
RCS file: /cvsroot/srvx/services/src/opserv.c,v
retrieving revision 1.261
retrieving revision 1.262
diff -C2 -r1.261 -r1.262
*** opserv.c 11 Aug 2002 03:26:16 -0000 1.261
--- opserv.c 14 Aug 2002 01:36:11 -0000 1.262
***************
*** 444,448 ****
return 0;
}
! AddChannelBan(1, &mask, channel, opserv, time(0), 1);
opserv_notice(user, OSMSG_ADDED_BAN, mask, channel->name);
return 1;
--- 444,448 ----
return 0;
}
! AddChannelBan(1, (const char **)&mask, channel, opserv, time(0), 1);
opserv_notice(user, OSMSG_ADDED_BAN, mask, channel->name);
return 1;
***************
*** 573,582 ****
list[count++] = channel->banlist.list[n]->ban;
if (count == ArrayLength(list)) {
! DelChannelBan(count, list, channel, opserv, 1);
count = 0;
}
}
if (count) {
! DelChannelBan(count, list, channel, opserv, 1);
}
opserv_notice(user, OSMSG_CLEARBANS_DONE, channel->name);
--- 573,582 ----
list[count++] = channel->banlist.list[n]->ban;
if (count == ArrayLength(list)) {
! DelChannelBan(count, (const char **)list, channel, opserv, 1);
count = 0;
}
}
if (count) {
! DelChannelBan(count, (const char **)list, channel, opserv, 1);
}
opserv_notice(user, OSMSG_CLEARBANS_DONE, channel->name);
***************
*** 1074,1078 ****
}
mask = generate_hostmask(target, 0);
! AddChannelBan(1, &mask, channel, opserv, time(0), 1);
free(mask);
KickChannelUser(target, channel, opserv, reason);
--- 1074,1078 ----
}
mask = generate_hostmask(target, 0);
! AddChannelBan(1, (const char **)&mask, channel, opserv, time(0), 1);
free(mask);
KickChannelUser(target, channel, opserv, reason);
***************
*** 1097,1101 ****
if (channel->banlist.used < MAXBANS) {
char *ban = "*!*@*";
! AddChannelBan(1, &ban, channel, opserv, now, 1);
}
/* now kick them */
--- 1097,1101 ----
if (channel->banlist.used < MAXBANS) {
char *ban = "*!*@*";
! AddChannelBan(1, (const char **)&ban, channel, opserv, now, 1);
}
/* now kick them */
***************
*** 1134,1138 ****
irc_mode(opserv, channel, mc);
}
! mod_chanmode(channel, changes, NULL, 0);
irc_mode(opserv, channel, changes);
opserv_notice(user, OSMSG_MODE_SET, channel->name);
--- 1134,1138 ----
irc_mode(opserv, channel, mc);
}
! mod_chanmode(channel, opserv, changes, NULL, 0);
irc_mode(opserv, channel, changes);
opserv_notice(user, OSMSG_MODE_SET, channel->name);
***************
*** 1151,1155 ****
}
usermask = generate_hostmask(target, 0);
! AddChannelBan(1, &usermask, channel, opserv, now, 1);
opserv_notice(user, OSMSG_ADDED_BAN, usermask, channel->name);
free(usermask);
--- 1151,1155 ----
}
usermask = generate_hostmask(target, 0);
! AddChannelBan(1, (const char **)&usermask, channel, opserv, now, 1);
opserv_notice(user, OSMSG_ADDED_BAN, usermask, channel->name);
free(usermask);
***************
*** 1267,1271 ****
{
OPSERV_MIN_PARMS(2, true);
! DelChannelBan(argc-1, (char**)argv+1, channel, opserv, 1);
opserv_notice(user, OSMSG_UNBAN_DONE, channel->name);
return 1;
--- 1267,1271 ----
{
OPSERV_MIN_PARMS(2, true);
! DelChannelBan(argc-1, (const char **)argv+1, channel, opserv, 1);
opserv_notice(user, OSMSG_UNBAN_DONE, channel->name);
return 1;
***************
*** 1978,1982 ****
AddChannelUser(opserv, channel);
AddChannelOp(1, &opserv, channel, opserv, 1);
! AddChannelBan(1, &ban_all, channel, opserv, now, 0);
channel->modes |= MODE_SECRET | MODE_INVITEONLY;
irc_mode(opserv, channel, "+sib *!*@*");
--- 1978,1982 ----
AddChannelUser(opserv, channel);
AddChannelOp(1, &opserv, channel, opserv, 1);
! AddChannelBan(1, (const char **)&ban_all, channel, opserv, now, 0);
channel->modes |= MODE_SECRET | MODE_INVITEONLY;
irc_mode(opserv, channel, "+sib *!*@*");
Index: proto-bahamut.c
===================================================================
RCS file: /cvsroot/srvx/services/src/proto-bahamut.c,v
retrieving revision 1.14
retrieving revision 1.15
diff -C2 -r1.14 -r1.15
*** proto-bahamut.c 13 Aug 2002 03:04:07 -0000 1.14
--- proto-bahamut.c 14 Aug 2002 01:36:12 -0000 1.15
***************
*** 759,765 ****
struct chanNode *cn;
struct modeNode *mn;
! const char *mchange;
! chan_mode_t mode;
! int add = 1, next = 4, res = 1, bit;
if (!(cn = GetChannel(argv[1]))) {
--- 759,763 ----
struct chanNode *cn;
struct modeNode *mn;
! const char *modes;
if (!(cn = GetChannel(argv[1]))) {
***************
*** 776,848 ****
}
! for (mchange = argv[3], mode = cn->modes; *mchange; mchange++) {
! switch (*mchange) {
! case '+': add = 1; break;
! case '-': add = 0; break;
! #define CHAN_MODE(CHAR, FLAG) case CHAR: if (add) mode |= FLAG; else mode &= ~FLAG; break
! CHAN_MODE('n', MODE_NOPRIVMSGS);
! CHAN_MODE('t', MODE_TOPICLIMIT);
! CHAN_MODE('s', MODE_SECRET);
! CHAN_MODE('p', MODE_PRIVATE);
! CHAN_MODE('i', MODE_INVITEONLY);
! CHAN_MODE('m', MODE_MODERATED);
! CHAN_MODE('D', MODE_DELAYJOINS);
! #undef CHAN_MODE
! case 'l':
! if (add) {
! mode |= MODE_LIMIT;
! cn->limit = atoi(argv[next++]);
! } else {
! mode &= ~MODE_LIMIT;
! }
! break;
! case 'k':
! if (add) {
! mode |= MODE_KEY;
! safestrncpy(cn->key, argv[next++], sizeof(cn->key));
! } else {
! next++;
! mode &= ~MODE_KEY;
! }
! break;
! case 'o':
! case 'v': {
! struct userNode *vic;
! if (!(vic = GetUserH(argv[next++]))) {
! log(MAIN_LOG, LOG_ERROR, "Unable to find user %s\n", argv[next-1]);
! res = 0;
! break;
! }
! if (!(mn = GetUserMode(cn, vic))) {
! log(MAIN_LOG, LOG_ERROR, "Unable to find user %s in channel %s\n", vic->nick, cn->name);
! res = 0;
! break;
! }
! bit = (*mchange == 'o') ? MODE_CHANOP : MODE_VOICE;
! if (add) mn->modes |= bit; else mn->modes &= ~bit;
! if (un && (bit == MODE_CHANOP)) {
! call_mode_change_funcs(cn, un, (add ? MODE_CHANGE_OP : MODE_CHANGE_DEOP), vic);
! }
! break;
! }
! case 'b': {
! char *ban = argv[next++];
! if (add) {
! AddChannelBan(1, &ban, cn, un, now, 0);
! if (un) call_mode_change_funcs(cn, un, MODE_CHANGE_BAN, ban);
! } else {
! DelChannelBan(1, &ban, cn, un, 0);
! }
! break;
! }
! }
! }
! if (mode != cn->modes && un) {
! cn->modes = mode;
! call_mode_change_funcs(cn, un, MODE_CHANGE_MISC, NULL);
! } else {
! cn->modes = mode;
! }
! return res;
} else if ((un = GetUserH(argv[1]))) {
mod_usermode(un, argv[2]);
--- 774,779 ----
}
! modes = unsplit_string(argv + 3, argc - 3, NULL);
! return mod_chanmode(cn, un, modes, NULL, 0);
} else if ((un = GetUserH(argv[1]))) {
mod_usermode(un, argv[2]);
***************
*** 1055,1057 ****
--- 986,1155 ----
}
info->on_notice = handler;
+ }
+
+ int
+ mod_chanmode(struct chanNode *channel, struct userNode *who, const char *modes, const char *key, int limit)
+ {
+ const char *word = modes;
+ int add = 1;
+ chan_mode_t old;
+
+ if(!word || !*word) {
+ return 0;
+ }
+
+ #define advance_word do \
+ { \
+ while (*word != ' ' && *word) word++;\
+ while (*word == ' ') word++; \
+ } while(0)
+ advance_word;
+
+ old = channel->modes;
+
+ while (modes) {
+ switch (*modes++) {
+ case ' ':
+ case 0:
+ modes = NULL;
+ break;
+ case '+': add = 1; break;
+ case '-': add = 0; break;
+ #define do_chan_mode(FLAG) do { if (add) channel->modes |= FLAG; else channel->modes &= ~FLAG; } while(0)
+ case 'n': do_chan_mode(MODE_NOPRIVMSGS); break;
+ case 't': do_chan_mode(MODE_TOPICLIMIT); break;
+ case 's': do_chan_mode(MODE_SECRET); break;
+ case 'p': do_chan_mode(MODE_PRIVATE); break;
+ case 'i': do_chan_mode(MODE_INVITEONLY); break;
+ case 'm': do_chan_mode(MODE_MODERATED); break;
+ case 'D': do_chan_mode(MODE_DELAYJOINS); break;
+ #undef do_chan_mode
+ case 'l':
+ if (add) {
+ channel->modes |= MODE_LIMIT;
+ if(limit) {
+ channel->limit = limit;
+ } else {
+ if(!*word) {
+ return 0;
+ }
+ channel->limit = strtoul(word, NULL, 0);
+ advance_word;
+ }
+
+ if(!channel->limit) {
+ channel->modes &= ~MODE_LIMIT;
+ }
+ } else {
+ /* Old limit not given for MODE -l */
+ channel->modes &= ~MODE_LIMIT;
+ }
+ break;
+ case 'k':
+ if (add) {
+ channel->modes |= MODE_KEY;
+ if(key) {
+ safestrncpy(channel->key, key, sizeof(channel->key));
+ } else {
+ unsigned int n;
+
+ if(!*word) {
+ return 0;
+ }
+ for (n=0; (*word != ' ' && *word) && (n < sizeof(channel->key)-1); n++) {
+ channel->key[n] = *word++;
+ }
+ channel->key[n] = 0;
+ advance_word;
+ }
+ } else {
+ /* Gobble up the key to preserve the alignment between
+ letters and arguments. */
+ if(!key)
+ {
+ if(!*word) {
+ return 0;
+ }
+ advance_word;
+ }
+
+ channel->modes &= ~MODE_KEY;
+ }
+ break;
+ case 'o':
+ case 'v': {
+ char numeric[COMBO_NUMERIC_LEN + 1];
+ const char *start;
+ unsigned int length;
+ struct userNode *vic;
+ struct modeNode *mn;
+ int bit;
+
+ if(!*word) {
+ return 0;
+ }
+ for(start = word, length = 0; *word; word++, length++) {
+ if(*word == ' ' || length >= COMBO_NUMERIC_LEN) {
+ break;
+ }
+ }
+ safestrncpy(numeric, start, length + 1);
+
+ vic = GetUserH(numeric);
+ advance_word;
+ if (!vic) {
+ log(MAIN_LOG, LOG_ERROR, "Unable to find user with numeric %s\n", numeric);
+ return 0;
+ }
+ mn = GetUserMode(channel, vic);
+ if (!mn) {
+ log(MAIN_LOG, LOG_ERROR, "Unable to find user %s in channel %s\n", vic->nick, channel->name);
+ return 0;
+ }
+
+ bit = (modes[-1] == 'o') ? MODE_CHANOP : MODE_VOICE;
+ if (add) mn->modes |= bit;
+ else mn->modes &= ~bit;
+ if(bit != MODE_CHANOP) break;
+
+ if (who) {
+ call_mode_change_funcs(channel, who, add ? MODE_CHANGE_OP : MODE_CHANGE_DEOP, vic);
+ }
+ break;
+ }
+ case 'b': {
+ unsigned int length;
+ char ban[NICKLEN + USERLEN + HOSTLEN + 3];
+ const char *start, *list = (const char *)ban;
+
+ if(!*word) {
+ return 0;
+ }
+ for(start = word, length = 0; *word; word++, length++) {
+ if(*word == ' ' || length >= NICKLEN + USERLEN + HOSTLEN + 2) {
+ break;
+ }
+ }
+ safestrncpy(ban, start, length + 1);
+
+ advance_word;
+ if (add) {
+ AddChannelBan(1, &list, channel, who, now, 0);
+ if (who) {
+ call_mode_change_funcs(channel, who, MODE_CHANGE_BAN, (char *)ban);
+ }
+ } else {
+ DelChannelBan(1, &list, channel, who, 0);
+ }
+ break;
+ }
+ }
+ }
+
+ #undef advance_word
+
+ if (channel->modes != old && who) {
+ call_mode_change_funcs(channel, who, MODE_CHANGE_MISC, NULL);
+ }
+ return 1;
}
Index: proto-p10.c
===================================================================
RCS file: /cvsroot/srvx/services/src/proto-p10.c,v
retrieving revision 1.17
retrieving revision 1.18
diff -C2 -r1.17 -r1.18
*** proto-p10.c 13 Aug 2002 21:17:25 -0000 1.17
--- proto-p10.c 14 Aug 2002 01:36:12 -0000 1.18
***************
*** 1073,1079 ****
static CMD_FUNC(cmd_mode)
{
! if (argc < 3) return 0;
if (!IsChannelName(argv[1])) {
! struct userNode *un = GetUserH(argv[1]);
if (!un) {
log(MAIN_LOG, LOG_ERROR, "Unable to find user %s whose mode is changing\n", argv[1]);
--- 1073,1085 ----
static CMD_FUNC(cmd_mode)
{
! struct chanNode *cn;
! struct userNode *un;
! const char *modes;
!
! if (argc < 3) {
! return 0;
! }
if (!IsChannelName(argv[1])) {
! un = GetUserH(argv[1]);
if (!un) {
log(MAIN_LOG, LOG_ERROR, "Unable to find user %s whose mode is changing\n", argv[1]);
***************
*** 1082,1182 ****
mod_usermode(un, argv[2]);
return 1;
! } else {
! struct chanNode *cn;
! struct userNode *un;
! int next_arg=3, res=1, add=1, bit;
! const char *mchange;
! struct modeNode *mn;
! chan_mode_t mode;
! if (!(cn = GetChannel(argv[1]))) {
! log(MAIN_LOG, LOG_ERROR, "Unable to find channel %s whose mode is changing\n", argv[1]);
! return 0;
! }
! if ((un = GetUserH(origin))) {
! /* Update idle time for person setting the mode */
! if ((mn = GetUserMode(cn, un))) {
! mn->idle_since = now;
! }
! } else {
! /* If it came from a server, reset timestamp to re-sync. */
! cn->timestamp = atoi(argv[argc-1]);
! }
! mchange = argv[2];
! mode = cn->modes;
! while (*mchange) {
! switch (*mchange++) {
! case 0: break;
! case '+': add = 1; break;
! case '-': add = 0; break;
! #define do_chan_mode(FLAG) do { if (add) mode |= FLAG; else mode &= ~FLAG; } while(0)
! case 'n': do_chan_mode(MODE_NOPRIVMSGS); break;
! case 't': do_chan_mode(MODE_TOPICLIMIT); break;
! case 's': do_chan_mode(MODE_SECRET); break;
! case 'p': do_chan_mode(MODE_PRIVATE); break;
! case 'i': do_chan_mode(MODE_INVITEONLY); break;
! case 'm': do_chan_mode(MODE_MODERATED); break;
! case 'D': do_chan_mode(MODE_DELAYJOINS); break;
! #undef do_chan_mode
! case 'l':
! if (add) {
! mode |= MODE_LIMIT;
! cn->limit = atoi(argv[next_arg++]);
! } else {
! /* Old limit not given for MODE -l */
! mode &= ~MODE_LIMIT;
! }
! break;
! case 'k':
! if (add) {
! mode |= MODE_KEY;
! safestrncpy(cn->key, argv[next_arg++], sizeof(cn->key));
! } else {
! /* Gobble the key up so following arguments line up. */
! next_arg++;
! mode &= ~MODE_KEY;
! }
! break;
! case 'o':
! case 'v': {
! struct userNode *vic;
! vic = GetUserN(argv[next_arg++]);
! if (!vic) {
! log(MAIN_LOG, LOG_ERROR, "Unable to find user with numeric %s\n", argv[next_arg-1]);
! res = 0;
! break;
! }
! mn = GetUserMode(cn, vic);
! if (!mn) {
! log(MAIN_LOG, LOG_ERROR, "Unable to find user %s in channel %s\n", vic->nick, cn->name);
! res = 0;
! break;
! }
! bit = (mchange[-1] == 'o') ? MODE_CHANOP : MODE_VOICE;
! if (add) mn->modes |= bit;
! else mn->modes &= ~bit;
! if(bit != MODE_CHANOP) break;
!
! if(un) call_mode_change_funcs(cn, un, add ? MODE_CHANGE_OP : MODE_CHANGE_DEOP, vic);
! break;}
! case 'b': {
! char *ban = argv[next_arg++];
! if (add) {
! AddChannelBan(1, &ban, cn, un, now, 0);
! if (un) call_mode_change_funcs(cn, un, MODE_CHANGE_BAN, ban);
! } else DelChannelBan(1, &ban, cn, un, 0);
! break;
! }
! }
! }
! if (mode != cn->modes && un) {
! cn->modes = mode;
! call_mode_change_funcs(cn, un, MODE_CHANGE_MISC, NULL);
! } else {
! cn->modes = mode;
}
! return res;
}
}
--- 1088,1111 ----
mod_usermode(un, argv[2]);
return 1;
! }
! if (!(cn = GetChannel(argv[1]))) {
! log(MAIN_LOG, LOG_ERROR, "Unable to find channel %s whose mode is changing\n", argv[1]);
! return 0;
! }
! if ((un = GetUserH(origin))) {
! struct modeNode *mn;
! /* Update idle time for person setting the mode */
! if ((mn = GetUserMode(cn, un))) {
! mn->idle_since = now;
}
! } else {
! /* If it came from a server, reset timestamp to re-sync. */
! cn->timestamp = atoi(argv[argc-1]);
}
+
+ modes = unsplit_string(argv + 2, argc - 2, NULL);
+ return mod_chanmode(cn, un, modes, NULL, 0);
}
***************
*** 1866,1869 ****
--- 1795,1965 ----
user->dead = 1;
userList_append(&dead_users, user);
+ }
+
+ int
+ mod_chanmode(struct chanNode *channel, struct userNode *who, const char *modes, const char *key, int limit)
+ {
+ const char *word = modes;
+ int add = 1;
+ chan_mode_...
[truncated message content] |