ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/trunk/src/conf_parser.y
Revision: 8607
Committed: Mon Oct 29 21:26:54 2018 UTC (7 years, 11 months ago) by michael
File size: 74901 byte(s)
Log Message:
- Rewrite class based subnet limiting to use a patricia trie

File Contents

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

Properties

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