1 diff -r e6b8fd0ebc1f include/channel.h
2 --- a/include/channel.h Tue Apr 08 16:14:01 2008 +0400
3 +++ b/include/channel.h Tue Apr 08 17:28:26 2008 +0400
5 extern void set_channel_mode(struct Client *client_p, struct Client *source_p,
6 struct Channel *chptr, struct membership *msptr, int parc, const char *parv[]);
8 -extern const struct mode_letter chmode_flags[];
9 +extern int chmode_flags[256];
11 extern struct ChannelMode chmode_table[256];
13 diff -r e6b8fd0ebc1f modules/core/m_join.c
14 --- a/modules/core/m_join.c Tue Apr 08 16:14:01 2008 +0400
15 +++ b/modules/core/m_join.c Tue Apr 08 17:28:26 2008 +0400
21 - mode.mode |= MODE_INVITEONLY;
24 - mode.mode |= MODE_NOPRIVMSGS;
27 - mode.mode |= MODE_PRIVATE;
30 - mode.mode |= MODE_SECRET;
33 - mode.mode |= MODE_MODERATED;
36 - mode.mode |= MODE_TOPICLIMIT;
39 - mode.mode |= MODE_REGONLY;
42 - mode.mode |= MODE_EXLIMIT;
45 - mode.mode |= MODE_PERMANENT;
48 - mode.mode |= MODE_NOCOLOR;
51 - mode.mode |= MODE_FREEINVITE;
54 - mode.mode |= MODE_OPMODERATE;
57 - mode.mode |= MODE_FREETARGET;
60 - mode.mode |= MODE_DISFORWARD;
63 strlcpy(mode.forward, parv[4 + args], sizeof(mode.forward));
70 + if(chmode_flags[(int) *s] != 0)
72 + mode.mode |= chmode_flags[(int) *s];
77 @@ -1124,30 +1087,30 @@
80 /* ok, first get a list of modes we need to add */
81 - for (i = 0; chmode_flags[i].letter; i++)
82 + for (i = 0; i < 256; i++)
84 - if((mode->mode & chmode_flags[i].mode) && !(oldmode->mode & chmode_flags[i].mode))
85 + if((mode->mode & chmode_flags[i]) && !(oldmode->mode & chmode_flags[i]))
92 - *mbuf++ = chmode_flags[i].letter;
97 /* now the ones we need to remove. */
98 - for (i = 0; chmode_flags[i].letter; i++)
99 + for (i = 0; i < 256; i++)
101 - if((oldmode->mode & chmode_flags[i].mode) && !(mode->mode & chmode_flags[i].mode))
102 + if((oldmode->mode & chmode_flags[i]) && !(mode->mode & chmode_flags[i]))
109 - *mbuf++ = chmode_flags[i].letter;
114 diff -r e6b8fd0ebc1f src/channel.c
115 --- a/src/channel.c Tue Apr 08 16:14:01 2008 +0400
116 +++ b/src/channel.c Tue Apr 08 17:28:26 2008 +0400
117 @@ -1080,25 +1080,6 @@
121 -const struct mode_letter chmode_flags[] =
123 - {MODE_INVITEONLY, 'i'},
124 - {MODE_MODERATED, 'm'},
125 - {MODE_NOPRIVMSGS, 'n'},
126 - {MODE_PRIVATE, 'p'},
127 - {MODE_SECRET, 's'},
128 - {MODE_TOPICLIMIT, 't'},
129 - {MODE_NOCOLOR, 'c'},
130 - {MODE_FREEINVITE, 'g'},
131 - {MODE_OPMODERATE, 'z'},
132 - {MODE_EXLIMIT, 'L'},
133 - {MODE_PERMANENT, 'P'},
134 - {MODE_FREETARGET, 'F'},
135 - {MODE_DISFORWARD, 'Q'},
136 - {MODE_REGONLY, 'r'},
142 * inputs - pointer to channel
143 @@ -1121,9 +1102,9 @@
147 - for (i = 0; chmode_flags[i].mode; ++i)
148 - if(chptr->mode.mode & chmode_flags[i].mode)
149 - *mbuf++ = chmode_flags[i].letter;
150 + for (i = 0; i < 256; i++)
151 + if(chptr->mode.mode & chmode_flags[i])
154 if(chptr->mode.limit)
156 diff -r e6b8fd0ebc1f src/chmode.c
157 --- a/src/chmode.c Tue Apr 08 16:14:01 2008 +0400
158 +++ b/src/chmode.c Tue Apr 08 17:28:26 2008 +0400
160 #include "s_conf.h" /* ConfigFileEntry, ConfigChannel */
161 #include "s_newconf.h"
165 /* bitmasks for error returns, so we send once per call */
166 #define SM_ERR_NOTS 0x00000001 /* No TS on channel */
168 static int mode_count;
169 static int mode_limit;
172 +int chmode_flags[256];
174 +construct_noparam_modes(void)
178 + for(i = 0; i < 256; i++)
180 + if( (chmode_table[i].set_func == chm_simple) ||
181 + (chmode_table[i].set_func == chm_staff) ||
182 + (chmode_table[i].set_func == chm_regonly))
184 + chmode_flags[i] = chmode_table[i].mode_type;
188 + chmode_flags[i] = 0;
194 get_channel_access(struct Client *source_p, struct membership *msptr)
195 diff -r e6b8fd0ebc1f src/ircd.c
196 --- a/src/ircd.c Tue Apr 08 16:14:01 2008 +0400
197 +++ b/src/ircd.c Tue Apr 08 17:28:26 2008 +0400
199 #include "patchlevel.h"
204 /* /quote set variables */
205 struct SetOptions GlobalSetOptions;
210 + construct_noparam_modes();