ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/branches/8.2.x/src/conf_parser.y
Revision: 7281
Committed: Sun Feb 7 18:02:24 2016 UTC (10 years, 5 months ago) by michael
File size: 76299 byte(s)
Log Message:
- Cleanup/separate RESV conf implementation

File Contents

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

Properties

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