ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/trunk/modules/m_set.c
Revision: 1243
Committed: Fri Sep 30 10:47:53 2011 UTC (15 years ago) by michael
Content type: text/x-csrc
Original Path: ircd-hybrid-8/modules/m_set.c
File size: 17820 byte(s)
Log Message:
- move content of msg.h, ircd_handler.h and handlers.h into parse.h and
  remove headers accordingly
- killed common.h
- remove m_killhost.c and m_flags.c from contrib/
- sort out unused header includes here and there

File Contents

# User Rev Content
1 adx 30 /*
2     * ircd-hybrid: an advanced Internet Relay Chat Daemon(ircd).
3     * m_set.c: Sets a server parameter.
4     *
5     * Copyright (C) 2002 by the past and present ircd coders, and others.
6     *
7     * This program is free software; you can redistribute it and/or modify
8     * it under the terms of the GNU General Public License as published by
9     * the Free Software Foundation; either version 2 of the License, or
10     * (at your option) any later version.
11     *
12     * This program is distributed in the hope that it will be useful,
13     * but WITHOUT ANY WARRANTY; without even the implied warranty of
14     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15     * GNU General Public License for more details.
16     *
17     * You should have received a copy of the GNU General Public License
18     * along with this program; if not, write to the Free Software
19     * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
20     * USA
21     *
22 knight 31 * $Id$
23 adx 30 */
24    
25     /* rewritten by jdc */
26    
27     #include "stdinc.h"
28     #include "client.h"
29     #include "event.h"
30     #include "irc_string.h"
31     #include "ircd.h"
32     #include "numeric.h"
33     #include "fdlist.h"
34     #include "s_bsd.h"
35     #include "s_serv.h"
36     #include "send.h"
37     #include "channel.h"
38     #include "s_log.h"
39     #include "s_conf.h"
40     #include "parse.h"
41     #include "modules.h"
42     #include "s_user.h"
43 michael 1243 #include "s_misc.h"
44 adx 30
45    
46     /* Structure used for the SET table itself */
47     struct SetStruct
48     {
49     const char *name;
50     void (*handler)();
51 michael 1013 const int wants_char; /* 1 if it expects (char *, [int]) */
52     const int wants_int; /* 1 if it expects ([char *], int) */
53 adx 30 /* eg: 0, 1 == only an int arg
54     * eg: 1, 1 == char and int args */
55     };
56    
57     static void quote_autoconn(struct Client *, const char *, int);
58     static void quote_autoconnall(struct Client *, int);
59     static void quote_floodcount(struct Client *, int);
60     static void quote_identtimeout(struct Client *, int);
61     static void quote_log(struct Client *, int);
62     static void quote_max(struct Client *, int);
63     static void quote_msglocale(struct Client *, char *);
64     static void quote_spamnum(struct Client *, int);
65     static void quote_spamtime(struct Client *, int);
66     static void quote_splitmode(struct Client *, char *);
67     static void quote_splitnum(struct Client *, int);
68     static void quote_splitusers(struct Client *, int);
69     static void list_quote_commands(struct Client *);
70     static void quote_jfloodtime(struct Client *, int);
71     static void quote_jfloodcount(struct Client *, int);
72     static void quote_rejecttime(struct Client *, int);
73    
74     /*
75     * If this ever needs to be expanded to more than one arg of each
76     * type, want_char/want_int could be the count of the arguments,
77     * instead of just a boolean flag...
78     *
79     * -davidt
80     */
81    
82 michael 1013 static const struct SetStruct set_cmd_table[] =
83 adx 30 {
84     /* name function string arg int arg */
85     /* -------------------------------------------------------- */
86     { "AUTOCONN", quote_autoconn, 1, 1 },
87     { "AUTOCONNALL", quote_autoconnall, 0, 1 },
88     { "FLOODCOUNT", quote_floodcount, 0, 1 },
89     { "IDENTTIMEOUT", quote_identtimeout, 0, 1 },
90     { "LOG", quote_log, 0, 1 },
91     { "MAX", quote_max, 0, 1 },
92     { "MSGLOCALE", quote_msglocale, 1, 0 },
93     { "SPAMNUM", quote_spamnum, 0, 1 },
94     { "SPAMTIME", quote_spamtime, 0, 1 },
95     { "SPLITMODE", quote_splitmode, 1, 0 },
96     { "SPLITNUM", quote_splitnum, 0, 1 },
97     { "SPLITUSERS", quote_splitusers, 0, 1 },
98     { "JFLOODTIME", quote_jfloodtime, 0, 1 },
99     { "JFLOODCOUNT", quote_jfloodcount, 0, 1 },
100     { "REJECTTIME", quote_rejecttime, 0, 1 },
101     /* -------------------------------------------------------- */
102 michael 946 { NULL, NULL, 0, 0 }
103 adx 30 };
104    
105     /*
106     * list_quote_commands() sends the client all the available commands.
107     * Four to a line for now.
108     */
109     static void
110     list_quote_commands(struct Client *source_p)
111     {
112     int j = 0;
113 michael 1013 const struct SetStruct *tab = set_cmd_table;
114 michael 896 const char *names[4] = { "", "", "", "" };
115 adx 30
116     sendto_one(source_p, ":%s NOTICE %s :Available QUOTE SET commands:",
117     me.name, source_p->name);
118    
119 michael 1013 for (; tab->handler; ++tab)
120 adx 30 {
121 michael 1013 names[j++] = tab->name;
122 adx 30
123     if (j > 3)
124     {
125     sendto_one(source_p, ":%s NOTICE %s :%s %s %s %s",
126     me.name, source_p->name,
127     names[0], names[1],
128     names[2], names[3]);
129     j = 0;
130     names[0] = names[1] = names[2] = names[3] = "";
131     }
132    
133     }
134 michael 896
135 adx 30 if (j)
136     sendto_one(source_p, ":%s NOTICE %s :%s %s %s %s",
137     me.name, source_p->name,
138     names[0], names[1],
139     names[2], names[3]);
140     }
141    
142     /* SET AUTOCONN */
143     static void
144     quote_autoconn(struct Client *source_p, const char *arg, int newval)
145     {
146 michael 896 struct AccessItem *aconf;
147    
148     if (arg != NULL)
149     {
150     struct ConfItem *conf = find_exact_name_conf(SERVER_TYPE, arg, NULL, NULL);
151    
152     if (conf != NULL)
153     {
154     aconf = map_to_conf(conf);
155     if (newval)
156     SetConfAllowAutoConn(aconf);
157     else
158     ClearConfAllowAutoConn(aconf);
159    
160     sendto_realops_flags(UMODE_ALL, L_ALL,
161     "%s has changed AUTOCONN for %s to %i",
162 michael 1141 get_oper_name(source_p), arg, newval);
163 michael 896 sendto_one(source_p,
164     ":%s NOTICE %s :AUTOCONN for %s is now set to %i",
165     me.name, source_p->name, arg, newval);
166     }
167     else
168     {
169     sendto_one(source_p, ":%s NOTICE %s :Can't find %s",
170     me.name, source_p->name, arg);
171     }
172     }
173     else
174     {
175     sendto_one(source_p, ":%s NOTICE %s :Please specify a server name!",
176     me.name, source_p->name);
177     }
178 adx 30 }
179    
180     /* SET AUTOCONNALL */
181     static void
182     quote_autoconnall(struct Client *source_p, int newval)
183     {
184     if (newval >= 0)
185     {
186     sendto_realops_flags(UMODE_ALL, L_ALL, "%s has changed AUTOCONNALL to %i",
187 michael 1141 get_oper_name(source_p), newval);
188 adx 30
189     GlobalSetOptions.autoconn = newval;
190     }
191     else
192     sendto_one(source_p, ":%s NOTICE %s :AUTOCONNALL is currently %i",
193     me.name, source_p->name, GlobalSetOptions.autoconn);
194     }
195    
196     /* SET FLOODCOUNT */
197     static void
198     quote_floodcount(struct Client *source_p, int newval)
199     {
200     if (newval >= 0)
201     {
202     GlobalSetOptions.floodcount = newval;
203     sendto_realops_flags(UMODE_ALL, L_ALL,
204 michael 1141 "%s has changed FLOODCOUNT to %i",
205     get_oper_name(source_p), GlobalSetOptions.floodcount);
206 adx 30 }
207     else
208     sendto_one(source_p, ":%s NOTICE %s :FLOODCOUNT is currently %i",
209     me.name, source_p->name, GlobalSetOptions.floodcount);
210     }
211    
212     /* SET IDENTTIMEOUT */
213     static void
214     quote_identtimeout(struct Client *source_p, int newval)
215     {
216 michael 1219 if (!HasUMode(source_p, UMODE_ADMIN))
217 adx 30 {
218     sendto_one(source_p, form_str(ERR_NOPRIVS),
219     me.name, source_p->name, "set");
220     return;
221     }
222    
223     if (newval > 0)
224     {
225     sendto_realops_flags(UMODE_ALL, L_ALL,
226     "%s has changed IDENTTIMEOUT to %d",
227     get_oper_name(source_p), newval);
228     GlobalSetOptions.ident_timeout = newval;
229     }
230     else
231     sendto_one(source_p, ":%s NOTICE %s :IDENTTIMEOUT is currently %d",
232     me.name, source_p->name, GlobalSetOptions.ident_timeout);
233     }
234    
235     /* SET LOG */
236     static void
237 michael 896 quote_log(struct Client *source_p, int newval)
238 adx 30 {
239     if (newval >= 0)
240     {
241     if (newval < L_WARN)
242     {
243     sendto_one(source_p, ":%s NOTICE %s :LOG must be > %d (L_WARN)",
244     me.name, source_p->name, L_WARN);
245     return;
246     }
247    
248     if (newval > L_DEBUG)
249     newval = L_DEBUG;
250    
251     set_log_level(newval);
252 michael 1141 sendto_realops_flags(UMODE_ALL, L_ALL, "%s has changed LOG level to %i (%s)",
253     get_oper_name(source_p), get_log_level(),
254 michael 1013 get_log_level_as_string(get_log_level()));
255 adx 30 }
256     else
257     sendto_one(source_p, ":%s NOTICE %s :LOG level is currently %i (%s)",
258     me.name, source_p->name, get_log_level(),
259     get_log_level_as_string(get_log_level()));
260     }
261    
262     /* SET MAX */
263     static void
264 michael 896 quote_max(struct Client *source_p, int newval)
265 adx 30 {
266     if (newval > 0)
267     {
268     recalc_fdlimit(NULL);
269    
270     if (newval > MAXCLIENTS_MAX)
271     {
272     sendto_one(source_p,
273     ":%s NOTICE %s :You cannot set MAXCLIENTS to > %d, restoring to %d",
274 michael 1140 me.name, source_p->name, MAXCLIENTS_MAX, ServerInfo.max_clients);
275 adx 30 return;
276     }
277    
278     if (newval < MAXCLIENTS_MIN)
279     {
280     sendto_one(source_p,
281     ":%s NOTICE %s :You cannot set MAXCLIENTS to < %d, restoring to %d",
282     me.name, source_p->name, MAXCLIENTS_MIN, ServerInfo.max_clients);
283     return;
284     }
285    
286     ServerInfo.max_clients = newval;
287    
288     sendto_realops_flags(UMODE_ALL, L_ALL,
289 michael 1141 "%s set new MAXCLIENTS to %d (%d current)",
290 michael 1142 get_oper_name(source_p), ServerInfo.max_clients, Count.local);
291 adx 30 }
292     else
293     sendto_one(source_p, ":%s NOTICE %s :Current MAXCLIENTS = %d (%d)",
294     me.name, source_p->name, ServerInfo.max_clients, Count.local);
295     }
296    
297     /* SET MSGLOCALE */
298     static void
299 michael 896 quote_msglocale(struct Client *source_p, char *locale)
300 adx 30 {
301     if (locale != NULL)
302     {
303     set_locale(locale);
304     rebuild_isupport_message_line();
305     sendto_one(source_p, ":%s NOTICE %s :Set MSGLOCALE to '%s'",
306     me.name, source_p->name, get_locale());
307     }
308     else
309     sendto_one(source_p, ":%s NOTICE %s :MSGLOCALE is currently '%s'",
310     me.name, source_p->name, get_locale());
311     }
312    
313     /* SET SPAMNUM */
314     static void
315 michael 896 quote_spamnum(struct Client *source_p, int newval)
316 adx 30 {
317 michael 646 if (newval >= 0)
318 adx 30 {
319     if (newval == 0)
320     {
321     sendto_realops_flags(UMODE_ALL, L_ALL,
322     "%s has disabled ANTI_SPAMBOT", source_p->name);
323     GlobalSetOptions.spam_num = newval;
324     return;
325     }
326    
327     GlobalSetOptions.spam_num = IRCD_MAX(newval, MIN_SPAM_NUM);
328 michael 1141 sendto_realops_flags(UMODE_ALL, L_ALL, "%s has changed SPAMNUM to %i",
329     get_oper_name(source_p), GlobalSetOptions.spam_num);
330 adx 30 }
331     else
332     sendto_one(source_p, ":%s NOTICE %s :SPAMNUM is currently %i",
333 michael 1013 me.name, source_p->name, GlobalSetOptions.spam_num);
334 adx 30 }
335    
336     /* SET SPAMTIME */
337     static void
338 michael 896 quote_spamtime(struct Client *source_p, int newval)
339 adx 30 {
340     if (newval > 0)
341     {
342     GlobalSetOptions.spam_time = IRCD_MAX(newval, MIN_SPAM_TIME);
343     sendto_realops_flags(UMODE_ALL, L_ALL, "%s has changed SPAMTIME to %i",
344 michael 1141 get_oper_name(source_p), GlobalSetOptions.spam_time);
345 adx 30 }
346     else
347     sendto_one(source_p, ":%s NOTICE %s :SPAMTIME is currently %i",
348 michael 1013 me.name, source_p->name, GlobalSetOptions.spam_time);
349 adx 30 }
350    
351     /* this table is what splitmode may be set to */
352     static const char *splitmode_values[] =
353     {
354     "OFF",
355     "ON",
356     "AUTO",
357     NULL
358     };
359    
360     /* this table is what splitmode may be */
361     static const char *splitmode_status[] =
362     {
363     "OFF",
364     "AUTO (OFF)",
365     "ON",
366     "AUTO (ON)",
367     NULL
368     };
369    
370     /* SET SPLITMODE */
371     static void
372     quote_splitmode(struct Client *source_p, char *charval)
373     {
374     if (charval)
375     {
376     int newval;
377    
378 michael 896 for (newval = 0; splitmode_values[newval]; ++newval)
379 adx 30 if (irccmp(splitmode_values[newval], charval) == 0)
380     break;
381    
382     /* OFF */
383     if (newval == 0)
384     {
385     sendto_realops_flags(UMODE_ALL, L_ALL,
386     "%s is disabling splitmode",
387     get_oper_name(source_p));
388    
389     splitmode = 0;
390     splitchecking = 0;
391    
392     eventDelete(check_splitmode, NULL);
393     }
394     /* ON */
395     else if (newval == 1)
396     {
397     sendto_realops_flags(UMODE_ALL, L_ALL,
398     "%s is enabling and activating splitmode",
399     get_oper_name(source_p));
400    
401     splitmode = 1;
402     splitchecking = 0;
403    
404     /* we might be deactivating an automatic splitmode, so pull the event */
405     eventDelete(check_splitmode, NULL);
406     }
407     /* AUTO */
408     else if (newval == 2)
409     {
410     sendto_realops_flags(UMODE_ALL, L_ALL,
411     "%s is enabling automatic splitmode",
412     get_oper_name(source_p));
413    
414     splitchecking = 1;
415     check_splitmode(NULL);
416     }
417     }
418     else
419     /* if we add splitchecking to splitmode*2 we get a unique table to
420     * pull values back out of, splitmode can be four states - but you can
421     * only set to three, which means we cant use the same table --fl_
422     */
423     sendto_one(source_p, ":%s NOTICE %s :SPLITMODE is currently %s",
424     me.name, source_p->name,
425 michael 1141 splitmode_status[(splitchecking + (splitmode * 2))]);
426 adx 30 }
427    
428     /* SET SPLITNUM */
429     static void
430     quote_splitnum(struct Client *source_p, int newval)
431     {
432     if (newval >= 0)
433     {
434     sendto_realops_flags(UMODE_ALL, L_ALL,
435     "%s has changed SPLITNUM to %i",
436 michael 1141 get_oper_name(source_p), newval);
437 adx 30 split_servers = newval;
438    
439     if (splitchecking)
440     check_splitmode(NULL);
441     }
442     else
443     sendto_one(source_p, ":%s NOTICE %s :SPLITNUM is currently %i",
444     me.name, source_p->name, split_servers);
445     }
446    
447     /* SET SPLITUSERS */
448     static void
449     quote_splitusers(struct Client *source_p, int newval)
450     {
451     if (newval >= 0)
452     {
453     sendto_realops_flags(UMODE_ALL, L_ALL,
454     "%s has changed SPLITUSERS to %i",
455 michael 1141 get_oper_name(source_p), newval);
456 adx 30 split_users = newval;
457    
458     if (splitchecking)
459     check_splitmode(NULL);
460     }
461     else
462     sendto_one(source_p, ":%s NOTICE %s :SPLITUSERS is currently %i",
463     me.name, source_p->name, split_users);
464     }
465    
466     /* SET JFLOODTIME */
467     static void
468     quote_jfloodtime(struct Client *source_p, int newval)
469     {
470     if (newval >= 0)
471     {
472     sendto_realops_flags(UMODE_ALL, L_ALL,
473     "%s has changed JFLOODTIME to %i",
474 michael 1141 get_oper_name(source_p), newval);
475 adx 30 GlobalSetOptions.joinfloodtime = newval;
476     }
477     else
478     sendto_one(source_p, ":%s NOTICE %s :JFLOODTIME is currently %i",
479     me.name, source_p->name, GlobalSetOptions.joinfloodtime);
480     }
481    
482     /* SET JFLOODCOUNT */
483     static void
484     quote_jfloodcount(struct Client *source_p, int newval)
485     {
486     if (newval >= 0)
487     {
488     sendto_realops_flags(UMODE_ALL, L_ALL,
489     "%s has changed JFLOODCOUNT to %i",
490 michael 1141 get_oper_name(source_p), newval);
491 adx 30 GlobalSetOptions.joinfloodcount = newval;
492     }
493     else
494     sendto_one(source_p, ":%s NOTICE %s :JFLOODCOUNT is currently %i",
495     me.name, source_p->name, GlobalSetOptions.joinfloodcount);
496     }
497    
498     /* SET REJECTTIME */
499     static void
500     quote_rejecttime(struct Client *source_p, int newval)
501     {
502     if (newval >= 0)
503     {
504     sendto_realops_flags(UMODE_ALL, L_ALL,
505     "%s has changed REJECTTIME to %i seconds",
506 michael 1141 get_oper_name(source_p), newval);
507 adx 30 GlobalSetOptions.rejecttime = newval;
508     }
509     else
510     sendto_one(source_p, ":%s NOTICE %s :REJECTTIME is currently %i seconds",
511     me.name, source_p->name, GlobalSetOptions.rejecttime);
512     }
513    
514     /*
515     * mo_set - SET command handler
516     * set options while running
517     */
518     static void
519     mo_set(struct Client *client_p, struct Client *source_p,
520     int parc, char *parv[])
521     {
522     int n;
523     int newval;
524     const char *arg = NULL;
525     const char *intarg = NULL;
526 michael 1013 const struct SetStruct *tab = set_cmd_table;
527 adx 30
528     if (parc > 1)
529     {
530 michael 1013 /*
531     * Go through all the commands in set_cmd_table, until one is
532     * matched.
533 adx 30 */
534 michael 1013 for (; tab->handler; ++tab)
535 adx 30 {
536 michael 1013 if (!irccmp(tab->name, parv[1]))
537 adx 30 {
538     /*
539     * Command found; now execute the code
540     */
541     n = 2;
542    
543 michael 1013 if (tab->wants_char)
544 adx 30 arg = parv[n++];
545    
546 michael 1013 if (tab->wants_int)
547 adx 30 intarg = parv[n++];
548    
549     if ((n - 1) > parc)
550     {
551     if (parc > 2)
552     sendto_one(source_p,
553     ":%s NOTICE %s :SET %s expects (\"%s%s\") args",
554 michael 1013 me.name, source_p->name, tab->name,
555     (tab->wants_char ? "string, " : ""),
556     (tab->wants_char ? "int" : ""));
557 adx 30 }
558    
559     if (parc <= 2)
560     {
561     arg = NULL;
562     intarg = NULL;
563     }
564    
565 michael 1013 if (!strcmp(tab->name, "AUTOCONN") && (parc < 4))
566 adx 30 {
567     sendto_one(source_p, form_str(ERR_NEEDMOREPARAMS),
568     me.name, source_p->name, "SET");
569     return;
570     }
571    
572 michael 1013 if (tab->wants_int && (parc > 2))
573 adx 30 {
574     if (intarg)
575     {
576     if (irccmp(intarg, "yes") == 0 || irccmp(intarg, "on") == 0)
577     newval = 1;
578     else if (irccmp(intarg, "no") == 0|| irccmp(intarg, "off") == 0)
579     newval = 0;
580     else
581     newval = atoi(intarg);
582     }
583     else
584     {
585     newval = -1;
586     }
587    
588     if (newval < 0)
589     {
590     sendto_one(source_p,
591     ":%s NOTICE %s :Value less than 0 illegal for %s",
592     me.name, source_p->name,
593 michael 1013 tab->name);
594 adx 30
595     return;
596     }
597     }
598     else
599     newval = -1;
600    
601 michael 1013 if (tab->wants_char)
602 adx 30 {
603 michael 1013 if (tab->wants_int)
604     tab->handler(source_p, arg, newval);
605 adx 30 else
606 michael 1013 tab->handler(source_p, arg);
607 adx 30 return;
608     }
609     else
610     {
611 michael 1013 if (tab->wants_int)
612     tab->handler(source_p, newval);
613 adx 30 else
614     /* Just in case someone actually wants a
615     * set function that takes no args.. *shrug* */
616 michael 1013 tab->handler(source_p);
617 adx 30 return;
618     }
619     }
620     }
621    
622     /*
623     * Code here will be executed when a /QUOTE SET command is not
624     * found within set_cmd_table.
625     */
626     sendto_one(source_p, ":%s NOTICE %s :Variable not found.",
627     me.name, source_p->name);
628     return;
629     }
630    
631     list_quote_commands(source_p);
632     }
633 michael 1230
634     static struct Message set_msgtab = {
635     "SET", 0, 0, 0, MAXPARA, MFLG_SLOW, 0,
636     {m_unregistered, m_not_oper, rfc1459_command_send_error, m_ignore, mo_set, m_ignore}
637     };
638    
639     static void
640     module_init(void)
641     {
642     mod_add_cmd(&set_msgtab);
643     }
644    
645     static void
646     module_exit(void)
647     {
648     mod_del_cmd(&set_msgtab);
649     }
650    
651     struct module module_entry = {
652     .node = { NULL, NULL, NULL },
653     .name = NULL,
654     .version = "$Revision$",
655     .handle = NULL,
656     .modinit = module_init,
657     .modexit = module_exit,
658     .flags = 0
659     };

Properties

Name Value
svn:eol-style native
svn:keywords Id Revision