ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/trunk/src/conf_parser.y
Revision: 7924
Committed: Sat Dec 31 13:57:08 2016 UTC (8 years, 7 months ago) by michael
File size: 76918 byte(s)
Log Message:
- Update copyright years

File Contents

# Content
1 /*
2 * ircd-hybrid: an advanced, lightweight Internet Relay Chat Daemon (ircd)
3 *
4 * Copyright (c) 2000-2017 ircd-hybrid development team
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
19 * USA
20 */
21
22 /*! \file conf_parser.y
23 * \brief Parses the ircd configuration file.
24 * \version $Id$
25 */
26
27
28 %{
29
30 #include "config.h"
31 #include "stdinc.h"
32 #include "ircd.h"
33 #include "list.h"
34 #include "conf.h"
35 #include "conf_class.h"
36 #include "conf_cluster.h"
37 #include "conf_gecos.h"
38 #include "conf_pseudo.h"
39 #include "conf_resv.h"
40 #include "conf_service.h"
41 #include "conf_shared.h"
42 #include "event.h"
43 #include "id.h"
44 #include "log.h"
45 #include "irc_string.h"
46 #include "memory.h"
47 #include "modules.h"
48 #include "server.h"
49 #include "hostmask.h"
50 #include "listener.h"
51 #include "user.h"
52 #include "motd.h"
53
54 int yylex(void);
55
56 static struct
57 {
58 struct
59 {
60 dlink_list list;
61 } mask,
62 leaf,
63 hub;
64
65 struct
66 {
67 char buf[IRCD_BUFSIZE];
68 } name,
69 nick,
70 user,
71 host,
72 addr,
73 bind,
74 file,
75 ciph,
76 cert,
77 rpass,
78 spass,
79 whois,
80 class,
81 target,
82 prepend,
83 command;
84
85 struct
86 {
87 unsigned int value;
88 } flags,
89 modes,
90 size,
91 type,
92 port,
93 aftype,
94 ping_freq,
95 max_perip,
96 con_freq,
97 min_idle,
98 max_idle,
99 max_total,
100 max_global,
101 max_local,
102 max_sendq,
103 max_recvq,
104 max_channels,
105 cidr_bitlen_ipv4,
106 cidr_bitlen_ipv6,
107 number_per_cidr;
108 } block_state;
109
110 static void
111 reset_block_state(void)
112 {
113 dlink_node *node = NULL, *node_next = NULL;
114
115 DLINK_FOREACH_SAFE(node, node_next, block_state.mask.list.head)
116 {
117 xfree(node->data);
118 dlinkDelete(node, &block_state.mask.list);
119 free_dlink_node(node);
120 }
121
122 DLINK_FOREACH_SAFE(node, node_next, block_state.leaf.list.head)
123 {
124 xfree(node->data);
125 dlinkDelete(node, &block_state.leaf.list);
126 free_dlink_node(node);
127 }
128
129 DLINK_FOREACH_SAFE(node, node_next, block_state.hub.list.head)
130 {
131 xfree(node->data);
132 dlinkDelete(node, &block_state.hub.list);
133 free_dlink_node(node);
134 }
135
136 memset(&block_state, 0, sizeof(block_state));
137 }
138
139 %}
140
141 %union {
142 int number;
143 char *string;
144 }
145
146 %token ACCEPT_PASSWORD
147 %token ADMIN
148 %token AFTYPE
149 %token ANTI_NICK_FLOOD
150 %token ANTI_SPAM_EXIT_MESSAGE_TIME
151 %token AUTOCONN
152 %token AWAY_COUNT
153 %token AWAY_TIME
154 %token BYTES KBYTES MBYTES
155 %token CALLER_ID_WAIT
156 %token CAN_FLOOD
157 %token CHANNEL
158 %token CHECK_CACHE
159 %token CIDR_BITLEN_IPV4
160 %token CIDR_BITLEN_IPV6
161 %token CLASS
162 %token CLOSE
163 %token CONNECT
164 %token CONNECTFREQ
165 %token CYCLE_ON_HOST_CHANGE
166 %token DEFAULT_FLOODCOUNT
167 %token DEFAULT_FLOODTIME
168 %token DEFAULT_JOIN_FLOOD_COUNT
169 %token DEFAULT_JOIN_FLOOD_TIME
170 %token DEFAULT_MAX_CLIENTS
171 %token DENY
172 %token DESCRIPTION
173 %token DIE
174 %token DISABLE_AUTH
175 %token DISABLE_FAKE_CHANNELS
176 %token DISABLE_REMOTE_COMMANDS
177 %token DLINE_MIN_CIDR
178 %token DLINE_MIN_CIDR6
179 %token DOTS_IN_IDENT
180 %token EMAIL
181 %token ENCRYPTED
182 %token EXCEED_LIMIT
183 %token EXEMPT
184 %token FAILED_OPER_NOTICE
185 %token FLATTEN_LINKS
186 %token FLATTEN_LINKS_DELAY
187 %token FLATTEN_LINKS_FILE
188 %token GECOS
189 %token GENERAL
190 %token HIDDEN
191 %token HIDDEN_NAME
192 %token HIDE_CHANS
193 %token HIDE_IDLE
194 %token HIDE_IDLE_FROM_OPERS
195 %token HIDE_SERVER_IPS
196 %token HIDE_SERVERS
197 %token HIDE_SERVICES
198 %token HOST
199 %token HUB
200 %token HUB_MASK
201 %token IGNORE_BOGUS_TS
202 %token INVISIBLE_ON_CONNECT
203 %token INVITE_CLIENT_COUNT
204 %token INVITE_CLIENT_TIME
205 %token INVITE_DELAY_CHANNEL
206 %token INVITE_EXPIRE_TIME
207 %token IP
208 %token IRCD_AUTH
209 %token IRCD_FLAGS
210 %token IRCD_SID
211 %token JOIN
212 %token KILL
213 %token KILL_CHASE_TIME_LIMIT
214 %token KLINE
215 %token KLINE_EXEMPT
216 %token KLINE_MIN_CIDR
217 %token KLINE_MIN_CIDR6
218 %token KNOCK_CLIENT_COUNT
219 %token KNOCK_CLIENT_TIME
220 %token KNOCK_DELAY_CHANNEL
221 %token LEAF_MASK
222 %token LIBGEOIP_DATABASE_OPTIONS
223 %token LIBGEOIP_IPV4_DATABASE_FILE
224 %token LIBGEOIP_IPV6_DATABASE_FILE
225 %token LISTEN
226 %token MASK
227 %token MAX_ACCEPT
228 %token MAX_BANS
229 %token MAX_CHANNELS
230 %token MAX_GLOBAL
231 %token MAX_IDLE
232 %token MAX_INVITES
233 %token MAX_LOCAL
234 %token MAX_NICK_CHANGES
235 %token MAX_NICK_LENGTH
236 %token MAX_NICK_TIME
237 %token MAX_NUMBER
238 %token MAX_TARGETS
239 %token MAX_TOPIC_LENGTH
240 %token MAX_WATCH
241 %token MEMORY_CACHE
242 %token MIN_IDLE
243 %token MIN_NONWILDCARD
244 %token MIN_NONWILDCARD_SIMPLE
245 %token MMAP_CACHE
246 %token MODULE
247 %token MODULES
248 %token MOTD
249 %token NAME
250 %token NEED_IDENT
251 %token NEED_PASSWORD
252 %token NETWORK_DESC
253 %token NETWORK_NAME
254 %token NICK
255 %token NO_OPER_FLOOD
256 %token NO_TILDE
257 %token NUMBER
258 %token NUMBER_PER_CIDR
259 %token NUMBER_PER_IP
260 %token OPER_ONLY_UMODES
261 %token OPER_UMODES
262 %token OPERATOR
263 %token OPERS_BYPASS_CALLERID
264 %token PACE_WAIT
265 %token PACE_WAIT_SIMPLE
266 %token PASSWORD
267 %token PATH
268 %token PING_COOKIE
269 %token PING_TIME
270 %token PORT
271 %token QSTRING
272 %token RANDOM_IDLE
273 %token REASON
274 %token REDIRPORT
275 %token REDIRSERV
276 %token REHASH
277 %token REMOTE
278 %token REMOTEBAN
279 %token RESV
280 %token RESV_EXEMPT
281 %token RSA_PRIVATE_KEY_FILE
282 %token SECONDS MINUTES HOURS DAYS WEEKS MONTHS YEARS
283 %token SEND_PASSWORD
284 %token SENDQ
285 %token SERVERHIDE
286 %token SERVERINFO
287 %token SHORT_MOTD
288 %token SPOOF
289 %token SPOOF_NOTICE
290 %token SQUIT
291 %token SSL_CERTIFICATE_FILE
292 %token SSL_CERTIFICATE_FINGERPRINT
293 %token SSL_CONNECTION_REQUIRED
294 %token SSL_DH_ELLIPTIC_CURVE
295 %token SSL_DH_PARAM_FILE
296 %token SSL_MESSAGE_DIGEST_ALGORITHM
297 %token STANDARD
298 %token STATS_E_DISABLED
299 %token STATS_I_OPER_ONLY
300 %token STATS_K_OPER_ONLY
301 %token STATS_M_OPER_ONLY
302 %token STATS_O_OPER_ONLY
303 %token STATS_P_OPER_ONLY
304 %token STATS_U_OPER_ONLY
305 %token T_ALL
306 %token T_BOTS
307 %token T_CALLERID
308 %token T_CCONN
309 %token T_COMMAND
310 %token T_CLUSTER
311 %token T_DEAF
312 %token T_DEBUG
313 %token T_DLINE
314 %token T_EXTERNAL
315 %token T_FARCONNECT
316 %token T_FILE
317 %token T_FULL
318 %token T_GLOBOPS
319 %token T_INVISIBLE
320 %token T_IPV4
321 %token T_IPV6
322 %token T_LOCOPS
323 %token T_LOG
324 %token T_NCHANGE
325 %token T_NONONREG
326 %token T_OPME
327 %token T_PREPEND
328 %token T_PSEUDO
329 %token T_RECVQ
330 %token T_REJ
331 %token T_RESTART
332 %token T_SERVER
333 %token T_SERVICE
334 %token T_SERVNOTICE
335 %token T_SET
336 %token T_SHARED
337 %token T_SIZE
338 %token T_SKILL
339 %token T_SOFTCALLERID
340 %token T_SPY
341 %token T_SSL
342 %token T_SSL_CIPHER_LIST
343 %token T_TARGET
344 %token T_UMODES
345 %token T_UNAUTH
346 %token T_UNDLINE
347 %token T_UNLIMITED
348 %token T_UNRESV
349 %token T_UNXLINE
350 %token T_WALLOP
351 %token T_WALLOPS
352 %token T_WEBIRC
353 %token TBOOL
354 %token THROTTLE_COUNT
355 %token THROTTLE_TIME
356 %token TKLINE_EXPIRE_NOTICES
357 %token TMASKED
358 %token TS_MAX_DELTA
359 %token TS_WARN_DELTA
360 %token TWODOTS
361 %token TYPE
362 %token UNKLINE
363 %token USE_LOGGING
364 %token USER
365 %token VHOST
366 %token VHOST6
367 %token WARN_NO_CONNECT_BLOCK
368 %token WHOIS
369 %token WHOWAS_HISTORY_LENGTH
370 %token XLINE
371 %token XLINE_EXEMPT
372
373 %type <string> QSTRING
374 %type <number> NUMBER
375 %type <number> timespec
376 %type <number> timespec_
377 %type <number> sizespec
378 %type <number> sizespec_
379
380 %%
381 conf:
382 | conf conf_item
383 ;
384
385 conf_item: admin_entry
386 | logging_entry
387 | oper_entry
388 | channel_entry
389 | class_entry
390 | listen_entry
391 | auth_entry
392 | serverinfo_entry
393 | serverhide_entry
394 | resv_entry
395 | service_entry
396 | shared_entry
397 | cluster_entry
398 | connect_entry
399 | kill_entry
400 | deny_entry
401 | exempt_entry
402 | general_entry
403 | gecos_entry
404 | modules_entry
405 | motd_entry
406 | pseudo_entry
407 | error ';'
408 | error '}'
409 ;
410
411
412 timespec_: { $$ = 0; } | timespec;
413 timespec: NUMBER timespec_ { $$ = $1 + $2; } |
414 NUMBER SECONDS timespec_ { $$ = $1 + $3; } |
415 NUMBER MINUTES timespec_ { $$ = $1 * 60 + $3; } |
416 NUMBER HOURS timespec_ { $$ = $1 * 60 * 60 + $3; } |
417 NUMBER DAYS timespec_ { $$ = $1 * 60 * 60 * 24 + $3; } |
418 NUMBER WEEKS timespec_ { $$ = $1 * 60 * 60 * 24 * 7 + $3; } |
419 NUMBER MONTHS timespec_ { $$ = $1 * 60 * 60 * 24 * 7 * 4 + $3; } |
420 NUMBER YEARS timespec_ { $$ = $1 * 60 * 60 * 24 * 365 + $3; }
421 ;
422
423 sizespec_: { $$ = 0; } | sizespec;
424 sizespec: NUMBER sizespec_ { $$ = $1 + $2; } |
425 NUMBER BYTES sizespec_ { $$ = $1 + $3; } |
426 NUMBER KBYTES sizespec_ { $$ = $1 * 1024 + $3; } |
427 NUMBER MBYTES sizespec_ { $$ = $1 * 1024 * 1024 + $3; }
428 ;
429
430
431 /***************************************************************************
432 * modules {} section
433 ***************************************************************************/
434 modules_entry: MODULES '{' modules_items '}' ';';
435
436 modules_items: modules_items modules_item | modules_item;
437 modules_item: modules_module | modules_path | error ';' ;
438
439 modules_module: MODULE '=' QSTRING ';'
440 {
441 if (conf_parser_ctx.pass == 2)
442 add_conf_module(libio_basename(yylval.string));
443 };
444
445 modules_path: PATH '=' QSTRING ';'
446 {
447 if (conf_parser_ctx.pass == 2)
448 mod_add_path(yylval.string);
449 };
450
451
452 /***************************************************************************
453 * serverinfo {} section
454 ***************************************************************************/
455 serverinfo_entry: SERVERINFO '{' serverinfo_items '}' ';';
456
457 serverinfo_items: serverinfo_items serverinfo_item | serverinfo_item ;
458 serverinfo_item: serverinfo_name |
459 serverinfo_vhost |
460 serverinfo_hub |
461 serverinfo_description |
462 serverinfo_network_name |
463 serverinfo_network_desc |
464 serverinfo_default_max_clients |
465 serverinfo_max_nick_length |
466 serverinfo_max_topic_length |
467 serverinfo_ssl_dh_param_file |
468 serverinfo_ssl_dh_elliptic_curve |
469 serverinfo_rsa_private_key_file |
470 serverinfo_vhost6 |
471 serverinfo_sid |
472 serverinfo_ssl_certificate_file |
473 serverinfo_ssl_cipher_list |
474 serverinfo_ssl_message_digest_algorithm |
475 serverinfo_libgeoip_database_options |
476 serverinfo_libgeoip_ipv4_database_file |
477 serverinfo_libgeoip_ipv6_database_file |
478 error ';' ;
479
480
481 serverinfo_ssl_certificate_file: SSL_CERTIFICATE_FILE '=' QSTRING ';'
482 {
483 if (conf_parser_ctx.pass == 2)
484 {
485 xfree(ConfigServerInfo.ssl_certificate_file);
486 ConfigServerInfo.ssl_certificate_file = xstrdup(yylval.string);
487 }
488 };
489
490 serverinfo_rsa_private_key_file: RSA_PRIVATE_KEY_FILE '=' QSTRING ';'
491 {
492 if (conf_parser_ctx.pass == 2)
493 {
494 xfree(ConfigServerInfo.rsa_private_key_file);
495 ConfigServerInfo.rsa_private_key_file = xstrdup(yylval.string);
496 }
497 };
498
499 serverinfo_ssl_dh_param_file: SSL_DH_PARAM_FILE '=' QSTRING ';'
500 {
501 if (conf_parser_ctx.pass == 2)
502 {
503 xfree(ConfigServerInfo.ssl_dh_param_file);
504 ConfigServerInfo.ssl_dh_param_file = xstrdup(yylval.string);
505 }
506 };
507
508 serverinfo_ssl_cipher_list: T_SSL_CIPHER_LIST '=' QSTRING ';'
509 {
510 if (conf_parser_ctx.pass == 2)
511 {
512 xfree(ConfigServerInfo.ssl_cipher_list);
513 ConfigServerInfo.ssl_cipher_list = xstrdup(yylval.string);
514 }
515 };
516
517 serverinfo_ssl_message_digest_algorithm: SSL_MESSAGE_DIGEST_ALGORITHM '=' QSTRING ';'
518 {
519 if (conf_parser_ctx.pass == 2)
520 {
521 xfree(ConfigServerInfo.ssl_message_digest_algorithm);
522 ConfigServerInfo.ssl_message_digest_algorithm = xstrdup(yylval.string);
523 }
524 }
525
526 serverinfo_ssl_dh_elliptic_curve: SSL_DH_ELLIPTIC_CURVE '=' QSTRING ';'
527 {
528 if (conf_parser_ctx.pass == 2)
529 {
530 xfree(ConfigServerInfo.ssl_dh_elliptic_curve);
531 ConfigServerInfo.ssl_dh_elliptic_curve = xstrdup(yylval.string);
532 }
533 };
534
535 serverinfo_libgeoip_database_options: LIBGEOIP_DATABASE_OPTIONS
536 {
537 if (conf_parser_ctx.pass == 1)
538 ConfigServerInfo.libgeoip_database_options = 0;
539 } '=' options_items ';';
540
541 options_items: options_items ',' options_item | options_item;
542 options_item: STANDARD
543 {
544 #ifdef HAVE_LIBGEOIP
545 if (conf_parser_ctx.pass == 1)
546 ConfigServerInfo.libgeoip_database_options |= GEOIP_STANDARD;
547 #endif
548 } | MEMORY_CACHE
549 {
550 #ifdef HAVE_LIBGEOIP
551 if (conf_parser_ctx.pass == 1)
552 ConfigServerInfo.libgeoip_database_options |= GEOIP_MEMORY_CACHE;
553 #endif
554 } | MMAP_CACHE
555 {
556 #ifdef HAVE_LIBGEOIP
557 if (conf_parser_ctx.pass == 1)
558 ConfigServerInfo.libgeoip_database_options |= GEOIP_MMAP_CACHE;
559 #endif
560 } | CHECK_CACHE
561 {
562 #ifdef HAVE_LIBGEOIP
563 if (conf_parser_ctx.pass == 1)
564 ConfigServerInfo.libgeoip_database_options |= GEOIP_CHECK_CACHE;
565 #endif
566 };
567
568 serverinfo_libgeoip_ipv4_database_file: LIBGEOIP_IPV4_DATABASE_FILE '=' QSTRING ';'
569 {
570 if (conf_parser_ctx.pass == 2)
571 {
572 xfree(ConfigServerInfo.libgeoip_ipv4_database_file);
573 ConfigServerInfo.libgeoip_ipv4_database_file = xstrdup(yylval.string);
574
575 #ifdef HAVE_LIBGEOIP
576 if (GeoIPv4_ctx)
577 GeoIP_delete(GeoIPv4_ctx);
578 GeoIPv4_ctx = GeoIP_open(yylval.string, ConfigServerInfo.libgeoip_database_options);
579 #endif
580 }
581 };
582
583 serverinfo_libgeoip_ipv6_database_file: LIBGEOIP_IPV6_DATABASE_FILE '=' QSTRING ';'
584 {
585 if (conf_parser_ctx.pass == 2)
586 {
587 xfree(ConfigServerInfo.libgeoip_ipv6_database_file);
588 ConfigServerInfo.libgeoip_ipv6_database_file = xstrdup(yylval.string);
589
590 #ifdef HAVE_LIBGEOIP
591 if (GeoIPv6_ctx)
592 GeoIP_delete(GeoIPv6_ctx);
593 GeoIPv6_ctx = GeoIP_open(yylval.string, ConfigServerInfo.libgeoip_database_options);
594 #endif
595 }
596 };
597
598 serverinfo_name: NAME '=' QSTRING ';'
599 {
600 /* This isn't rehashable */
601 if (conf_parser_ctx.pass == 2 && !ConfigServerInfo.name)
602 {
603 if (valid_servname(yylval.string))
604 ConfigServerInfo.name = xstrdup(yylval.string);
605 else
606 {
607 conf_error_report("Ignoring serverinfo::name -- invalid name. Aborting.");
608 exit(EXIT_FAILURE);
609 }
610 }
611 };
612
613 serverinfo_sid: IRCD_SID '=' QSTRING ';'
614 {
615 /* This isn't rehashable */
616 if (conf_parser_ctx.pass == 2 && !ConfigServerInfo.sid)
617 {
618 if (valid_sid(yylval.string))
619 ConfigServerInfo.sid = xstrdup(yylval.string);
620 else
621 {
622 conf_error_report("Ignoring serverinfo::sid -- invalid SID. Aborting.");
623 exit(EXIT_FAILURE);
624 }
625 }
626 };
627
628 serverinfo_description: DESCRIPTION '=' QSTRING ';'
629 {
630 if (conf_parser_ctx.pass == 2)
631 {
632 xfree(ConfigServerInfo.description);
633 ConfigServerInfo.description = xstrdup(yylval.string);
634 strlcpy(me.info, ConfigServerInfo.description, sizeof(me.info));
635 }
636 };
637
638 serverinfo_network_name: NETWORK_NAME '=' QSTRING ';'
639 {
640 if (conf_parser_ctx.pass == 2)
641 {
642 char *p;
643
644 if ((p = strchr(yylval.string, ' ')))
645 *p = '\0';
646
647 xfree(ConfigServerInfo.network_name);
648 ConfigServerInfo.network_name = xstrdup(yylval.string);
649 }
650 };
651
652 serverinfo_network_desc: NETWORK_DESC '=' QSTRING ';'
653 {
654 if (conf_parser_ctx.pass != 2)
655 break;
656
657 xfree(ConfigServerInfo.network_desc);
658 ConfigServerInfo.network_desc = xstrdup(yylval.string);
659 };
660
661 serverinfo_vhost: VHOST '=' QSTRING ';'
662 {
663 if (conf_parser_ctx.pass == 2 && *yylval.string != '*')
664 {
665 struct addrinfo hints, *res;
666
667 memset(&hints, 0, sizeof(hints));
668
669 hints.ai_family = AF_UNSPEC;
670 hints.ai_socktype = SOCK_STREAM;
671 hints.ai_flags = AI_PASSIVE | AI_NUMERICHOST;
672
673 if (getaddrinfo(yylval.string, NULL, &hints, &res))
674 ilog(LOG_TYPE_IRCD, "Invalid netmask for server vhost(%s)", yylval.string);
675 else
676 {
677 assert(res);
678
679 memcpy(&ConfigServerInfo.ip, res->ai_addr, res->ai_addrlen);
680 ConfigServerInfo.ip.ss.ss_family = res->ai_family;
681 ConfigServerInfo.ip.ss_len = res->ai_addrlen;
682 freeaddrinfo(res);
683
684 ConfigServerInfo.specific_ipv4_vhost = 1;
685 }
686 }
687 };
688
689 serverinfo_vhost6: VHOST6 '=' QSTRING ';'
690 {
691 if (conf_parser_ctx.pass == 2 && *yylval.string != '*')
692 {
693 struct addrinfo hints, *res;
694
695 memset(&hints, 0, sizeof(hints));
696
697 hints.ai_family = AF_UNSPEC;
698 hints.ai_socktype = SOCK_STREAM;
699 hints.ai_flags = AI_PASSIVE | AI_NUMERICHOST;
700
701 if (getaddrinfo(yylval.string, NULL, &hints, &res))
702 ilog(LOG_TYPE_IRCD, "Invalid netmask for server vhost6(%s)", yylval.string);
703 else
704 {
705 assert(res);
706
707 memcpy(&ConfigServerInfo.ip6, res->ai_addr, res->ai_addrlen);
708 ConfigServerInfo.ip6.ss.ss_family = res->ai_family;
709 ConfigServerInfo.ip6.ss_len = res->ai_addrlen;
710 freeaddrinfo(res);
711
712 ConfigServerInfo.specific_ipv6_vhost = 1;
713 }
714 }
715 };
716
717 serverinfo_default_max_clients: DEFAULT_MAX_CLIENTS '=' NUMBER ';'
718 {
719 if (conf_parser_ctx.pass != 2)
720 break;
721
722 if ($3 < MAXCLIENTS_MIN)
723 {
724 char buf[IRCD_BUFSIZE] = "";
725
726 snprintf(buf, sizeof(buf), "MAXCLIENTS too low, setting to %d", MAXCLIENTS_MIN);
727 conf_error_report(buf);
728 ConfigServerInfo.default_max_clients = MAXCLIENTS_MIN;
729 }
730 else if ($3 > MAXCLIENTS_MAX)
731 {
732 char buf[IRCD_BUFSIZE] = "";
733
734 snprintf(buf, sizeof(buf), "MAXCLIENTS too high, setting to %d", MAXCLIENTS_MAX);
735 conf_error_report(buf);
736 ConfigServerInfo.default_max_clients = MAXCLIENTS_MAX;
737 }
738 else
739 ConfigServerInfo.default_max_clients = $3;
740 };
741
742 serverinfo_max_nick_length: MAX_NICK_LENGTH '=' NUMBER ';'
743 {
744 if (conf_parser_ctx.pass != 2)
745 break;
746
747 if ($3 < 9)
748 {
749 conf_error_report("max_nick_length too low, setting to 9");
750 ConfigServerInfo.max_nick_length = 9;
751 }
752 else if ($3 > NICKLEN)
753 {
754 char buf[IRCD_BUFSIZE] = "";
755
756 snprintf(buf, sizeof(buf), "max_nick_length too high, setting to %d", NICKLEN);
757 conf_error_report(buf);
758 ConfigServerInfo.max_nick_length = NICKLEN;
759 }
760 else
761 ConfigServerInfo.max_nick_length = $3;
762 };
763
764 serverinfo_max_topic_length: MAX_TOPIC_LENGTH '=' NUMBER ';'
765 {
766 if (conf_parser_ctx.pass != 2)
767 break;
768
769 if ($3 < 80)
770 {
771 conf_error_report("max_topic_length too low, setting to 80");
772 ConfigServerInfo.max_topic_length = 80;
773 }
774 else if ($3 > TOPICLEN)
775 {
776 char buf[IRCD_BUFSIZE] = "";
777
778 snprintf(buf, sizeof(buf), "max_topic_length too high, setting to %d", TOPICLEN);
779 conf_error_report(buf);
780 ConfigServerInfo.max_topic_length = TOPICLEN;
781 }
782 else
783 ConfigServerInfo.max_topic_length = $3;
784 };
785
786 serverinfo_hub: HUB '=' TBOOL ';'
787 {
788 if (conf_parser_ctx.pass == 2)
789 ConfigServerInfo.hub = yylval.number;
790 };
791
792
793 /***************************************************************************
794 * admin {} section
795 ***************************************************************************/
796 admin_entry: ADMIN '{' admin_items '}' ';' ;
797
798 admin_items: admin_items admin_item | admin_item;
799 admin_item: admin_name |
800 admin_description |
801 admin_email |
802 error ';' ;
803
804 admin_name: NAME '=' QSTRING ';'
805 {
806 if (conf_parser_ctx.pass != 2)
807 break;
808
809 xfree(ConfigAdminInfo.name);
810 ConfigAdminInfo.name = xstrdup(yylval.string);
811 };
812
813 admin_email: EMAIL '=' QSTRING ';'
814 {
815 if (conf_parser_ctx.pass != 2)
816 break;
817
818 xfree(ConfigAdminInfo.email);
819 ConfigAdminInfo.email = xstrdup(yylval.string);
820 };
821
822 admin_description: DESCRIPTION '=' QSTRING ';'
823 {
824 if (conf_parser_ctx.pass != 2)
825 break;
826
827 xfree(ConfigAdminInfo.description);
828 ConfigAdminInfo.description = xstrdup(yylval.string);
829 };
830
831
832 /***************************************************************************
833 * motd {} section
834 ***************************************************************************/
835 motd_entry: MOTD
836 {
837 if (conf_parser_ctx.pass == 2)
838 reset_block_state();
839 } '{' motd_items '}' ';'
840 {
841 dlink_node *node = NULL;
842
843 if (conf_parser_ctx.pass != 2)
844 break;
845
846 if (!block_state.file.buf[0])
847 break;
848
849 DLINK_FOREACH(node, block_state.mask.list.head)
850 motd_add(node->data, block_state.file.buf);
851 };
852
853 motd_items: motd_items motd_item | motd_item;
854 motd_item: motd_mask | motd_file | error ';' ;
855
856 motd_mask: MASK '=' QSTRING ';'
857 {
858 if (conf_parser_ctx.pass == 2)
859 dlinkAdd(xstrdup(yylval.string), make_dlink_node(), &block_state.mask.list);
860 };
861
862 motd_file: T_FILE '=' QSTRING ';'
863 {
864 if (conf_parser_ctx.pass == 2)
865 strlcpy(block_state.file.buf, yylval.string, sizeof(block_state.file.buf));
866 };
867
868
869 /***************************************************************************
870 * pseudo {} section
871 ***************************************************************************/
872 pseudo_entry: T_PSEUDO
873 {
874 if (conf_parser_ctx.pass == 2)
875 reset_block_state();
876 } '{' pseudo_items '}' ';'
877 {
878 if (conf_parser_ctx.pass != 2)
879 break;
880
881 if (!block_state.command.buf[0] ||
882 !block_state.name.buf[0] ||
883 !block_state.nick.buf[0] ||
884 !block_state.host.buf[0])
885 break;
886
887 pseudo_register(block_state.name.buf, block_state.nick.buf, block_state.host.buf,
888 block_state.prepend.buf, block_state.command.buf);
889 };
890
891 pseudo_items: pseudo_items pseudo_item | pseudo_item;
892 pseudo_item: pseudo_command | pseudo_prepend | pseudo_name | pseudo_target | error ';' ;
893
894 pseudo_command: T_COMMAND '=' QSTRING ';'
895 {
896 if (conf_parser_ctx.pass == 2)
897 strlcpy(block_state.command.buf, yylval.string, sizeof(block_state.command.buf));
898 };
899
900 pseudo_name: NAME '=' QSTRING ';'
901 {
902 if (conf_parser_ctx.pass == 2)
903 strlcpy(block_state.name.buf, yylval.string, sizeof(block_state.name.buf));
904 };
905
906 pseudo_prepend: T_PREPEND '=' QSTRING ';'
907 {
908 if (conf_parser_ctx.pass == 2)
909 strlcpy(block_state.prepend.buf, yylval.string, sizeof(block_state.prepend.buf));
910 };
911
912 pseudo_target: T_TARGET '=' QSTRING ';'
913 {
914 if (conf_parser_ctx.pass == 2)
915 {
916 struct split_nuh_item nuh;
917
918 nuh.nuhmask = yylval.string;
919 nuh.nickptr = NULL;
920 nuh.userptr = block_state.nick.buf;
921 nuh.hostptr = block_state.host.buf;
922 nuh.nicksize = 0;
923 nuh.usersize = sizeof(block_state.nick.buf);
924 nuh.hostsize = sizeof(block_state.host.buf);
925
926 split_nuh(&nuh);
927 }
928 };
929
930
931 /***************************************************************************
932 * log {} section
933 ***************************************************************************/
934 logging_entry: T_LOG '{' logging_items '}' ';' ;
935 logging_items: logging_items logging_item | logging_item ;
936
937 logging_item: logging_use_logging | logging_file_entry |
938 error ';' ;
939
940 logging_use_logging: USE_LOGGING '=' TBOOL ';'
941 {
942 if (conf_parser_ctx.pass == 2)
943 ConfigLog.use_logging = yylval.number;
944 };
945
946 logging_file_entry:
947 {
948 if (conf_parser_ctx.pass == 2)
949 reset_block_state();
950 } T_FILE '{' logging_file_items '}' ';'
951 {
952 if (conf_parser_ctx.pass != 2)
953 break;
954
955 if (block_state.type.value && block_state.file.buf[0])
956 log_set_file(block_state.type.value, block_state.size.value,
957 block_state.file.buf);
958 };
959
960 logging_file_items: logging_file_items logging_file_item |
961 logging_file_item ;
962
963 logging_file_item: logging_file_name | logging_file_type |
964 logging_file_size | error ';' ;
965
966 logging_file_name: NAME '=' QSTRING ';'
967 {
968 if (conf_parser_ctx.pass != 2)
969 break;
970
971 strlcpy(block_state.file.buf, yylval.string, sizeof(block_state.file.buf));
972 }
973
974 logging_file_size: T_SIZE '=' sizespec ';'
975 {
976 block_state.size.value = $3;
977 } | T_SIZE '=' T_UNLIMITED ';'
978 {
979 block_state.size.value = 0;
980 };
981
982 logging_file_type: TYPE
983 {
984 if (conf_parser_ctx.pass == 2)
985 block_state.type.value = 0;
986 } '=' logging_file_type_items ';' ;
987
988 logging_file_type_items: logging_file_type_items ',' logging_file_type_item | logging_file_type_item;
989 logging_file_type_item: USER
990 {
991 if (conf_parser_ctx.pass == 2)
992 block_state.type.value = LOG_TYPE_USER;
993 } | OPERATOR
994 {
995 if (conf_parser_ctx.pass == 2)
996 block_state.type.value = LOG_TYPE_OPER;
997 } | XLINE
998 {
999 if (conf_parser_ctx.pass == 2)
1000 block_state.type.value = LOG_TYPE_XLINE;
1001 } | RESV
1002 {
1003 if (conf_parser_ctx.pass == 2)
1004 block_state.type.value = LOG_TYPE_RESV;
1005 } | T_DLINE
1006 {
1007 if (conf_parser_ctx.pass == 2)
1008 block_state.type.value = LOG_TYPE_DLINE;
1009 } | KLINE
1010 {
1011 if (conf_parser_ctx.pass == 2)
1012 block_state.type.value = LOG_TYPE_KLINE;
1013 } | KILL
1014 {
1015 if (conf_parser_ctx.pass == 2)
1016 block_state.type.value = LOG_TYPE_KILL;
1017 } | T_DEBUG
1018 {
1019 if (conf_parser_ctx.pass == 2)
1020 block_state.type.value = LOG_TYPE_DEBUG;
1021 };
1022
1023
1024 /***************************************************************************
1025 * operator {} section
1026 ***************************************************************************/
1027 oper_entry: OPERATOR
1028 {
1029 if (conf_parser_ctx.pass != 2)
1030 break;
1031
1032 reset_block_state();
1033 block_state.flags.value |= CONF_FLAGS_ENCRYPTED;
1034 } '{' oper_items '}' ';'
1035 {
1036 dlink_node *node = NULL;
1037
1038 if (conf_parser_ctx.pass != 2)
1039 break;
1040
1041 if (!block_state.name.buf[0])
1042 break;
1043
1044 if (!block_state.rpass.buf[0])
1045 break;
1046
1047 DLINK_FOREACH(node, block_state.mask.list.head)
1048 {
1049 struct MaskItem *conf = NULL;
1050 struct split_nuh_item nuh;
1051 char *s = node->data;
1052
1053 if (EmptyString(s))
1054 continue;
1055
1056 nuh.nuhmask = s;
1057 nuh.nickptr = NULL;
1058 nuh.userptr = block_state.user.buf;
1059 nuh.hostptr = block_state.host.buf;
1060 nuh.nicksize = 0;
1061 nuh.usersize = sizeof(block_state.user.buf);
1062 nuh.hostsize = sizeof(block_state.host.buf);
1063 split_nuh(&nuh);
1064
1065 conf = conf_make(CONF_OPER);
1066 conf->name = xstrdup(block_state.name.buf);
1067 conf->user = xstrdup(block_state.user.buf);
1068 conf->host = xstrdup(block_state.host.buf);
1069
1070 if (block_state.cert.buf[0])
1071 conf->certfp = xstrdup(block_state.cert.buf);
1072
1073 if (block_state.rpass.buf[0])
1074 conf->passwd = xstrdup(block_state.rpass.buf);
1075
1076 if (block_state.whois.buf[0])
1077 conf->whois = xstrdup(block_state.whois.buf);
1078
1079 conf->flags = block_state.flags.value;
1080 conf->modes = block_state.modes.value;
1081 conf->port = block_state.port.value;
1082 conf->htype = parse_netmask(conf->host, &conf->addr, &conf->bits);
1083
1084 conf_add_class_to_conf(conf, block_state.class.buf);
1085 }
1086 };
1087
1088 oper_items: oper_items oper_item | oper_item;
1089 oper_item: oper_name |
1090 oper_user |
1091 oper_password |
1092 oper_whois |
1093 oper_umodes |
1094 oper_class |
1095 oper_encrypted |
1096 oper_ssl_certificate_fingerprint |
1097 oper_ssl_connection_required |
1098 oper_flags |
1099 error ';' ;
1100
1101 oper_name: NAME '=' QSTRING ';'
1102 {
1103 if (conf_parser_ctx.pass == 2)
1104 strlcpy(block_state.name.buf, yylval.string, sizeof(block_state.name.buf));
1105 };
1106
1107 oper_user: USER '=' QSTRING ';'
1108 {
1109 if (conf_parser_ctx.pass == 2)
1110 dlinkAdd(xstrdup(yylval.string), make_dlink_node(), &block_state.mask.list);
1111 };
1112
1113 oper_password: PASSWORD '=' QSTRING ';'
1114 {
1115 if (conf_parser_ctx.pass == 2)
1116 strlcpy(block_state.rpass.buf, yylval.string, sizeof(block_state.rpass.buf));
1117 };
1118
1119 oper_whois: WHOIS '=' QSTRING ';'
1120 {
1121 if (conf_parser_ctx.pass == 2)
1122 strlcpy(block_state.whois.buf, yylval.string, sizeof(block_state.whois.buf));
1123 };
1124
1125 oper_encrypted: ENCRYPTED '=' TBOOL ';'
1126 {
1127 if (conf_parser_ctx.pass != 2)
1128 break;
1129
1130 if (yylval.number)
1131 block_state.flags.value |= CONF_FLAGS_ENCRYPTED;
1132 else
1133 block_state.flags.value &= ~CONF_FLAGS_ENCRYPTED;
1134 };
1135
1136 oper_ssl_certificate_fingerprint: SSL_CERTIFICATE_FINGERPRINT '=' QSTRING ';'
1137 {
1138 if (conf_parser_ctx.pass == 2)
1139 strlcpy(block_state.cert.buf, yylval.string, sizeof(block_state.cert.buf));
1140 };
1141
1142 oper_ssl_connection_required: SSL_CONNECTION_REQUIRED '=' TBOOL ';'
1143 {
1144 if (conf_parser_ctx.pass != 2)
1145 break;
1146
1147 if (yylval.number)
1148 block_state.flags.value |= CONF_FLAGS_SSL;
1149 else
1150 block_state.flags.value &= ~CONF_FLAGS_SSL;
1151 };
1152
1153 oper_class: CLASS '=' QSTRING ';'
1154 {
1155 if (conf_parser_ctx.pass == 2)
1156 strlcpy(block_state.class.buf, yylval.string, sizeof(block_state.class.buf));
1157 };
1158
1159 oper_umodes: T_UMODES
1160 {
1161 if (conf_parser_ctx.pass == 2)
1162 block_state.modes.value = 0;
1163 } '=' oper_umodes_items ';' ;
1164
1165 oper_umodes_items: oper_umodes_items ',' oper_umodes_item | oper_umodes_item;
1166 oper_umodes_item: T_BOTS
1167 {
1168 if (conf_parser_ctx.pass == 2)
1169 block_state.modes.value |= UMODE_BOTS;
1170 } | T_CCONN
1171 {
1172 if (conf_parser_ctx.pass == 2)
1173 block_state.modes.value |= UMODE_CCONN;
1174 } | T_DEAF
1175 {
1176 if (conf_parser_ctx.pass == 2)
1177 block_state.modes.value |= UMODE_DEAF;
1178 } | T_DEBUG
1179 {
1180 if (conf_parser_ctx.pass == 2)
1181 block_state.modes.value |= UMODE_DEBUG;
1182 } | T_FULL
1183 {
1184 if (conf_parser_ctx.pass == 2)
1185 block_state.modes.value |= UMODE_FULL;
1186 } | HIDDEN
1187 {
1188 if (conf_parser_ctx.pass == 2)
1189 block_state.modes.value |= UMODE_HIDDEN;
1190 } | HIDE_CHANS
1191 {
1192 if (conf_parser_ctx.pass == 2)
1193 block_state.modes.value |= UMODE_HIDECHANS;
1194 } | HIDE_IDLE
1195 {
1196 if (conf_parser_ctx.pass == 2)
1197 block_state.modes.value |= UMODE_HIDEIDLE;
1198 } | T_SKILL
1199 {
1200 if (conf_parser_ctx.pass == 2)
1201 block_state.modes.value |= UMODE_SKILL;
1202 } | T_NCHANGE
1203 {
1204 if (conf_parser_ctx.pass == 2)
1205 block_state.modes.value |= UMODE_NCHANGE;
1206 } | T_REJ
1207 {
1208 if (conf_parser_ctx.pass == 2)
1209 block_state.modes.value |= UMODE_REJ;
1210 } | T_UNAUTH
1211 {
1212 if (conf_parser_ctx.pass == 2)
1213 block_state.modes.value |= UMODE_UNAUTH;
1214 } | T_SPY
1215 {
1216 if (conf_parser_ctx.pass == 2)
1217 block_state.modes.value |= UMODE_SPY;
1218 } | T_EXTERNAL
1219 {
1220 if (conf_parser_ctx.pass == 2)
1221 block_state.modes.value |= UMODE_EXTERNAL;
1222 } | T_SERVNOTICE
1223 {
1224 if (conf_parser_ctx.pass == 2)
1225 block_state.modes.value |= UMODE_SERVNOTICE;
1226 } | T_INVISIBLE
1227 {
1228 if (conf_parser_ctx.pass == 2)
1229 block_state.modes.value |= UMODE_INVISIBLE;
1230 } | T_WALLOP
1231 {
1232 if (conf_parser_ctx.pass == 2)
1233 block_state.modes.value |= UMODE_WALLOP;
1234 } | T_SOFTCALLERID
1235 {
1236 if (conf_parser_ctx.pass == 2)
1237 block_state.modes.value |= UMODE_SOFTCALLERID;
1238 } | T_CALLERID
1239 {
1240 if (conf_parser_ctx.pass == 2)
1241 block_state.modes.value |= UMODE_CALLERID;
1242 } | T_LOCOPS
1243 {
1244 if (conf_parser_ctx.pass == 2)
1245 block_state.modes.value |= UMODE_LOCOPS;
1246 } | T_NONONREG
1247 {
1248 if (conf_parser_ctx.pass == 2)
1249 block_state.modes.value |= UMODE_REGONLY;
1250 } | T_FARCONNECT
1251 {
1252 if (conf_parser_ctx.pass == 2)
1253 block_state.modes.value |= UMODE_FARCONNECT;
1254 };
1255
1256 oper_flags: IRCD_FLAGS
1257 {
1258 if (conf_parser_ctx.pass == 2)
1259 block_state.port.value = 0;
1260 } '=' oper_flags_items ';';
1261
1262 oper_flags_items: oper_flags_items ',' oper_flags_item | oper_flags_item;
1263 oper_flags_item: KILL ':' REMOTE
1264 {
1265 if (conf_parser_ctx.pass == 2)
1266 block_state.port.value |= OPER_FLAG_KILL_REMOTE;
1267 } | KILL
1268 {
1269 if (conf_parser_ctx.pass == 2)
1270 block_state.port.value |= OPER_FLAG_KILL;
1271 } | CONNECT ':' REMOTE
1272 {
1273 if (conf_parser_ctx.pass == 2)
1274 block_state.port.value |= OPER_FLAG_CONNECT_REMOTE;
1275 } | CONNECT
1276 {
1277 if (conf_parser_ctx.pass == 2)
1278 block_state.port.value |= OPER_FLAG_CONNECT;
1279 } | SQUIT ':' REMOTE
1280 {
1281 if (conf_parser_ctx.pass == 2)
1282 block_state.port.value |= OPER_FLAG_SQUIT_REMOTE;
1283 } | SQUIT
1284 {
1285 if (conf_parser_ctx.pass == 2)
1286 block_state.port.value |= OPER_FLAG_SQUIT;
1287 } | KLINE
1288 {
1289 if (conf_parser_ctx.pass == 2)
1290 block_state.port.value |= OPER_FLAG_KLINE;
1291 } | UNKLINE
1292 {
1293 if (conf_parser_ctx.pass == 2)
1294 block_state.port.value |= OPER_FLAG_UNKLINE;
1295 } | T_DLINE
1296 {
1297 if (conf_parser_ctx.pass == 2)
1298 block_state.port.value |= OPER_FLAG_DLINE;
1299 } | T_UNDLINE
1300 {
1301 if (conf_parser_ctx.pass == 2)
1302 block_state.port.value |= OPER_FLAG_UNDLINE;
1303 } | XLINE
1304 {
1305 if (conf_parser_ctx.pass == 2)
1306 block_state.port.value |= OPER_FLAG_XLINE;
1307 } | T_UNXLINE
1308 {
1309 if (conf_parser_ctx.pass == 2)
1310 block_state.port.value |= OPER_FLAG_UNXLINE;
1311 } | DIE
1312 {
1313 if (conf_parser_ctx.pass == 2)
1314 block_state.port.value |= OPER_FLAG_DIE;
1315 } | T_RESTART
1316 {
1317 if (conf_parser_ctx.pass == 2)
1318 block_state.port.value |= OPER_FLAG_RESTART;
1319 } | REHASH ':' REMOTE
1320 {
1321 if (conf_parser_ctx.pass == 2)
1322 block_state.port.value |= OPER_FLAG_REHASH_REMOTE;
1323 } | REHASH
1324 {
1325 if (conf_parser_ctx.pass == 2)
1326 block_state.port.value |= OPER_FLAG_REHASH;
1327 } | ADMIN
1328 {
1329 if (conf_parser_ctx.pass == 2)
1330 block_state.port.value |= OPER_FLAG_ADMIN;
1331 } | T_GLOBOPS
1332 {
1333 if (conf_parser_ctx.pass == 2)
1334 block_state.port.value |= OPER_FLAG_GLOBOPS;
1335 } | T_WALLOPS
1336 {
1337 if (conf_parser_ctx.pass == 2)
1338 block_state.port.value |= OPER_FLAG_WALLOPS;
1339 } | T_LOCOPS
1340 {
1341 if (conf_parser_ctx.pass == 2)
1342 block_state.port.value |= OPER_FLAG_LOCOPS;
1343 } | REMOTEBAN
1344 {
1345 if (conf_parser_ctx.pass == 2)
1346 block_state.port.value |= OPER_FLAG_REMOTEBAN;
1347 } | T_SET
1348 {
1349 if (conf_parser_ctx.pass == 2)
1350 block_state.port.value |= OPER_FLAG_SET;
1351 } | MODULE
1352 {
1353 if (conf_parser_ctx.pass == 2)
1354 block_state.port.value |= OPER_FLAG_MODULE;
1355 } | T_OPME
1356 {
1357 if (conf_parser_ctx.pass == 2)
1358 block_state.port.value |= OPER_FLAG_OPME;
1359 } | NICK ':' RESV
1360 {
1361 if (conf_parser_ctx.pass == 2)
1362 block_state.port.value |= OPER_FLAG_NICK_RESV;
1363 } | JOIN ':' RESV
1364 {
1365 if (conf_parser_ctx.pass == 2)
1366 block_state.port.value |= OPER_FLAG_JOIN_RESV;
1367 } | RESV
1368 {
1369 if (conf_parser_ctx.pass == 2)
1370 block_state.port.value |= OPER_FLAG_RESV;
1371 } | T_UNRESV
1372 {
1373 if (conf_parser_ctx.pass == 2)
1374 block_state.port.value |= OPER_FLAG_UNRESV;
1375 } | CLOSE
1376 {
1377 if (conf_parser_ctx.pass == 2)
1378 block_state.port.value |= OPER_FLAG_CLOSE;
1379 };
1380
1381
1382 /***************************************************************************
1383 * class {} section
1384 ***************************************************************************/
1385 class_entry: CLASS
1386 {
1387 if (conf_parser_ctx.pass != 1)
1388 break;
1389
1390 reset_block_state();
1391
1392 block_state.ping_freq.value = DEFAULT_PINGFREQUENCY;
1393 block_state.con_freq.value = DEFAULT_CONNECTFREQUENCY;
1394 block_state.max_total.value = MAXIMUM_LINKS_DEFAULT;
1395 block_state.max_sendq.value = DEFAULT_SENDQ;
1396 block_state.max_recvq.value = DEFAULT_RECVQ;
1397 } '{' class_items '}' ';'
1398 {
1399 struct ClassItem *class = NULL;
1400
1401 if (conf_parser_ctx.pass != 1)
1402 break;
1403
1404 if (!block_state.class.buf[0])
1405 break;
1406
1407 if (!(class = class_find(block_state.class.buf, 0)))
1408 class = class_make();
1409
1410 class->active = 1;
1411 xfree(class->name);
1412 class->name = xstrdup(block_state.class.buf);
1413 class->ping_freq = block_state.ping_freq.value;
1414 class->max_perip = block_state.max_perip.value;
1415 class->con_freq = block_state.con_freq.value;
1416 class->max_total = block_state.max_total.value;
1417 class->max_global = block_state.max_global.value;
1418 class->max_local = block_state.max_local.value;
1419 class->max_sendq = block_state.max_sendq.value;
1420 class->max_recvq = block_state.max_recvq.value;
1421 class->max_channels = block_state.max_channels.value;
1422
1423 if (block_state.min_idle.value > block_state.max_idle.value)
1424 {
1425 block_state.min_idle.value = 0;
1426 block_state.max_idle.value = 0;
1427 block_state.flags.value &= ~CLASS_FLAGS_FAKE_IDLE;
1428 }
1429
1430 class->flags = block_state.flags.value;
1431 class->min_idle = block_state.min_idle.value;
1432 class->max_idle = block_state.max_idle.value;
1433
1434 rebuild_cidr_list(class);
1435
1436 class->cidr_bitlen_ipv4 = block_state.cidr_bitlen_ipv4.value;
1437 class->cidr_bitlen_ipv6 = block_state.cidr_bitlen_ipv6.value;
1438 class->number_per_cidr = block_state.number_per_cidr.value;
1439 };
1440
1441 class_items: class_items class_item | class_item;
1442 class_item: class_name |
1443 class_cidr_bitlen_ipv4 |
1444 class_cidr_bitlen_ipv6 |
1445 class_ping_time |
1446 class_number_per_cidr |
1447 class_number_per_ip |
1448 class_connectfreq |
1449 class_max_channels |
1450 class_max_number |
1451 class_max_global |
1452 class_max_local |
1453 class_sendq |
1454 class_recvq |
1455 class_min_idle |
1456 class_max_idle |
1457 class_flags |
1458 error ';' ;
1459
1460 class_name: NAME '=' QSTRING ';'
1461 {
1462 if (conf_parser_ctx.pass == 1)
1463 strlcpy(block_state.class.buf, yylval.string, sizeof(block_state.class.buf));
1464 };
1465
1466 class_ping_time: PING_TIME '=' timespec ';'
1467 {
1468 if (conf_parser_ctx.pass == 1)
1469 block_state.ping_freq.value = $3;
1470 };
1471
1472 class_number_per_ip: NUMBER_PER_IP '=' NUMBER ';'
1473 {
1474 if (conf_parser_ctx.pass == 1)
1475 block_state.max_perip.value = $3;
1476 };
1477
1478 class_connectfreq: CONNECTFREQ '=' timespec ';'
1479 {
1480 if (conf_parser_ctx.pass == 1)
1481 block_state.con_freq.value = $3;
1482 };
1483
1484 class_max_channels: MAX_CHANNELS '=' NUMBER ';'
1485 {
1486 if (conf_parser_ctx.pass == 1)
1487 block_state.max_channels.value = $3;
1488 };
1489
1490 class_max_number: MAX_NUMBER '=' NUMBER ';'
1491 {
1492 if (conf_parser_ctx.pass == 1)
1493 block_state.max_total.value = $3;
1494 };
1495
1496 class_max_global: MAX_GLOBAL '=' NUMBER ';'
1497 {
1498 if (conf_parser_ctx.pass == 1)
1499 block_state.max_global.value = $3;
1500 };
1501
1502 class_max_local: MAX_LOCAL '=' NUMBER ';'
1503 {
1504 if (conf_parser_ctx.pass == 1)
1505 block_state.max_local.value = $3;
1506 };
1507
1508 class_sendq: SENDQ '=' sizespec ';'
1509 {
1510 if (conf_parser_ctx.pass == 1)
1511 block_state.max_sendq.value = $3;
1512 };
1513
1514 class_recvq: T_RECVQ '=' sizespec ';'
1515 {
1516 if (conf_parser_ctx.pass == 1)
1517 if ($3 >= CLIENT_FLOOD_MIN && $3 <= CLIENT_FLOOD_MAX)
1518 block_state.max_recvq.value = $3;
1519 };
1520
1521 class_cidr_bitlen_ipv4: CIDR_BITLEN_IPV4 '=' NUMBER ';'
1522 {
1523 if (conf_parser_ctx.pass == 1)
1524 block_state.cidr_bitlen_ipv4.value = $3 > 32 ? 32 : $3;
1525 };
1526
1527 class_cidr_bitlen_ipv6: CIDR_BITLEN_IPV6 '=' NUMBER ';'
1528 {
1529 if (conf_parser_ctx.pass == 1)
1530 block_state.cidr_bitlen_ipv6.value = $3 > 128 ? 128 : $3;
1531 };
1532
1533 class_number_per_cidr: NUMBER_PER_CIDR '=' NUMBER ';'
1534 {
1535 if (conf_parser_ctx.pass == 1)
1536 block_state.number_per_cidr.value = $3;
1537 };
1538
1539 class_min_idle: MIN_IDLE '=' timespec ';'
1540 {
1541 if (conf_parser_ctx.pass != 1)
1542 break;
1543
1544 block_state.min_idle.value = $3;
1545 block_state.flags.value |= CLASS_FLAGS_FAKE_IDLE;
1546 };
1547
1548 class_max_idle: MAX_IDLE '=' timespec ';'
1549 {
1550 if (conf_parser_ctx.pass != 1)
1551 break;
1552
1553 block_state.max_idle.value = $3;
1554 block_state.flags.value |= CLASS_FLAGS_FAKE_IDLE;
1555 };
1556
1557 class_flags: IRCD_FLAGS
1558 {
1559 if (conf_parser_ctx.pass == 1)
1560 block_state.flags.value &= CLASS_FLAGS_FAKE_IDLE;
1561 } '=' class_flags_items ';';
1562
1563 class_flags_items: class_flags_items ',' class_flags_item | class_flags_item;
1564 class_flags_item: RANDOM_IDLE
1565 {
1566 if (conf_parser_ctx.pass == 1)
1567 block_state.flags.value |= CLASS_FLAGS_RANDOM_IDLE;
1568 } | HIDE_IDLE_FROM_OPERS
1569 {
1570 if (conf_parser_ctx.pass == 1)
1571 block_state.flags.value |= CLASS_FLAGS_HIDE_IDLE_FROM_OPERS;
1572 };
1573
1574
1575 /***************************************************************************
1576 * listen {} section
1577 ***************************************************************************/
1578 listen_entry: LISTEN
1579 {
1580 if (conf_parser_ctx.pass == 2)
1581 reset_block_state();
1582 } '{' listen_items '}' ';';
1583
1584 listen_flags: IRCD_FLAGS
1585 {
1586 block_state.flags.value = 0;
1587 } '=' listen_flags_items ';';
1588
1589 listen_flags_items: listen_flags_items ',' listen_flags_item | listen_flags_item;
1590 listen_flags_item: T_SSL
1591 {
1592 if (conf_parser_ctx.pass == 2)
1593 block_state.flags.value |= LISTENER_SSL;
1594 } | HIDDEN
1595 {
1596 if (conf_parser_ctx.pass == 2)
1597 block_state.flags.value |= LISTENER_HIDDEN;
1598 } | T_SERVER
1599 {
1600 if (conf_parser_ctx.pass == 2)
1601 block_state.flags.value |= LISTENER_SERVER;
1602 };
1603
1604 listen_items: listen_items listen_item | listen_item;
1605 listen_item: listen_port | listen_flags | listen_address | listen_host | error ';';
1606
1607 listen_port: PORT '=' port_items { block_state.flags.value = 0; } ';';
1608
1609 port_items: port_items ',' port_item | port_item;
1610
1611 port_item: NUMBER
1612 {
1613 if (conf_parser_ctx.pass == 2)
1614 {
1615 #ifndef HAVE_TLS
1616 if (block_state.flags.value & LISTENER_SSL)
1617 {
1618 conf_error_report("TLS not available - port closed");
1619 break;
1620 }
1621 #endif
1622 listener_add($1, block_state.addr.buf, block_state.flags.value);
1623 }
1624 } | NUMBER TWODOTS NUMBER
1625 {
1626 if (conf_parser_ctx.pass == 2)
1627 {
1628 #ifndef HAVE_TLS
1629 if (block_state.flags.value & LISTENER_SSL)
1630 {
1631 conf_error_report("TLS not available - port closed");
1632 break;
1633 }
1634 #endif
1635
1636 for (int i = $1; i <= $3; ++i)
1637 listener_add(i, block_state.addr.buf, block_state.flags.value);
1638 }
1639 };
1640
1641 listen_address: IP '=' QSTRING ';'
1642 {
1643 if (conf_parser_ctx.pass == 2)
1644 strlcpy(block_state.addr.buf, yylval.string, sizeof(block_state.addr.buf));
1645 };
1646
1647 listen_host: HOST '=' QSTRING ';'
1648 {
1649 if (conf_parser_ctx.pass == 2)
1650 strlcpy(block_state.addr.buf, yylval.string, sizeof(block_state.addr.buf));
1651 };
1652
1653
1654 /***************************************************************************
1655 * auth {} section
1656 ***************************************************************************/
1657 auth_entry: IRCD_AUTH
1658 {
1659 if (conf_parser_ctx.pass == 2)
1660 reset_block_state();
1661 } '{' auth_items '}' ';'
1662 {
1663 dlink_node *node = NULL;
1664
1665 if (conf_parser_ctx.pass != 2)
1666 break;
1667
1668 DLINK_FOREACH(node, block_state.mask.list.head)
1669 {
1670 struct MaskItem *conf = NULL;
1671 struct split_nuh_item nuh;
1672 char *s = node->data;
1673
1674 if (EmptyString(s))
1675 continue;
1676
1677 nuh.nuhmask = s;
1678 nuh.nickptr = NULL;
1679 nuh.userptr = block_state.user.buf;
1680 nuh.hostptr = block_state.host.buf;
1681 nuh.nicksize = 0;
1682 nuh.usersize = sizeof(block_state.user.buf);
1683 nuh.hostsize = sizeof(block_state.host.buf);
1684 split_nuh(&nuh);
1685
1686 conf = conf_make(CONF_CLIENT);
1687 conf->user = xstrdup(block_state.user.buf);
1688 conf->host = xstrdup(block_state.host.buf);
1689
1690 if (block_state.rpass.buf[0])
1691 conf->passwd = xstrdup(block_state.rpass.buf);
1692 if (block_state.name.buf[0])
1693 conf->name = xstrdup(block_state.name.buf);
1694
1695 conf->flags = block_state.flags.value;
1696 conf->port = block_state.port.value;
1697
1698 conf_add_class_to_conf(conf, block_state.class.buf);
1699 add_conf_by_address(CONF_CLIENT, conf);
1700 }
1701 };
1702
1703 auth_items: auth_items auth_item | auth_item;
1704 auth_item: auth_user |
1705 auth_passwd |
1706 auth_class |
1707 auth_flags |
1708 auth_spoof |
1709 auth_redir_serv |
1710 auth_redir_port |
1711 auth_encrypted |
1712 error ';' ;
1713
1714 auth_user: USER '=' QSTRING ';'
1715 {
1716 if (conf_parser_ctx.pass == 2)
1717 dlinkAdd(xstrdup(yylval.string), make_dlink_node(), &block_state.mask.list);
1718 };
1719
1720 auth_passwd: PASSWORD '=' QSTRING ';'
1721 {
1722 if (conf_parser_ctx.pass == 2)
1723 strlcpy(block_state.rpass.buf, yylval.string, sizeof(block_state.rpass.buf));
1724 };
1725
1726 auth_class: CLASS '=' QSTRING ';'
1727 {
1728 if (conf_parser_ctx.pass == 2)
1729 strlcpy(block_state.class.buf, yylval.string, sizeof(block_state.class.buf));
1730 };
1731
1732 auth_encrypted: ENCRYPTED '=' TBOOL ';'
1733 {
1734 if (conf_parser_ctx.pass == 2)
1735 {
1736 if (yylval.number)
1737 block_state.flags.value |= CONF_FLAGS_ENCRYPTED;
1738 else
1739 block_state.flags.value &= ~CONF_FLAGS_ENCRYPTED;
1740 }
1741 };
1742
1743 auth_flags: IRCD_FLAGS
1744 {
1745 if (conf_parser_ctx.pass == 2)
1746 block_state.flags.value &= (CONF_FLAGS_ENCRYPTED | CONF_FLAGS_SPOOF_IP);
1747 } '=' auth_flags_items ';';
1748
1749 auth_flags_items: auth_flags_items ',' auth_flags_item | auth_flags_item;
1750 auth_flags_item: SPOOF_NOTICE
1751 {
1752 if (conf_parser_ctx.pass == 2)
1753 block_state.flags.value |= CONF_FLAGS_SPOOF_NOTICE;
1754 } | EXCEED_LIMIT
1755 {
1756 if (conf_parser_ctx.pass == 2)
1757 block_state.flags.value |= CONF_FLAGS_NOLIMIT;
1758 } | KLINE_EXEMPT
1759 {
1760 if (conf_parser_ctx.pass == 2)
1761 block_state.flags.value |= CONF_FLAGS_EXEMPTKLINE;
1762 } | XLINE_EXEMPT
1763 {
1764 if (conf_parser_ctx.pass == 2)
1765 block_state.flags.value |= CONF_FLAGS_EXEMPTXLINE;
1766 } | NEED_IDENT
1767 {
1768 if (conf_parser_ctx.pass == 2)
1769 block_state.flags.value |= CONF_FLAGS_NEED_IDENTD;
1770 } | CAN_FLOOD
1771 {
1772 if (conf_parser_ctx.pass == 2)
1773 block_state.flags.value |= CONF_FLAGS_CAN_FLOOD;
1774 } | NO_TILDE
1775 {
1776 if (conf_parser_ctx.pass == 2)
1777 block_state.flags.value |= CONF_FLAGS_NO_TILDE;
1778 } | RESV_EXEMPT
1779 {
1780 if (conf_parser_ctx.pass == 2)
1781 block_state.flags.value |= CONF_FLAGS_EXEMPTRESV;
1782 } | T_WEBIRC
1783 {
1784 if (conf_parser_ctx.pass == 2)
1785 block_state.flags.value |= CONF_FLAGS_WEBIRC;
1786 } | NEED_PASSWORD
1787 {
1788 if (conf_parser_ctx.pass == 2)
1789 block_state.flags.value |= CONF_FLAGS_NEED_PASSWORD;
1790 };
1791
1792 auth_spoof: SPOOF '=' QSTRING ';'
1793 {
1794 if (conf_parser_ctx.pass != 2)
1795 break;
1796
1797 if (valid_hostname(yylval.string))
1798 {
1799 strlcpy(block_state.name.buf, yylval.string, sizeof(block_state.name.buf));
1800 block_state.flags.value |= CONF_FLAGS_SPOOF_IP;
1801 }
1802 else
1803 ilog(LOG_TYPE_IRCD, "Spoof either is too long or contains invalid characters. Ignoring it.");
1804 };
1805
1806 auth_redir_serv: REDIRSERV '=' QSTRING ';'
1807 {
1808 if (conf_parser_ctx.pass != 2)
1809 break;
1810
1811 strlcpy(block_state.name.buf, yylval.string, sizeof(block_state.name.buf));
1812 block_state.flags.value |= CONF_FLAGS_REDIR;
1813 };
1814
1815 auth_redir_port: REDIRPORT '=' NUMBER ';'
1816 {
1817 if (conf_parser_ctx.pass != 2)
1818 break;
1819
1820 block_state.flags.value |= CONF_FLAGS_REDIR;
1821 block_state.port.value = $3;
1822 };
1823
1824
1825 /***************************************************************************
1826 * resv {} section
1827 ***************************************************************************/
1828 resv_entry: RESV
1829 {
1830 if (conf_parser_ctx.pass != 2)
1831 break;
1832
1833 reset_block_state();
1834 strlcpy(block_state.rpass.buf, CONF_NOREASON, sizeof(block_state.rpass.buf));
1835 } '{' resv_items '}' ';'
1836 {
1837 if (conf_parser_ctx.pass != 2)
1838 break;
1839
1840 resv_make(block_state.name.buf, block_state.rpass.buf, &block_state.mask.list);
1841 };
1842
1843 resv_items: resv_items resv_item | resv_item;
1844 resv_item: resv_mask | resv_reason | resv_exempt | error ';' ;
1845
1846 resv_mask: MASK '=' QSTRING ';'
1847 {
1848 if (conf_parser_ctx.pass == 2)
1849 strlcpy(block_state.name.buf, yylval.string, sizeof(block_state.name.buf));
1850 };
1851
1852 resv_reason: REASON '=' QSTRING ';'
1853 {
1854 if (conf_parser_ctx.pass == 2)
1855 strlcpy(block_state.rpass.buf, yylval.string, sizeof(block_state.rpass.buf));
1856 };
1857
1858 resv_exempt: EXEMPT '=' QSTRING ';'
1859 {
1860 if (conf_parser_ctx.pass == 2)
1861 dlinkAdd(xstrdup(yylval.string), make_dlink_node(), &block_state.mask.list);
1862 };
1863
1864
1865 /***************************************************************************
1866 * service {} section
1867 ***************************************************************************/
1868 service_entry: T_SERVICE '{' service_items '}' ';';
1869
1870 service_items: service_items service_item | service_item;
1871 service_item: service_name | error;
1872
1873 service_name: NAME '=' QSTRING ';'
1874 {
1875 if (conf_parser_ctx.pass != 2)
1876 break;
1877
1878 if (valid_servname(yylval.string))
1879 {
1880 struct ServiceItem *service = service_make();
1881 service->name = xstrdup(yylval.string);
1882 }
1883 };
1884
1885
1886 /***************************************************************************
1887 * shared {} section, for sharing remote klines etc.
1888 ***************************************************************************/
1889 shared_entry: T_SHARED
1890 {
1891 if (conf_parser_ctx.pass != 2)
1892 break;
1893
1894 reset_block_state();
1895
1896 strlcpy(block_state.name.buf, "*", sizeof(block_state.name.buf));
1897 strlcpy(block_state.user.buf, "*", sizeof(block_state.user.buf));
1898 strlcpy(block_state.host.buf, "*", sizeof(block_state.host.buf));
1899 block_state.flags.value = SHARED_ALL;
1900 } '{' shared_items '}' ';'
1901 {
1902 if (conf_parser_ctx.pass != 2)
1903 break;
1904
1905 struct SharedItem *shared = shared_make();
1906 shared->type = block_state.flags.value;
1907 shared->server = xstrdup(block_state.name.buf);
1908 shared->user = xstrdup(block_state.user.buf);
1909 shared->host = xstrdup(block_state.host.buf);
1910 };
1911
1912 shared_items: shared_items shared_item | shared_item;
1913 shared_item: shared_name | shared_user | shared_type | error ';' ;
1914
1915 shared_name: NAME '=' QSTRING ';'
1916 {
1917 if (conf_parser_ctx.pass == 2)
1918 strlcpy(block_state.name.buf, yylval.string, sizeof(block_state.name.buf));
1919 };
1920
1921 shared_user: USER '=' QSTRING ';'
1922 {
1923 if (conf_parser_ctx.pass == 2)
1924 {
1925 struct split_nuh_item nuh;
1926
1927 nuh.nuhmask = yylval.string;
1928 nuh.nickptr = NULL;
1929 nuh.userptr = block_state.user.buf;
1930 nuh.hostptr = block_state.host.buf;
1931
1932 nuh.nicksize = 0;
1933 nuh.usersize = sizeof(block_state.user.buf);
1934 nuh.hostsize = sizeof(block_state.host.buf);
1935
1936 split_nuh(&nuh);
1937 }
1938 };
1939
1940 shared_type: TYPE
1941 {
1942 if (conf_parser_ctx.pass == 2)
1943 block_state.flags.value = 0;
1944 } '=' shared_types ';' ;
1945
1946 shared_types: shared_types ',' shared_type_item | shared_type_item;
1947 shared_type_item: KLINE
1948 {
1949 if (conf_parser_ctx.pass == 2)
1950 block_state.flags.value |= SHARED_KLINE;
1951 } | UNKLINE
1952 {
1953 if (conf_parser_ctx.pass == 2)
1954 block_state.flags.value |= SHARED_UNKLINE;
1955 } | T_DLINE
1956 {
1957 if (conf_parser_ctx.pass == 2)
1958 block_state.flags.value |= SHARED_DLINE;
1959 } | T_UNDLINE
1960 {
1961 if (conf_parser_ctx.pass == 2)
1962 block_state.flags.value |= SHARED_UNDLINE;
1963 } | XLINE
1964 {
1965 if (conf_parser_ctx.pass == 2)
1966 block_state.flags.value |= SHARED_XLINE;
1967 } | T_UNXLINE
1968 {
1969 if (conf_parser_ctx.pass == 2)
1970 block_state.flags.value |= SHARED_UNXLINE;
1971 } | RESV
1972 {
1973 if (conf_parser_ctx.pass == 2)
1974 block_state.flags.value |= SHARED_RESV;
1975 } | T_UNRESV
1976 {
1977 if (conf_parser_ctx.pass == 2)
1978 block_state.flags.value |= SHARED_UNRESV;
1979 } | T_LOCOPS
1980 {
1981 if (conf_parser_ctx.pass == 2)
1982 block_state.flags.value |= SHARED_LOCOPS;
1983 } | T_ALL
1984 {
1985 if (conf_parser_ctx.pass == 2)
1986 block_state.flags.value = SHARED_ALL;
1987 };
1988
1989
1990 /***************************************************************************
1991 * cluster {} section
1992 ***************************************************************************/
1993 cluster_entry: T_CLUSTER
1994 {
1995 if (conf_parser_ctx.pass != 2)
1996 break;
1997
1998 reset_block_state();
1999
2000 strlcpy(block_state.name.buf, "*", sizeof(block_state.name.buf));
2001 block_state.flags.value = CLUSTER_ALL;
2002 } '{' cluster_items '}' ';'
2003 {
2004 if (conf_parser_ctx.pass != 2)
2005 break;
2006
2007 struct ClusterItem *cluster = cluster_make();
2008 cluster->type = block_state.flags.value;
2009 cluster->server = xstrdup(block_state.name.buf);
2010 };
2011
2012 cluster_items: cluster_items cluster_item | cluster_item;
2013 cluster_item: cluster_name | cluster_type | error ';' ;
2014
2015 cluster_name: NAME '=' QSTRING ';'
2016 {
2017 if (conf_parser_ctx.pass == 2)
2018 strlcpy(block_state.name.buf, yylval.string, sizeof(block_state.name.buf));
2019 };
2020
2021 cluster_type: TYPE
2022 {
2023 if (conf_parser_ctx.pass == 2)
2024 block_state.flags.value = 0;
2025 } '=' cluster_types ';' ;
2026
2027 cluster_types: cluster_types ',' cluster_type_item | cluster_type_item;
2028 cluster_type_item: KLINE
2029 {
2030 if (conf_parser_ctx.pass == 2)
2031 block_state.flags.value |= CLUSTER_KLINE;
2032 } | UNKLINE
2033 {
2034 if (conf_parser_ctx.pass == 2)
2035 block_state.flags.value |= CLUSTER_UNKLINE;
2036 } | T_DLINE
2037 {
2038 if (conf_parser_ctx.pass == 2)
2039 block_state.flags.value |= CLUSTER_DLINE;
2040 } | T_UNDLINE
2041 {
2042 if (conf_parser_ctx.pass == 2)
2043 block_state.flags.value |= CLUSTER_UNDLINE;
2044 } | XLINE
2045 {
2046 if (conf_parser_ctx.pass == 2)
2047 block_state.flags.value |= CLUSTER_XLINE;
2048 } | T_UNXLINE
2049 {
2050 if (conf_parser_ctx.pass == 2)
2051 block_state.flags.value |= CLUSTER_UNXLINE;
2052 } | RESV
2053 {
2054 if (conf_parser_ctx.pass == 2)
2055 block_state.flags.value |= CLUSTER_RESV;
2056 } | T_UNRESV
2057 {
2058 if (conf_parser_ctx.pass == 2)
2059 block_state.flags.value |= CLUSTER_UNRESV;
2060 } | T_LOCOPS
2061 {
2062 if (conf_parser_ctx.pass == 2)
2063 block_state.flags.value |= CLUSTER_LOCOPS;
2064 } | T_ALL
2065 {
2066 if (conf_parser_ctx.pass == 2)
2067 block_state.flags.value = CLUSTER_ALL;
2068 };
2069
2070
2071 /***************************************************************************
2072 * connect {} section
2073 ***************************************************************************/
2074 connect_entry: CONNECT
2075 {
2076
2077 if (conf_parser_ctx.pass != 2)
2078 break;
2079
2080 reset_block_state();
2081 block_state.aftype.value = AF_INET;
2082 block_state.port.value = PORTNUM;
2083 } '{' connect_items '}' ';'
2084 {
2085 struct MaskItem *conf = NULL;
2086 struct addrinfo hints, *res;
2087
2088 if (conf_parser_ctx.pass != 2)
2089 break;
2090
2091 if (!block_state.name.buf[0] ||
2092 !block_state.host.buf[0])
2093 break;
2094
2095 if (!block_state.rpass.buf[0] ||
2096 !block_state.spass.buf[0])
2097 break;
2098
2099 if (has_wildcards(block_state.name.buf) ||
2100 has_wildcards(block_state.host.buf))
2101 break;
2102
2103 conf = conf_make(CONF_SERVER);
2104 conf->port = block_state.port.value;
2105 conf->flags = block_state.flags.value;
2106 conf->aftype = block_state.aftype.value;
2107 conf->host = xstrdup(block_state.host.buf);
2108 conf->name = xstrdup(block_state.name.buf);
2109 conf->passwd = xstrdup(block_state.rpass.buf);
2110 conf->spasswd = xstrdup(block_state.spass.buf);
2111
2112 if (block_state.cert.buf[0])
2113 conf->certfp = xstrdup(block_state.cert.buf);
2114
2115 if (block_state.ciph.buf[0])
2116 conf->cipher_list = xstrdup(block_state.ciph.buf);
2117
2118 dlinkMoveList(&block_state.leaf.list, &conf->leaf_list);
2119 dlinkMoveList(&block_state.hub.list, &conf->hub_list);
2120
2121 if (block_state.bind.buf[0])
2122 {
2123 memset(&hints, 0, sizeof(hints));
2124
2125 hints.ai_family = AF_UNSPEC;
2126 hints.ai_socktype = SOCK_STREAM;
2127 hints.ai_flags = AI_PASSIVE | AI_NUMERICHOST;
2128
2129 if (getaddrinfo(block_state.bind.buf, NULL, &hints, &res))
2130 ilog(LOG_TYPE_IRCD, "Invalid netmask for server vhost(%s)", block_state.bind.buf);
2131 else
2132 {
2133 assert(res);
2134
2135 memcpy(&conf->bind, res->ai_addr, res->ai_addrlen);
2136 conf->bind.ss.ss_family = res->ai_family;
2137 conf->bind.ss_len = res->ai_addrlen;
2138 freeaddrinfo(res);
2139 }
2140 }
2141
2142 conf_add_class_to_conf(conf, block_state.class.buf);
2143 lookup_confhost(conf);
2144 };
2145
2146 connect_items: connect_items connect_item | connect_item;
2147 connect_item: connect_name |
2148 connect_host |
2149 connect_vhost |
2150 connect_send_password |
2151 connect_accept_password |
2152 connect_ssl_certificate_fingerprint |
2153 connect_aftype |
2154 connect_port |
2155 connect_ssl_cipher_list |
2156 connect_flags |
2157 connect_hub_mask |
2158 connect_leaf_mask |
2159 connect_class |
2160 connect_encrypted |
2161 error ';' ;
2162
2163 connect_name: NAME '=' QSTRING ';'
2164 {
2165 if (conf_parser_ctx.pass == 2)
2166 strlcpy(block_state.name.buf, yylval.string, sizeof(block_state.name.buf));
2167 };
2168
2169 connect_host: HOST '=' QSTRING ';'
2170 {
2171 if (conf_parser_ctx.pass == 2)
2172 strlcpy(block_state.host.buf, yylval.string, sizeof(block_state.host.buf));
2173 };
2174
2175 connect_vhost: VHOST '=' QSTRING ';'
2176 {
2177 if (conf_parser_ctx.pass == 2)
2178 strlcpy(block_state.bind.buf, yylval.string, sizeof(block_state.bind.buf));
2179 };
2180
2181 connect_send_password: SEND_PASSWORD '=' QSTRING ';'
2182 {
2183 if (conf_parser_ctx.pass != 2)
2184 break;
2185
2186 if ($3[0] == ':')
2187 conf_error_report("Server passwords cannot begin with a colon");
2188 else if (strchr($3, ' '))
2189 conf_error_report("Server passwords cannot contain spaces");
2190 else
2191 strlcpy(block_state.spass.buf, yylval.string, sizeof(block_state.spass.buf));
2192 };
2193
2194 connect_accept_password: ACCEPT_PASSWORD '=' QSTRING ';'
2195 {
2196 if (conf_parser_ctx.pass != 2)
2197 break;
2198
2199 if ($3[0] == ':')
2200 conf_error_report("Server passwords cannot begin with a colon");
2201 else if (strchr($3, ' '))
2202 conf_error_report("Server passwords cannot contain spaces");
2203 else
2204 strlcpy(block_state.rpass.buf, yylval.string, sizeof(block_state.rpass.buf));
2205 };
2206
2207 connect_ssl_certificate_fingerprint: SSL_CERTIFICATE_FINGERPRINT '=' QSTRING ';'
2208 {
2209 if (conf_parser_ctx.pass == 2)
2210 strlcpy(block_state.cert.buf, yylval.string, sizeof(block_state.cert.buf));
2211 };
2212
2213 connect_port: PORT '=' NUMBER ';'
2214 {
2215 if (conf_parser_ctx.pass == 2)
2216 block_state.port.value = $3;
2217 };
2218
2219 connect_aftype: AFTYPE '=' T_IPV4 ';'
2220 {
2221 if (conf_parser_ctx.pass == 2)
2222 block_state.aftype.value = AF_INET;
2223 } | AFTYPE '=' T_IPV6 ';'
2224 {
2225 if (conf_parser_ctx.pass == 2)
2226 block_state.aftype.value = AF_INET6;
2227 };
2228
2229 connect_flags: IRCD_FLAGS
2230 {
2231 block_state.flags.value &= CONF_FLAGS_ENCRYPTED;
2232 } '=' connect_flags_items ';';
2233
2234 connect_flags_items: connect_flags_items ',' connect_flags_item | connect_flags_item;
2235 connect_flags_item: AUTOCONN
2236 {
2237 if (conf_parser_ctx.pass == 2)
2238 block_state.flags.value |= CONF_FLAGS_ALLOW_AUTO_CONN;
2239 } | T_SSL
2240 {
2241 if (conf_parser_ctx.pass == 2)
2242 block_state.flags.value |= CONF_FLAGS_SSL;
2243 };
2244
2245 connect_encrypted: ENCRYPTED '=' TBOOL ';'
2246 {
2247 if (conf_parser_ctx.pass == 2)
2248 {
2249 if (yylval.number)
2250 block_state.flags.value |= CONF_FLAGS_ENCRYPTED;
2251 else
2252 block_state.flags.value &= ~CONF_FLAGS_ENCRYPTED;
2253 }
2254 };
2255
2256 connect_hub_mask: HUB_MASK '=' QSTRING ';'
2257 {
2258 if (conf_parser_ctx.pass == 2)
2259 dlinkAdd(xstrdup(yylval.string), make_dlink_node(), &block_state.hub.list);
2260 };
2261
2262 connect_leaf_mask: LEAF_MASK '=' QSTRING ';'
2263 {
2264 if (conf_parser_ctx.pass == 2)
2265 dlinkAdd(xstrdup(yylval.string), make_dlink_node(), &block_state.leaf.list);
2266 };
2267
2268 connect_class: CLASS '=' QSTRING ';'
2269 {
2270 if (conf_parser_ctx.pass == 2)
2271 strlcpy(block_state.class.buf, yylval.string, sizeof(block_state.class.buf));
2272 };
2273
2274 connect_ssl_cipher_list: T_SSL_CIPHER_LIST '=' QSTRING ';'
2275 {
2276 #ifdef HAVE_TLS
2277 if (conf_parser_ctx.pass == 2)
2278 strlcpy(block_state.ciph.buf, yylval.string, sizeof(block_state.ciph.buf));
2279 #else
2280 if (conf_parser_ctx.pass == 2)
2281 conf_error_report("Ignoring connect::ciphers -- no TLS support");
2282 #endif
2283 };
2284
2285
2286 /***************************************************************************
2287 * kill {} section
2288 ***************************************************************************/
2289 kill_entry: KILL
2290 {
2291 if (conf_parser_ctx.pass == 2)
2292 reset_block_state();
2293 } '{' kill_items '}' ';'
2294 {
2295 struct MaskItem *conf = NULL;
2296
2297 if (conf_parser_ctx.pass != 2)
2298 break;
2299
2300 if (!block_state.user.buf[0] ||
2301 !block_state.host.buf[0])
2302 break;
2303
2304 conf = conf_make(CONF_KLINE);
2305 conf->user = xstrdup(block_state.user.buf);
2306 conf->host = xstrdup(block_state.host.buf);
2307
2308 if (block_state.rpass.buf[0])
2309 conf->reason = xstrdup(block_state.rpass.buf);
2310 else
2311 conf->reason = xstrdup(CONF_NOREASON);
2312 add_conf_by_address(CONF_KLINE, conf);
2313 };
2314
2315 kill_items: kill_items kill_item | kill_item;
2316 kill_item: kill_user | kill_reason | error;
2317
2318 kill_user: USER '=' QSTRING ';'
2319 {
2320
2321 if (conf_parser_ctx.pass == 2)
2322 {
2323 struct split_nuh_item nuh;
2324
2325 nuh.nuhmask = yylval.string;
2326 nuh.nickptr = NULL;
2327 nuh.userptr = block_state.user.buf;
2328 nuh.hostptr = block_state.host.buf;
2329
2330 nuh.nicksize = 0;
2331 nuh.usersize = sizeof(block_state.user.buf);
2332 nuh.hostsize = sizeof(block_state.host.buf);
2333
2334 split_nuh(&nuh);
2335 }
2336 };
2337
2338 kill_reason: REASON '=' QSTRING ';'
2339 {
2340 if (conf_parser_ctx.pass == 2)
2341 strlcpy(block_state.rpass.buf, yylval.string, sizeof(block_state.rpass.buf));
2342 };
2343
2344
2345 /***************************************************************************
2346 * deny {} section
2347 ***************************************************************************/
2348 deny_entry: DENY
2349 {
2350 if (conf_parser_ctx.pass == 2)
2351 reset_block_state();
2352 } '{' deny_items '}' ';'
2353 {
2354 struct MaskItem *conf = NULL;
2355
2356 if (conf_parser_ctx.pass != 2)
2357 break;
2358
2359 if (!block_state.addr.buf[0])
2360 break;
2361
2362 if (parse_netmask(block_state.addr.buf, NULL, NULL) != HM_HOST)
2363 {
2364 conf = conf_make(CONF_DLINE);
2365 conf->host = xstrdup(block_state.addr.buf);
2366
2367 if (block_state.rpass.buf[0])
2368 conf->reason = xstrdup(block_state.rpass.buf);
2369 else
2370 conf->reason = xstrdup(CONF_NOREASON);
2371 add_conf_by_address(CONF_DLINE, conf);
2372 }
2373 };
2374
2375 deny_items: deny_items deny_item | deny_item;
2376 deny_item: deny_ip | deny_reason | error;
2377
2378 deny_ip: IP '=' QSTRING ';'
2379 {
2380 if (conf_parser_ctx.pass == 2)
2381 strlcpy(block_state.addr.buf, yylval.string, sizeof(block_state.addr.buf));
2382 };
2383
2384 deny_reason: REASON '=' QSTRING ';'
2385 {
2386 if (conf_parser_ctx.pass == 2)
2387 strlcpy(block_state.rpass.buf, yylval.string, sizeof(block_state.rpass.buf));
2388 };
2389
2390
2391 /***************************************************************************
2392 * exempt {} section
2393 ***************************************************************************/
2394 exempt_entry: EXEMPT '{' exempt_items '}' ';';
2395
2396 exempt_items: exempt_items exempt_item | exempt_item;
2397 exempt_item: exempt_ip | error;
2398
2399 exempt_ip: IP '=' QSTRING ';'
2400 {
2401 if (conf_parser_ctx.pass == 2)
2402 {
2403 if (*yylval.string && parse_netmask(yylval.string, NULL, NULL) != HM_HOST)
2404 {
2405 struct MaskItem *conf = conf_make(CONF_EXEMPT);
2406 conf->host = xstrdup(yylval.string);
2407
2408 add_conf_by_address(CONF_EXEMPT, conf);
2409 }
2410 }
2411 };
2412
2413 /***************************************************************************
2414 * gecos {} section
2415 ***************************************************************************/
2416 gecos_entry: GECOS
2417 {
2418 if (conf_parser_ctx.pass == 2)
2419 reset_block_state();
2420 } '{' gecos_items '}' ';'
2421 {
2422 if (conf_parser_ctx.pass != 2)
2423 break;
2424
2425 if (!block_state.name.buf[0])
2426 break;
2427
2428 struct GecosItem *gecos = gecos_make();
2429 gecos->mask = xstrdup(block_state.name.buf);
2430
2431 if (block_state.rpass.buf[0])
2432 gecos->reason = xstrdup(block_state.rpass.buf);
2433 else
2434 gecos->reason = xstrdup(CONF_NOREASON);
2435 };
2436
2437 gecos_items: gecos_items gecos_item | gecos_item;
2438 gecos_item: gecos_name | gecos_reason | error;
2439
2440 gecos_name: NAME '=' QSTRING ';'
2441 {
2442 if (conf_parser_ctx.pass == 2)
2443 strlcpy(block_state.name.buf, yylval.string, sizeof(block_state.name.buf));
2444 };
2445
2446 gecos_reason: REASON '=' QSTRING ';'
2447 {
2448 if (conf_parser_ctx.pass == 2)
2449 strlcpy(block_state.rpass.buf, yylval.string, sizeof(block_state.rpass.buf));
2450 };
2451
2452
2453 /***************************************************************************
2454 * general {} section
2455 ***************************************************************************/
2456 general_entry: GENERAL '{' general_items '}' ';';
2457
2458 general_items: general_items general_item | general_item;
2459 general_item: general_away_count |
2460 general_away_time |
2461 general_ignore_bogus_ts |
2462 general_failed_oper_notice |
2463 general_anti_nick_flood |
2464 general_max_nick_time |
2465 general_max_nick_changes |
2466 general_max_accept |
2467 general_whowas_history_length |
2468 general_anti_spam_exit_message_time |
2469 general_ts_warn_delta |
2470 general_ts_max_delta |
2471 general_kill_chase_time_limit |
2472 general_invisible_on_connect |
2473 general_warn_no_connect_block |
2474 general_dots_in_ident |
2475 general_stats_i_oper_only |
2476 general_stats_k_oper_only |
2477 general_stats_m_oper_only |
2478 general_stats_o_oper_only |
2479 general_stats_P_oper_only |
2480 general_stats_u_oper_only |
2481 general_pace_wait |
2482 general_pace_wait_simple |
2483 general_short_motd |
2484 general_no_oper_flood |
2485 general_oper_only_umodes |
2486 general_max_targets |
2487 general_oper_umodes |
2488 general_caller_id_wait |
2489 general_opers_bypass_callerid |
2490 general_default_floodcount |
2491 general_default_floodtime |
2492 general_min_nonwildcard |
2493 general_min_nonwildcard_simple |
2494 general_throttle_count |
2495 general_throttle_time |
2496 general_ping_cookie |
2497 general_disable_auth |
2498 general_tkline_expire_notices |
2499 general_dline_min_cidr |
2500 general_dline_min_cidr6 |
2501 general_kline_min_cidr |
2502 general_kline_min_cidr6 |
2503 general_stats_e_disabled |
2504 general_max_watch |
2505 general_cycle_on_host_change |
2506 error;
2507
2508
2509 general_away_count: AWAY_COUNT '=' NUMBER ';'
2510 {
2511 ConfigGeneral.away_count = $3;
2512 };
2513
2514 general_away_time: AWAY_TIME '=' timespec ';'
2515 {
2516 ConfigGeneral.away_time = $3;
2517 };
2518
2519 general_max_watch: MAX_WATCH '=' NUMBER ';'
2520 {
2521 ConfigGeneral.max_watch = $3;
2522 };
2523
2524 general_whowas_history_length: WHOWAS_HISTORY_LENGTH '=' NUMBER ';'
2525 {
2526 ConfigGeneral.whowas_history_length = $3;
2527 };
2528
2529 general_cycle_on_host_change: CYCLE_ON_HOST_CHANGE '=' TBOOL ';'
2530 {
2531 if (conf_parser_ctx.pass == 2)
2532 ConfigGeneral.cycle_on_host_change = yylval.number;
2533 };
2534
2535 general_dline_min_cidr: DLINE_MIN_CIDR '=' NUMBER ';'
2536 {
2537 ConfigGeneral.dline_min_cidr = $3;
2538 };
2539
2540 general_dline_min_cidr6: DLINE_MIN_CIDR6 '=' NUMBER ';'
2541 {
2542 ConfigGeneral.dline_min_cidr6 = $3;
2543 };
2544
2545 general_kline_min_cidr: KLINE_MIN_CIDR '=' NUMBER ';'
2546 {
2547 ConfigGeneral.kline_min_cidr = $3;
2548 };
2549
2550 general_kline_min_cidr6: KLINE_MIN_CIDR6 '=' NUMBER ';'
2551 {
2552 ConfigGeneral.kline_min_cidr6 = $3;
2553 };
2554
2555 general_tkline_expire_notices: TKLINE_EXPIRE_NOTICES '=' TBOOL ';'
2556 {
2557 ConfigGeneral.tkline_expire_notices = yylval.number;
2558 };
2559
2560 general_kill_chase_time_limit: KILL_CHASE_TIME_LIMIT '=' timespec ';'
2561 {
2562 ConfigGeneral.kill_chase_time_limit = $3;
2563 };
2564
2565 general_ignore_bogus_ts: IGNORE_BOGUS_TS '=' TBOOL ';'
2566 {
2567 ConfigGeneral.ignore_bogus_ts = yylval.number;
2568 };
2569
2570 general_failed_oper_notice: FAILED_OPER_NOTICE '=' TBOOL ';'
2571 {
2572 ConfigGeneral.failed_oper_notice = yylval.number;
2573 };
2574
2575 general_anti_nick_flood: ANTI_NICK_FLOOD '=' TBOOL ';'
2576 {
2577 ConfigGeneral.anti_nick_flood = yylval.number;
2578 };
2579
2580 general_max_nick_time: MAX_NICK_TIME '=' timespec ';'
2581 {
2582 ConfigGeneral.max_nick_time = $3;
2583 };
2584
2585 general_max_nick_changes: MAX_NICK_CHANGES '=' NUMBER ';'
2586 {
2587 ConfigGeneral.max_nick_changes = $3;
2588 };
2589
2590 general_max_accept: MAX_ACCEPT '=' NUMBER ';'
2591 {
2592 ConfigGeneral.max_accept = $3;
2593 };
2594
2595 general_anti_spam_exit_message_time: ANTI_SPAM_EXIT_MESSAGE_TIME '=' timespec ';'
2596 {
2597 ConfigGeneral.anti_spam_exit_message_time = $3;
2598 };
2599
2600 general_ts_warn_delta: TS_WARN_DELTA '=' timespec ';'
2601 {
2602 ConfigGeneral.ts_warn_delta = $3;
2603 };
2604
2605 general_ts_max_delta: TS_MAX_DELTA '=' timespec ';'
2606 {
2607 if (conf_parser_ctx.pass == 2)
2608 ConfigGeneral.ts_max_delta = $3;
2609 };
2610
2611 general_invisible_on_connect: INVISIBLE_ON_CONNECT '=' TBOOL ';'
2612 {
2613 ConfigGeneral.invisible_on_connect = yylval.number;
2614 };
2615
2616 general_warn_no_connect_block: WARN_NO_CONNECT_BLOCK '=' TBOOL ';'
2617 {
2618 ConfigGeneral.warn_no_connect_block = yylval.number;
2619 };
2620
2621 general_stats_e_disabled: STATS_E_DISABLED '=' TBOOL ';'
2622 {
2623 ConfigGeneral.stats_e_disabled = yylval.number;
2624 };
2625
2626 general_stats_m_oper_only: STATS_M_OPER_ONLY '=' TBOOL ';'
2627 {
2628 ConfigGeneral.stats_m_oper_only = yylval.number;
2629 };
2630
2631 general_stats_o_oper_only: STATS_O_OPER_ONLY '=' TBOOL ';'
2632 {
2633 ConfigGeneral.stats_o_oper_only = yylval.number;
2634 };
2635
2636 general_stats_P_oper_only: STATS_P_OPER_ONLY '=' TBOOL ';'
2637 {
2638 ConfigGeneral.stats_P_oper_only = yylval.number;
2639 };
2640
2641 general_stats_u_oper_only: STATS_U_OPER_ONLY '=' TBOOL ';'
2642 {
2643 ConfigGeneral.stats_u_oper_only = yylval.number;
2644 };
2645
2646 general_stats_k_oper_only: STATS_K_OPER_ONLY '=' TBOOL ';'
2647 {
2648 ConfigGeneral.stats_k_oper_only = 2 * yylval.number;
2649 } | STATS_K_OPER_ONLY '=' TMASKED ';'
2650 {
2651 ConfigGeneral.stats_k_oper_only = 1;
2652 };
2653
2654 general_stats_i_oper_only: STATS_I_OPER_ONLY '=' TBOOL ';'
2655 {
2656 ConfigGeneral.stats_i_oper_only = 2 * yylval.number;
2657 } | STATS_I_OPER_ONLY '=' TMASKED ';'
2658 {
2659 ConfigGeneral.stats_i_oper_only = 1;
2660 };
2661
2662 general_pace_wait: PACE_WAIT '=' timespec ';'
2663 {
2664 ConfigGeneral.pace_wait = $3;
2665 };
2666
2667 general_caller_id_wait: CALLER_ID_WAIT '=' timespec ';'
2668 {
2669 ConfigGeneral.caller_id_wait = $3;
2670 };
2671
2672 general_opers_bypass_callerid: OPERS_BYPASS_CALLERID '=' TBOOL ';'
2673 {
2674 ConfigGeneral.opers_bypass_callerid = yylval.number;
2675 };
2676
2677 general_pace_wait_simple: PACE_WAIT_SIMPLE '=' timespec ';'
2678 {
2679 ConfigGeneral.pace_wait_simple = $3;
2680 };
2681
2682 general_short_motd: SHORT_MOTD '=' TBOOL ';'
2683 {
2684 ConfigGeneral.short_motd = yylval.number;
2685 };
2686
2687 general_no_oper_flood: NO_OPER_FLOOD '=' TBOOL ';'
2688 {
2689 ConfigGeneral.no_oper_flood = yylval.number;
2690 };
2691
2692 general_dots_in_ident: DOTS_IN_IDENT '=' NUMBER ';'
2693 {
2694 ConfigGeneral.dots_in_ident = $3;
2695 };
2696
2697 general_max_targets: MAX_TARGETS '=' NUMBER ';'
2698 {
2699 ConfigGeneral.max_targets = $3;
2700 };
2701
2702 general_ping_cookie: PING_COOKIE '=' TBOOL ';'
2703 {
2704 ConfigGeneral.ping_cookie = yylval.number;
2705 };
2706
2707 general_disable_auth: DISABLE_AUTH '=' TBOOL ';'
2708 {
2709 ConfigGeneral.disable_auth = yylval.number;
2710 };
2711
2712 general_throttle_count: THROTTLE_COUNT '=' NUMBER ';'
2713 {
2714 ConfigGeneral.throttle_count = $3;
2715 };
2716
2717 general_throttle_time: THROTTLE_TIME '=' timespec ';'
2718 {
2719 ConfigGeneral.throttle_time = $3;
2720 };
2721
2722 general_oper_umodes: OPER_UMODES
2723 {
2724 ConfigGeneral.oper_umodes = 0;
2725 } '=' umode_oitems ';' ;
2726
2727 umode_oitems: umode_oitems ',' umode_oitem | umode_oitem;
2728 umode_oitem: T_BOTS
2729 {
2730 ConfigGeneral.oper_umodes |= UMODE_BOTS;
2731 } | T_CCONN
2732 {
2733 ConfigGeneral.oper_umodes |= UMODE_CCONN;
2734 } | T_DEAF
2735 {
2736 ConfigGeneral.oper_umodes |= UMODE_DEAF;
2737 } | T_DEBUG
2738 {
2739 ConfigGeneral.oper_umodes |= UMODE_DEBUG;
2740 } | T_FULL
2741 {
2742 ConfigGeneral.oper_umodes |= UMODE_FULL;
2743 } | HIDDEN
2744 {
2745 ConfigGeneral.oper_umodes |= UMODE_HIDDEN;
2746 } | HIDE_CHANS
2747 {
2748 ConfigGeneral.oper_umodes |= UMODE_HIDECHANS;
2749 } | HIDE_IDLE
2750 {
2751 ConfigGeneral.oper_umodes |= UMODE_HIDEIDLE;
2752 } | T_SKILL
2753 {
2754 ConfigGeneral.oper_umodes |= UMODE_SKILL;
2755 } | T_NCHANGE
2756 {
2757 ConfigGeneral.oper_umodes |= UMODE_NCHANGE;
2758 } | T_REJ
2759 {
2760 ConfigGeneral.oper_umodes |= UMODE_REJ;
2761 } | T_UNAUTH
2762 {
2763 ConfigGeneral.oper_umodes |= UMODE_UNAUTH;
2764 } | T_SPY
2765 {
2766 ConfigGeneral.oper_umodes |= UMODE_SPY;
2767 } | T_EXTERNAL
2768 {
2769 ConfigGeneral.oper_umodes |= UMODE_EXTERNAL;
2770 } | T_SERVNOTICE
2771 {
2772 ConfigGeneral.oper_umodes |= UMODE_SERVNOTICE;
2773 } | T_INVISIBLE
2774 {
2775 ConfigGeneral.oper_umodes |= UMODE_INVISIBLE;
2776 } | T_WALLOP
2777 {
2778 ConfigGeneral.oper_umodes |= UMODE_WALLOP;
2779 } | T_SOFTCALLERID
2780 {
2781 ConfigGeneral.oper_umodes |= UMODE_SOFTCALLERID;
2782 } | T_CALLERID
2783 {
2784 ConfigGeneral.oper_umodes |= UMODE_CALLERID;
2785 } | T_LOCOPS
2786 {
2787 ConfigGeneral.oper_umodes |= UMODE_LOCOPS;
2788 } | T_NONONREG
2789 {
2790 ConfigGeneral.oper_umodes |= UMODE_REGONLY;
2791 } | T_FARCONNECT
2792 {
2793 ConfigGeneral.oper_umodes |= UMODE_FARCONNECT;
2794 };
2795
2796 general_oper_only_umodes: OPER_ONLY_UMODES
2797 {
2798 ConfigGeneral.oper_only_umodes = 0;
2799 } '=' umode_items ';' ;
2800
2801 umode_items: umode_items ',' umode_item | umode_item;
2802 umode_item: T_BOTS
2803 {
2804 ConfigGeneral.oper_only_umodes |= UMODE_BOTS;
2805 } | T_CCONN
2806 {
2807 ConfigGeneral.oper_only_umodes |= UMODE_CCONN;
2808 } | T_DEAF
2809 {
2810 ConfigGeneral.oper_only_umodes |= UMODE_DEAF;
2811 } | T_DEBUG
2812 {
2813 ConfigGeneral.oper_only_umodes |= UMODE_DEBUG;
2814 } | T_FULL
2815 {
2816 ConfigGeneral.oper_only_umodes |= UMODE_FULL;
2817 } | T_SKILL
2818 {
2819 ConfigGeneral.oper_only_umodes |= UMODE_SKILL;
2820 } | HIDDEN
2821 {
2822 ConfigGeneral.oper_only_umodes |= UMODE_HIDDEN;
2823 } | T_NCHANGE
2824 {
2825 ConfigGeneral.oper_only_umodes |= UMODE_NCHANGE;
2826 } | T_REJ
2827 {
2828 ConfigGeneral.oper_only_umodes |= UMODE_REJ;
2829 } | T_UNAUTH
2830 {
2831 ConfigGeneral.oper_only_umodes |= UMODE_UNAUTH;
2832 } | T_SPY
2833 {
2834 ConfigGeneral.oper_only_umodes |= UMODE_SPY;
2835 } | T_EXTERNAL
2836 {
2837 ConfigGeneral.oper_only_umodes |= UMODE_EXTERNAL;
2838 } | T_SERVNOTICE
2839 {
2840 ConfigGeneral.oper_only_umodes |= UMODE_SERVNOTICE;
2841 } | T_INVISIBLE
2842 {
2843 ConfigGeneral.oper_only_umodes |= UMODE_INVISIBLE;
2844 } | T_WALLOP
2845 {
2846 ConfigGeneral.oper_only_umodes |= UMODE_WALLOP;
2847 } | T_SOFTCALLERID
2848 {
2849 ConfigGeneral.oper_only_umodes |= UMODE_SOFTCALLERID;
2850 } | T_CALLERID
2851 {
2852 ConfigGeneral.oper_only_umodes |= UMODE_CALLERID;
2853 } | T_LOCOPS
2854 {
2855 ConfigGeneral.oper_only_umodes |= UMODE_LOCOPS;
2856 } | T_NONONREG
2857 {
2858 ConfigGeneral.oper_only_umodes |= UMODE_REGONLY;
2859 } | T_FARCONNECT
2860 {
2861 ConfigGeneral.oper_only_umodes |= UMODE_FARCONNECT;
2862 };
2863
2864 general_min_nonwildcard: MIN_NONWILDCARD '=' NUMBER ';'
2865 {
2866 ConfigGeneral.min_nonwildcard = $3;
2867 };
2868
2869 general_min_nonwildcard_simple: MIN_NONWILDCARD_SIMPLE '=' NUMBER ';'
2870 {
2871 ConfigGeneral.min_nonwildcard_simple = $3;
2872 };
2873
2874 general_default_floodcount: DEFAULT_FLOODCOUNT '=' NUMBER ';'
2875 {
2876 ConfigGeneral.default_floodcount = $3;
2877 };
2878
2879 general_default_floodtime: DEFAULT_FLOODTIME '=' timespec ';'
2880 {
2881 ConfigGeneral.default_floodtime = $3;
2882 };
2883
2884
2885 /***************************************************************************
2886 * channel {} section
2887 ***************************************************************************/
2888 channel_entry: CHANNEL '{' channel_items '}' ';';
2889
2890 channel_items: channel_items channel_item | channel_item;
2891 channel_item: channel_max_bans |
2892 channel_invite_client_count |
2893 channel_invite_client_time |
2894 channel_invite_delay_channel |
2895 channel_invite_expire_time |
2896 channel_knock_client_count |
2897 channel_knock_client_time |
2898 channel_knock_delay_channel |
2899 channel_max_channels |
2900 channel_max_invites |
2901 channel_default_join_flood_count |
2902 channel_default_join_flood_time |
2903 channel_disable_fake_channels |
2904 error;
2905
2906 channel_disable_fake_channels: DISABLE_FAKE_CHANNELS '=' TBOOL ';'
2907 {
2908 ConfigChannel.disable_fake_channels = yylval.number;
2909 };
2910
2911 channel_invite_client_count: INVITE_CLIENT_COUNT '=' NUMBER ';'
2912 {
2913 ConfigChannel.invite_client_count = $3;
2914 };
2915
2916 channel_invite_client_time: INVITE_CLIENT_TIME '=' timespec ';'
2917 {
2918 ConfigChannel.invite_client_time = $3;
2919 };
2920
2921 channel_invite_delay_channel: INVITE_DELAY_CHANNEL '=' timespec ';'
2922 {
2923 ConfigChannel.invite_delay_channel = $3;
2924 };
2925
2926 channel_invite_expire_time: INVITE_EXPIRE_TIME '=' timespec ';'
2927 {
2928 ConfigChannel.invite_expire_time = $3;
2929 };
2930
2931 channel_knock_client_count: KNOCK_CLIENT_COUNT '=' NUMBER ';'
2932 {
2933 ConfigChannel.knock_client_count = $3;
2934 };
2935
2936 channel_knock_client_time: KNOCK_CLIENT_TIME '=' timespec ';'
2937 {
2938 ConfigChannel.knock_client_time = $3;
2939 };
2940
2941 channel_knock_delay_channel: KNOCK_DELAY_CHANNEL '=' timespec ';'
2942 {
2943 ConfigChannel.knock_delay_channel = $3;
2944 };
2945
2946 channel_max_channels: MAX_CHANNELS '=' NUMBER ';'
2947 {
2948 ConfigChannel.max_channels = $3;
2949 };
2950
2951 channel_max_invites: MAX_INVITES '=' NUMBER ';'
2952 {
2953 ConfigChannel.max_invites = $3;
2954 };
2955
2956 channel_max_bans: MAX_BANS '=' NUMBER ';'
2957 {
2958 ConfigChannel.max_bans = $3;
2959 };
2960
2961 channel_default_join_flood_count: DEFAULT_JOIN_FLOOD_COUNT '=' NUMBER ';'
2962 {
2963 ConfigChannel.default_join_flood_count = yylval.number;
2964 };
2965
2966 channel_default_join_flood_time: DEFAULT_JOIN_FLOOD_TIME '=' timespec ';'
2967 {
2968 ConfigChannel.default_join_flood_time = $3;
2969 };
2970
2971
2972 /***************************************************************************
2973 * serverhide {} section
2974 ***************************************************************************/
2975 serverhide_entry: SERVERHIDE '{' serverhide_items '}' ';';
2976
2977 serverhide_items: serverhide_items serverhide_item | serverhide_item;
2978 serverhide_item: serverhide_flatten_links |
2979 serverhide_flatten_links_delay |
2980 serverhide_flatten_links_file |
2981 serverhide_disable_remote_commands |
2982 serverhide_hide_servers |
2983 serverhide_hide_services |
2984 serverhide_hidden |
2985 serverhide_hidden_name |
2986 serverhide_hide_server_ips |
2987 error;
2988
2989 serverhide_flatten_links: FLATTEN_LINKS '=' TBOOL ';'
2990 {
2991 if (conf_parser_ctx.pass == 2)
2992 ConfigServerHide.flatten_links = yylval.number;
2993 };
2994
2995 serverhide_flatten_links_delay: FLATTEN_LINKS_DELAY '=' timespec ';'
2996 {
2997 if (conf_parser_ctx.pass == 2)
2998 {
2999 if ($3 > 0)
3000 {
3001 event_write_links_file.when = $3;
3002 event_add(&event_write_links_file, NULL);
3003 }
3004 else
3005 event_delete(&event_write_links_file);
3006
3007 ConfigServerHide.flatten_links_delay = $3;
3008 }
3009 };
3010
3011 serverhide_flatten_links_file: FLATTEN_LINKS_FILE '=' QSTRING ';'
3012 {
3013 if (conf_parser_ctx.pass == 2)
3014 {
3015 xfree(ConfigServerHide.flatten_links_file);
3016 ConfigServerHide.flatten_links_file = xstrdup(yylval.string);
3017 }
3018 };
3019
3020 serverhide_disable_remote_commands: DISABLE_REMOTE_COMMANDS '=' TBOOL ';'
3021 {
3022 if (conf_parser_ctx.pass == 2)
3023 ConfigServerHide.disable_remote_commands = yylval.number;
3024 };
3025
3026 serverhide_hide_servers: HIDE_SERVERS '=' TBOOL ';'
3027 {
3028 if (conf_parser_ctx.pass == 2)
3029 ConfigServerHide.hide_servers = yylval.number;
3030 };
3031
3032 serverhide_hide_services: HIDE_SERVICES '=' TBOOL ';'
3033 {
3034 if (conf_parser_ctx.pass == 2)
3035 ConfigServerHide.hide_services = yylval.number;
3036 };
3037
3038 serverhide_hidden_name: HIDDEN_NAME '=' QSTRING ';'
3039 {
3040 if (conf_parser_ctx.pass == 2)
3041 {
3042 xfree(ConfigServerHide.hidden_name);
3043 ConfigServerHide.hidden_name = xstrdup(yylval.string);
3044 }
3045 };
3046
3047 serverhide_hidden: HIDDEN '=' TBOOL ';'
3048 {
3049 if (conf_parser_ctx.pass == 2)
3050 ConfigServerHide.hidden = yylval.number;
3051 };
3052
3053 serverhide_hide_server_ips: HIDE_SERVER_IPS '=' TBOOL ';'
3054 {
3055 if (conf_parser_ctx.pass == 2)
3056 ConfigServerHide.hide_server_ips = yylval.number;
3057 };

Properties

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