]> jfr.im git - solanum.git/blame - patches/dyn-cmodes.diff
strlcpy -> rb_strlcpy
[solanum.git] / patches / dyn-cmodes.diff
CommitLineData
ee9335d1
VY
1diff -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
4@@ -258,7 +258,7 @@
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[]);
7
8-extern const struct mode_letter chmode_flags[];
9+extern int chmode_flags[256];
10
11 extern struct ChannelMode chmode_table[256];
12
ee9335d1
VY
13diff -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
16@@ -581,48 +581,6 @@
17 {
18 switch (*(s++))
19 {
20- case 'i':
21- mode.mode |= MODE_INVITEONLY;
22- break;
23- case 'n':
24- mode.mode |= MODE_NOPRIVMSGS;
25- break;
26- case 'p':
27- mode.mode |= MODE_PRIVATE;
28- break;
29- case 's':
30- mode.mode |= MODE_SECRET;
31- break;
32- case 'm':
33- mode.mode |= MODE_MODERATED;
34- break;
35- case 't':
36- mode.mode |= MODE_TOPICLIMIT;
37- break;
38- case 'r':
39- mode.mode |= MODE_REGONLY;
40- break;
41- case 'L':
42- mode.mode |= MODE_EXLIMIT;
43- break;
44- case 'P':
45- mode.mode |= MODE_PERMANENT;
46- break;
47- case 'c':
48- mode.mode |= MODE_NOCOLOR;
49- break;
50- case 'g':
51- mode.mode |= MODE_FREEINVITE;
52- break;
53- case 'z':
54- mode.mode |= MODE_OPMODERATE;
55- break;
56- case 'F':
57- mode.mode |= MODE_FREETARGET;
58- break;
59- case 'Q':
60- mode.mode |= MODE_DISFORWARD;
61- break;
62 case 'f':
63 strlcpy(mode.forward, parv[4 + args], sizeof(mode.forward));
64 args++;
65@@ -649,6 +607,11 @@
66 if(parc < 5 + args)
67 return 0;
68 break;
69+ default:
70+ if(chmode_flags[(int) *s] != 0)
71+ {
72+ mode.mode |= chmode_flags[(int) *s];
73+ }
74 }
75 }
76
77@@ -1124,30 +1087,30 @@
78 int i;
79
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++)
83 {
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]))
86 {
87 if(dir != MODE_ADD)
88 {
89 *mbuf++ = '+';
90 dir = MODE_ADD;
91 }
92- *mbuf++ = chmode_flags[i].letter;
93+ *mbuf++ = i;
94 }
95 }
96
97 /* now the ones we need to remove. */
98- for (i = 0; chmode_flags[i].letter; i++)
99+ for (i = 0; i < 256; i++)
100 {
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]))
103 {
104 if(dir != MODE_DEL)
105 {
106 *mbuf++ = '-';
107 dir = MODE_DEL;
108 }
109- *mbuf++ = chmode_flags[i].letter;
110+ *mbuf++ = i;
111 }
112 }
113
114diff -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 @@
118 }
119 }
120
121-const struct mode_letter chmode_flags[] =
122-{
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'},
137- {0, '\0'}
138-};
139-
140 /* channel_modes()
141 *
142 * inputs - pointer to channel
143@@ -1121,9 +1102,9 @@
144 *mbuf++ = '+';
145 *pbuf = '\0';
146
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])
152+ *mbuf++ = i;
153
154 if(chptr->mode.limit)
155 {
156diff -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
159@@ -42,6 +42,7 @@
160 #include "s_conf.h" /* ConfigFileEntry, ConfigChannel */
161 #include "s_newconf.h"
162 #include "logger.h"
163+#include "chmode.h"
164
165 /* bitmasks for error returns, so we send once per call */
166 #define SM_ERR_NOTS 0x00000001 /* No TS on channel */
167@@ -67,6 +68,27 @@
168 static int mode_count;
169 static int mode_limit;
170 static int mask_pos;
171+
172+int chmode_flags[256];
173+void
174+construct_noparam_modes(void)
175+{
176+ int i;
177+
178+ for(i = 0; i < 256; i++)
179+ {
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))
183+ {
184+ chmode_flags[i] = chmode_table[i].mode_type;
185+ }
186+ else
187+ {
188+ chmode_flags[i] = 0;
189+ }
190+ }
191+}
192
193 int
194 get_channel_access(struct Client *source_p, struct membership *msptr)
195diff -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
198@@ -66,6 +66,7 @@
199 #include "patchlevel.h"
200 #include "serno.h"
201 #include "sslproc.h"
202+#include "chmode.h"
203
204 /* /quote set variables */\r
205 struct SetOptions GlobalSetOptions;
206@@ -594,6 +595,7 @@
207 init_client();
208 initUser();
209 init_hook();
210+ construct_noparam_modes();
211 init_channels();
212 initclass();
213 initwhowas();