ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/trunk/modules/m_info.c
Revision: 1243
Committed: Fri Sep 30 10:47:53 2011 UTC (13 years, 10 months ago) by michael
Content type: text/x-csrc
Original Path: ircd-hybrid-8/modules/m_info.c
File size: 19771 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

# Content
1 /*
2 * ircd-hybrid: an advanced Internet Relay Chat Daemon(ircd).
3 * m_info.c: Sends information about the server.
4 *
5 * Copyright (C) 2005 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 * $Id$
23 */
24
25 #include "stdinc.h"
26 #include "list.h"
27 #include "m_info.h"
28 #include "channel.h"
29 #include "client.h"
30 #include "irc_string.h"
31 #include "ircd.h"
32 #include "numeric.h"
33 #include "s_log.h"
34 #include "s_serv.h"
35 #include "s_user.h"
36 #include "send.h"
37 #include "s_conf.h"
38 #include "parse.h"
39 #include "modules.h"
40
41
42 static void send_conf_options(struct Client *);
43 static void send_birthdate_online_time(struct Client *);
44 static void send_info_text(struct Client *);
45
46 /*
47 * jdc -- Structure for our configuration value table
48 */
49 struct InfoStruct
50 {
51 const char *name; /* Displayed variable name */
52 unsigned int output_type; /* See below #defines */
53 void *option; /* Pointer reference to the value */
54 const char *desc; /* ASCII description of the variable */
55 };
56
57 /* Types for output_type in InfoStruct */
58 #define OUTPUT_STRING 0x0001 /* Output option as %s w/ dereference */
59 #define OUTPUT_STRING_PTR 0x0002 /* Output option as %s w/out deference */
60 #define OUTPUT_DECIMAL 0x0004 /* Output option as decimal (%d) */
61 #define OUTPUT_BOOLEAN 0x0008 /* Output option as "ON" or "OFF" */
62 #define OUTPUT_BOOLEAN_YN 0x0010 /* Output option as "YES" or "NO" */
63 #define OUTPUT_BOOLEAN2 0x0020 /* Output option as "YES/NO/MASKED" */
64
65 static const struct InfoStruct info_table[] =
66 {
67 /* --[ START OF TABLE ]-------------------------------------------- */
68 {
69 "network_name",
70 OUTPUT_STRING,
71 &ServerInfo.network_name,
72 "Network name"
73 },
74 {
75 "network_desc",
76 OUTPUT_STRING,
77 &ServerInfo.network_desc,
78 "Network description"
79 },
80 {
81 "hub",
82 OUTPUT_BOOLEAN_YN,
83 &ServerInfo.hub,
84 "Server is a hub"
85 },
86 {
87 "use_logging",
88 OUTPUT_BOOLEAN_YN,
89 &ConfigLoggingEntry.use_logging,
90 "Enable logging"
91 },
92 {
93 "fuserlog",
94 OUTPUT_STRING_PTR,
95 &ConfigLoggingEntry.userlog,
96 "User log file"
97 },
98 {
99 "foperlog",
100 OUTPUT_STRING_PTR,
101 &ConfigLoggingEntry.operlog,
102 "Operator log file"
103 },
104 {
105 "fkilllog",
106 OUTPUT_STRING_PTR,
107 &ConfigLoggingEntry.killlog,
108 "Kill log file"
109 },
110 {
111 "fklinelog",
112 OUTPUT_STRING_PTR,
113 &ConfigLoggingEntry.klinelog,
114 "K-Line log file"
115 },
116 {
117 "fglinelog",
118 OUTPUT_STRING_PTR,
119 &ConfigLoggingEntry.glinelog,
120 "G-Line log file"
121 },
122 {
123 "restrict_channels",
124 OUTPUT_BOOLEAN_YN,
125 &ConfigChannel.restrict_channels,
126 "Only reserved channels are allowed"
127 },
128 {
129 "disable_local_channels",
130 OUTPUT_BOOLEAN_YN,
131 &ConfigChannel.disable_local_channels,
132 "Prevent users from joining &channels"
133 },
134 {
135 "use_invex",
136 OUTPUT_BOOLEAN_YN,
137 &ConfigChannel.use_invex,
138 "Enable chanmode +I (invite exceptions)"
139 },
140 {
141 "use_except",
142 OUTPUT_BOOLEAN_YN,
143 &ConfigChannel.use_except,
144 "Enable chanmode +e (ban exceptions)"
145 },
146 {
147 "use_knock",
148 OUTPUT_BOOLEAN_YN,
149 &ConfigChannel.use_knock,
150 "Enable /KNOCK"
151 },
152 {
153 "knock_delay",
154 OUTPUT_DECIMAL,
155 &ConfigChannel.knock_delay,
156 "Delay between a users KNOCK attempts"
157 },
158 {
159 "knock_delay_channel",
160 OUTPUT_DECIMAL,
161 &ConfigChannel.knock_delay_channel,
162 "Delay between KNOCK attempts to a channel"
163 },
164 {
165 "max_chans_per_user",
166 OUTPUT_DECIMAL,
167 &ConfigChannel.max_chans_per_user,
168 "Maximum number of channels a user can join"
169 },
170 {
171 "quiet_on_ban",
172 OUTPUT_BOOLEAN_YN,
173 &ConfigChannel.quiet_on_ban,
174 "Banned users may not send text to a channel"
175 },
176 {
177 "max_bans",
178 OUTPUT_DECIMAL,
179 &ConfigChannel.max_bans,
180 "Total +b/e/I modes allowed in a channel"
181 },
182 {
183 "default_split_user_count",
184 OUTPUT_DECIMAL,
185 &ConfigChannel.default_split_user_count,
186 "Startup value of SPLITUSERS"
187 },
188 {
189 "default_split_server_count",
190 OUTPUT_DECIMAL,
191 &ConfigChannel.default_split_server_count,
192 "Startup value of SPLITNUM"
193 },
194 {
195 "no_create_on_split",
196 OUTPUT_BOOLEAN_YN,
197 &ConfigChannel.no_create_on_split,
198 "Disallow creation of channels when split"
199 },
200 {
201 "no_join_on_split",
202 OUTPUT_BOOLEAN_YN,
203 &ConfigChannel.no_join_on_split,
204 "Disallow joining channels when split"
205 },
206 {
207 "burst_topicwho",
208 OUTPUT_BOOLEAN_YN,
209 &ConfigChannel.burst_topicwho,
210 "Enable sending of who set topic on topicburst"
211 },
212 {
213 "flatten_links",
214 OUTPUT_BOOLEAN_YN,
215 &ConfigServerHide.flatten_links,
216 "Flatten /links list"
217 },
218 {
219 "links_delay",
220 OUTPUT_DECIMAL,
221 &ConfigServerHide.links_delay,
222 "Links rehash delay"
223 },
224 {
225 "hidden",
226 OUTPUT_BOOLEAN_YN,
227 &ConfigServerHide.hidden,
228 "Hide this server from a flattened /links on remote servers"
229 },
230 {
231 "disable_hidden",
232 OUTPUT_BOOLEAN_YN,
233 &ConfigServerHide.disable_hidden,
234 "Prevent servers from hiding themselves from a flattened /links"
235 },
236 {
237 "hide_servers",
238 OUTPUT_BOOLEAN_YN,
239 &ConfigServerHide.hide_servers,
240 "Hide servernames from users"
241 },
242 {
243 "hidden_name",
244 OUTPUT_STRING,
245 &ConfigServerHide.hidden_name,
246 "Server name users see if hide_servers = yes"
247 },
248 {
249 "hide_server_ips",
250 OUTPUT_BOOLEAN_YN,
251 &ConfigServerHide.hide_server_ips,
252 "Prevent people from seeing server IPs"
253 },
254 {
255 "gline_min_cidr",
256 OUTPUT_DECIMAL,
257 &ConfigFileEntry.gline_min_cidr,
258 "Minimum required length of a CIDR bitmask for IPv4 G-Lines"
259 },
260 {
261 "gline_min_cidr6",
262 OUTPUT_DECIMAL,
263 &ConfigFileEntry.gline_min_cidr6,
264 "Minimum required length of a CIDR bitmask for IPv6 G-Lines"
265 },
266 {
267 "invisible_on_connect",
268 OUTPUT_BOOLEAN_YN,
269 &ConfigFileEntry.invisible_on_connect,
270 "Automatically set mode +i on connecting users"
271 },
272 {
273 "burst_away",
274 OUTPUT_BOOLEAN_YN,
275 &ConfigFileEntry.burst_away,
276 "Send /away string that users have set on the server burst"
277 },
278 {
279 "use_whois_actually",
280 OUTPUT_BOOLEAN_YN,
281 &ConfigFileEntry.use_whois_actually,
282 "Show IP address on /WHOIS when possible"
283 },
284 {
285 "kill_chase_time_limit",
286 OUTPUT_DECIMAL,
287 &ConfigFileEntry.kill_chase_time_limit,
288 "Nick Change Tracker for KILL"
289 },
290 {
291 "hide_spoof_ips",
292 OUTPUT_BOOLEAN_YN,
293 &ConfigFileEntry.hide_spoof_ips,
294 "Hide spoofed IP's"
295 },
296 {
297 "ignore_bogus_ts",
298 OUTPUT_BOOLEAN_YN,
299 &ConfigFileEntry.ignore_bogus_ts,
300 "Ignore bogus timestamps from other servers"
301 },
302 {
303 "disable_auth",
304 OUTPUT_BOOLEAN_YN,
305 &ConfigFileEntry.disable_auth,
306 "Completely disable ident lookups"
307 },
308 {
309 "disable_remote_commands",
310 OUTPUT_BOOLEAN_YN,
311 &ConfigFileEntry.disable_remote,
312 "Prevent users issuing commands on remote servers"
313 },
314 {
315 "tkline_expire_notices",
316 OUTPUT_BOOLEAN_YN,
317 &ConfigFileEntry.tkline_expire_notices,
318 "Show temporary kline/xline expire notices"
319 },
320 {
321 "default_floodcount",
322 OUTPUT_DECIMAL,
323 &ConfigFileEntry.default_floodcount,
324 "Startup value of FLOODCOUNT"
325 },
326 {
327 "failed_oper_notice",
328 OUTPUT_BOOLEAN,
329 &ConfigFileEntry.failed_oper_notice,
330 "Inform opers if someone /oper's with the wrong password"
331 },
332 {
333 "dots_in_ident",
334 OUTPUT_DECIMAL,
335 &ConfigFileEntry.dots_in_ident,
336 "Number of permissable dots in an ident"
337 },
338 {
339 "min_nonwildcard",
340 OUTPUT_DECIMAL,
341 &ConfigFileEntry.min_nonwildcard,
342 "Minimum non-wildcard chars in K/G lines"
343 },
344 {
345 "min_nonwildcard_simple",
346 OUTPUT_DECIMAL,
347 &ConfigFileEntry.min_nonwildcard_simple,
348 "Minimum non-wildcards in gecos bans"
349 },
350 {
351 "max_accept",
352 OUTPUT_DECIMAL,
353 &ConfigFileEntry.max_accept,
354 "Maximum nicknames on accept list"
355 },
356 {
357 "anti_nick_flood",
358 OUTPUT_BOOLEAN,
359 &ConfigFileEntry.anti_nick_flood,
360 "NICK flood protection"
361 },
362 {
363 "max_nick_time",
364 OUTPUT_DECIMAL,
365 &ConfigFileEntry.max_nick_time,
366 "NICK flood protection time interval"
367 },
368 {
369 "max_nick_changes",
370 OUTPUT_DECIMAL,
371 &ConfigFileEntry.max_nick_changes,
372 "NICK change threshhold setting"
373 },
374 {
375 "anti_spam_exit_message_time",
376 OUTPUT_DECIMAL,
377 &ConfigFileEntry.anti_spam_exit_message_time,
378 "Duration a client must be connected for to have an exit message"
379 },
380 {
381 "ts_warn_delta",
382 OUTPUT_DECIMAL,
383 &ConfigFileEntry.ts_warn_delta,
384 "Maximum permitted TS delta before displaying a warning"
385 },
386 {
387 "ts_max_delta",
388 OUTPUT_DECIMAL,
389 &ConfigFileEntry.ts_max_delta,
390 "Maximum permitted TS delta from another server"
391 },
392 {
393 "kline_with_reason",
394 OUTPUT_BOOLEAN_YN,
395 &ConfigFileEntry.kline_with_reason,
396 "Display K-line reason to client on disconnect"
397 },
398 {
399 "kline_reason",
400 OUTPUT_STRING,
401 &ConfigFileEntry.kline_reason,
402 "Reason given to K-lined clients on sign off"
403 },
404 {
405 "warn_no_nline",
406 OUTPUT_BOOLEAN,
407 &ConfigFileEntry.warn_no_nline,
408 "Display warning if connecting server lacks N-line"
409 },
410 {
411 "stats_o_oper_only",
412 OUTPUT_BOOLEAN_YN,
413 &ConfigFileEntry.stats_o_oper_only,
414 "STATS O output is only shown to operators"
415 },
416 {
417 "stats_P_oper_only",
418 OUTPUT_BOOLEAN_YN,
419 &ConfigFileEntry.stats_P_oper_only,
420 "STATS P is only shown to operators"
421 },
422 {
423 "stats_i_oper_only",
424 OUTPUT_BOOLEAN2,
425 &ConfigFileEntry.stats_i_oper_only,
426 "STATS I output is only shown to operators"
427 },
428 {
429 "stats_k_oper_only",
430 OUTPUT_BOOLEAN2,
431 &ConfigFileEntry.stats_k_oper_only,
432 "STATS K output is only shown to operators"
433 },
434 {
435 "caller_id_wait",
436 OUTPUT_DECIMAL,
437 &ConfigFileEntry.caller_id_wait,
438 "Minimum delay between notifying UMODE +g users of messages"
439 },
440 {
441 "opers_bypass_callerid",
442 OUTPUT_BOOLEAN_YN,
443 &ConfigFileEntry.opers_bypass_callerid,
444 "Allows IRC operators to message users who are +g (callerid)"
445 },
446 {
447 "pace_wait_simple",
448 OUTPUT_DECIMAL,
449 &ConfigFileEntry.pace_wait_simple,
450 "Minimum delay between less intensive commands"
451 },
452 {
453 "pace_wait",
454 OUTPUT_DECIMAL,
455 &ConfigFileEntry.pace_wait,
456 "Minimum delay between uses of certain commands"
457 },
458 {
459 "short_motd",
460 OUTPUT_BOOLEAN_YN,
461 &ConfigFileEntry.short_motd,
462 "Do not show MOTD; only tell clients they should read it"
463 },
464 {
465 "ping_cookie",
466 OUTPUT_BOOLEAN,
467 &ConfigFileEntry.ping_cookie,
468 "Require ping cookies to connect"
469 },
470 {
471 "no_oper_flood",
472 OUTPUT_BOOLEAN,
473 &ConfigFileEntry.no_oper_flood,
474 "Reduce flood control for operators"
475 },
476 {
477 "true_no_oper_flood",
478 OUTPUT_BOOLEAN,
479 &ConfigFileEntry.true_no_oper_flood,
480 "Completely disable flood control for operators"
481 },
482 {
483 "oper_pass_resv",
484 OUTPUT_BOOLEAN_YN,
485 &ConfigFileEntry.oper_pass_resv,
486 "Opers can over-ride RESVs"
487 },
488 {
489 "max_targets",
490 OUTPUT_DECIMAL,
491 &ConfigFileEntry.max_targets,
492 "The maximum number of PRIVMSG/NOTICE targets"
493 },
494 {
495 "client_flood",
496 OUTPUT_DECIMAL,
497 &ConfigFileEntry.client_flood,
498 "Maximum amount of data in a client's queue before they are disconnected"
499 },
500 {
501 "throttle_time",
502 OUTPUT_DECIMAL,
503 &ConfigFileEntry.throttle_time,
504 "Minimum time between client reconnects"
505 },
506 {
507 "glines",
508 OUTPUT_BOOLEAN,
509 &ConfigFileEntry.glines,
510 "G-line (network-wide K-line) support"
511 },
512 {
513 "duration",
514 OUTPUT_DECIMAL,
515 &ConfigFileEntry.gline_time,
516 "Expiry time for G-lines"
517 },
518 /* --[ END OF TABLE ]---------------------------------------------- */
519 {
520 NULL,
521 0,
522 NULL,
523 0
524 }
525 };
526
527 /*
528 ** m_info()
529 ** parv[0] = sender prefix
530 ** parv[1] = servername
531 */
532 static void
533 m_info(struct Client *client_p, struct Client *source_p,
534 int parc, char *parv[])
535 {
536 static time_t last_used = 0;
537
538 if ((last_used + ConfigFileEntry.pace_wait) > CurrentTime)
539 {
540 /* safe enough to give this on a local connect only */
541 sendto_one(source_p, form_str(RPL_LOAD2HI),
542 me.name, source_p->name);
543 return;
544 }
545
546 last_used = CurrentTime;
547
548 if (!ConfigFileEntry.disable_remote)
549 if (hunt_server(client_p,source_p, ":%s INFO :%s", 1,
550 parc, parv) != HUNTED_ISME)
551 return;
552
553 send_info_text(source_p);
554 }
555
556 /*
557 ** mo_info()
558 ** parv[0] = sender prefix
559 ** parv[1] = servername
560 */
561 static void
562 mo_info(struct Client *client_p, struct Client *source_p,
563 int parc, char *parv[])
564 {
565 if (hunt_server(client_p, source_p, ":%s INFO :%s", 1,
566 parc, parv) != HUNTED_ISME)
567 return;
568
569 send_info_text(source_p);
570 }
571
572 /*
573 ** ms_info()
574 ** parv[0] = sender prefix
575 ** parv[1] = servername
576 */
577 static void
578 ms_info(struct Client *client_p, struct Client *source_p,
579 int parc, char *parv[])
580 {
581 if (!IsClient(source_p))
582 return;
583
584 if (hunt_server(client_p, source_p, ":%s INFO :%s", 1,
585 parc, parv) != HUNTED_ISME)
586 return;
587
588 send_info_text(source_p);
589 }
590
591 /* send_info_text()
592 *
593 * inputs - client pointer to send info text to
594 * output - NONE
595 * side effects - info text is sent to client
596 */
597 static void
598 send_info_text(struct Client *source_p)
599 {
600 const char **text = infotext;
601 char *source, *target;
602
603 sendto_realops_flags(UMODE_SPY, L_ALL,
604 "INFO requested by %s (%s@%s) [%s]",
605 source_p->name, source_p->username,
606 source_p->host, source_p->servptr->name);
607
608 if (!MyClient(source_p) && IsCapable(source_p->from, CAP_TS6) &&
609 HasID(source_p))
610 source = me.id, target = source_p->id;
611 else
612 source = me.name, target = source_p->name;
613
614 while (*text)
615 {
616 const char *line = *text++;
617
618 if (*line == '\0')
619 line = " ";
620
621 sendto_one(source_p, form_str(RPL_INFO),
622 source, target, line);
623 }
624
625 if (HasUMode(source_p, UMODE_OPER))
626 send_conf_options(source_p);
627
628 send_birthdate_online_time(source_p);
629
630 sendto_one(source_p, form_str(RPL_ENDOFINFO),
631 me.name, source_p->name);
632 }
633
634 /* send_birthdate_online_time()
635 *
636 * inputs - client pointer to send to
637 * output - NONE
638 * side effects - birthdate and online time are sent
639 */
640 static void
641 send_birthdate_online_time(struct Client *source_p)
642 {
643 if (!MyClient(source_p) && IsCapable(source_p->from, CAP_TS6) && HasID(source_p))
644 {
645 sendto_one(source_p, ":%s %d %s :On-line since %s",
646 me.id, RPL_INFO, source_p->id,
647 myctime(me.localClient->firsttime));
648 }
649 else
650 {
651 sendto_one(source_p, ":%s %d %s :On-line since %s",
652 me.name, RPL_INFO, source_p->name,
653 myctime(me.localClient->firsttime));
654 }
655 }
656
657 /* send_conf_options()
658 *
659 * inputs - client pointer to send to
660 * output - NONE
661 * side effects - send config options to client
662 */
663 static void
664 send_conf_options(struct Client *source_p)
665 {
666 Info *infoptr;
667 const char *from, *to;
668 const struct InfoStruct *iptr = NULL;
669
670 /* Now send them a list of all our configuration options
671 * (mostly from defaults.h and config.h)
672 */
673 if (!MyClient(source_p) && IsCapable(source_p->from, CAP_TS6) && HasID(source_p))
674 {
675 from = me.id;
676 to = source_p->id;
677 }
678 else
679 {
680 from = me.name;
681 to = source_p->name;
682 }
683
684 for (infoptr = MyInformation; infoptr->name; infoptr++)
685 {
686 if (infoptr->intvalue)
687 {
688 sendto_one(source_p, ":%s %d %s :%-30s %-5d [%-30s]",
689 from, RPL_INFO, to, infoptr->name,
690 infoptr->intvalue, infoptr->desc);
691 }
692 else
693 {
694 sendto_one(source_p, ":%s %d %s :%-30s %-5s [%-30s]",
695 from, RPL_INFO, to, infoptr->name,
696 infoptr->strvalue, infoptr->desc);
697 }
698 }
699
700 /*
701 * Parse the info_table[] and do the magic.
702 */
703 for (iptr = info_table; iptr->name; ++iptr)
704 {
705 switch (iptr->output_type)
706 {
707 /* For "char *" references */
708 case OUTPUT_STRING:
709 {
710 const char *option = *((char **)iptr->option);
711
712 sendto_one(source_p, ":%s %d %s :%-30s %-5s [%-30s]",
713 from, RPL_INFO, to,
714 iptr->name, option ? option : "NONE",
715 iptr->desc ? iptr->desc : "<none>");
716 break;
717 }
718
719 /* For "char foo[]" references */
720 case OUTPUT_STRING_PTR:
721 {
722 const char *option = iptr->option;
723
724 sendto_one(source_p, ":%s %d %s :%-30s %-5s [%-30s]",
725 from, RPL_INFO, to,
726 iptr->name, option ? option : "NONE",
727 iptr->desc ? iptr->desc : "<none>");
728 break;
729 }
730
731 /* Output info_table[i].option as a decimal value. */
732 case OUTPUT_DECIMAL:
733 {
734 const int option = *((int *)iptr->option);
735
736 sendto_one(source_p, ":%s %d %s :%-30s %-5d [%-30s]",
737 from, RPL_INFO, to, iptr->name,
738 option, iptr->desc ? iptr->desc : "<none>");
739 break;
740 }
741
742 /* Output info_table[i].option as "ON" or "OFF" */
743 case OUTPUT_BOOLEAN:
744 {
745 const int option = *((int *)iptr->option);
746
747 sendto_one(source_p, ":%s %d %s :%-30s %-5s [%-30s]",
748 from, RPL_INFO, to,
749 iptr->name, option ? "ON" : "OFF",
750 iptr->desc ? iptr->desc : "<none>");
751
752 break;
753 }
754
755 /* Output info_table[i].option as "YES" or "NO" */
756 case OUTPUT_BOOLEAN_YN:
757 {
758 int option = *((int *)iptr->option);
759
760 sendto_one(source_p, ":%s %d %s :%-30s %-5s [%-30s]",
761 from, RPL_INFO, to,
762 iptr->name, option ? "YES" : "NO",
763 iptr->desc ? iptr->desc : "<none>");
764 break;
765 }
766
767 case OUTPUT_BOOLEAN2:
768 {
769 int option = *((int *)iptr->option);
770
771 sendto_one(source_p, ":%s %d %s :%-30s %-5s [%-30s]",
772 from, RPL_INFO, to,
773 iptr->name, option ? ((option == 1) ? "MASK" : "YES") : "NO",
774 iptr->desc ? iptr->desc : "<none>");
775 break;
776 }
777 }
778 }
779
780 /* Don't send oper_only_umodes...it's a bit mask, we will have to decode it
781 * in order for it to show up properly to opers who issue INFO
782 */
783 #ifndef EFNET
784 /* jdc -- Only send compile information to admins. */
785 if (HasUMode(source_p, UMODE_ADMIN))
786 sendto_one(source_p, ":%s %d %s :Running on [%s]",
787 from, RPL_INFO, to, ircd_platform);
788 #endif
789 sendto_one(source_p, form_str(RPL_INFO),
790 from, to, "");
791 }
792
793 static struct Message info_msgtab = {
794 "INFO", 0, 0, 0, MAXPARA, MFLG_SLOW, 0,
795 { m_unregistered, m_info, ms_info, m_ignore, mo_info, m_ignore }
796 };
797
798 static void
799 module_init(void)
800 {
801 mod_add_cmd(&info_msgtab);
802 }
803
804 static void
805 module_exit(void)
806 {
807 mod_del_cmd(&info_msgtab);
808 }
809
810 struct module module_entry = {
811 .node = { NULL, NULL, NULL },
812 .name = NULL,
813 .version = "$Revision$",
814 .handle = NULL,
815 .modinit = module_init,
816 .modexit = module_exit,
817 .flags = 0
818 };

Properties

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