ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/trunk/src/conf_parser.y
Revision: 8752
Committed: Tue Jan 1 11:07:01 2019 UTC (7 years, 9 months ago) by michael
File size: 75092 byte(s)
Log Message:
- Update copyright years

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 8752 * Copyright (c) 2000-2019 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 8660 if (server_valid_name(yylval.string) == true)
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 8660 if (!(class = class_find(block_state.class.buf, false)))
1335 michael 1647 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 8609 int diff = (class->cidr_bitlen_ipv4 != block_state.cidr_bitlen_ipv4.value ||
1361     class->cidr_bitlen_ipv6 != block_state.cidr_bitlen_ipv6.value);
1362 michael 1647 class->cidr_bitlen_ipv4 = block_state.cidr_bitlen_ipv4.value;
1363     class->cidr_bitlen_ipv6 = block_state.cidr_bitlen_ipv6.value;
1364     class->number_per_cidr = block_state.number_per_cidr.value;
1365 michael 8607
1366 michael 8609 if (diff)
1367     class_ip_limit_rebuild(class);
1368 adx 30 };
1369    
1370     class_items: class_items class_item | class_item;
1371     class_item: class_name |
1372 michael 3439 class_cidr_bitlen_ipv4 |
1373     class_cidr_bitlen_ipv6 |
1374 adx 30 class_ping_time |
1375 michael 3439 class_number_per_cidr |
1376 michael 8496 class_number_per_ip_local |
1377     class_number_per_ip_global |
1378 adx 30 class_connectfreq |
1379 michael 3933 class_max_channels |
1380 adx 30 class_max_number |
1381 michael 7624 class_sendq |
1382     class_recvq |
1383 michael 1783 class_min_idle |
1384     class_max_idle |
1385     class_flags |
1386 michael 3439 error ';' ;
1387 adx 30
1388 michael 2916 class_name: NAME '=' QSTRING ';'
1389 adx 30 {
1390 michael 967 if (conf_parser_ctx.pass == 1)
1391 michael 1647 strlcpy(block_state.class.buf, yylval.string, sizeof(block_state.class.buf));
1392 adx 30 };
1393    
1394     class_ping_time: PING_TIME '=' timespec ';'
1395     {
1396 michael 967 if (conf_parser_ctx.pass == 1)
1397 michael 1647 block_state.ping_freq.value = $3;
1398 adx 30 };
1399    
1400 michael 8496 class_number_per_ip_local: NUMBER_PER_IP_LOCAL '=' NUMBER ';'
1401 adx 30 {
1402 michael 967 if (conf_parser_ctx.pass == 1)
1403 michael 8496 block_state.max_perip_local.value = $3;
1404 adx 30 };
1405    
1406 michael 8496 class_number_per_ip_global: NUMBER_PER_IP_GLOBAL '=' NUMBER ';'
1407     {
1408     if (conf_parser_ctx.pass == 1)
1409     block_state.max_perip_global.value = $3;
1410     };
1411    
1412 adx 30 class_connectfreq: CONNECTFREQ '=' timespec ';'
1413     {
1414 michael 967 if (conf_parser_ctx.pass == 1)
1415 michael 1647 block_state.con_freq.value = $3;
1416 adx 30 };
1417    
1418 michael 3933 class_max_channels: MAX_CHANNELS '=' NUMBER ';'
1419     {
1420     if (conf_parser_ctx.pass == 1)
1421     block_state.max_channels.value = $3;
1422     };
1423    
1424 adx 30 class_max_number: MAX_NUMBER '=' NUMBER ';'
1425     {
1426 michael 967 if (conf_parser_ctx.pass == 1)
1427 michael 1647 block_state.max_total.value = $3;
1428 adx 30 };
1429    
1430     class_sendq: SENDQ '=' sizespec ';'
1431     {
1432 michael 967 if (conf_parser_ctx.pass == 1)
1433 michael 1647 block_state.max_sendq.value = $3;
1434 adx 30 };
1435    
1436 michael 1516 class_recvq: T_RECVQ '=' sizespec ';'
1437     {
1438     if (conf_parser_ctx.pass == 1)
1439     if ($3 >= CLIENT_FLOOD_MIN && $3 <= CLIENT_FLOOD_MAX)
1440 michael 1647 block_state.max_recvq.value = $3;
1441 michael 1516 };
1442    
1443 adx 30 class_cidr_bitlen_ipv4: CIDR_BITLEN_IPV4 '=' NUMBER ';'
1444     {
1445 michael 967 if (conf_parser_ctx.pass == 1)
1446 michael 1647 block_state.cidr_bitlen_ipv4.value = $3 > 32 ? 32 : $3;
1447 adx 30 };
1448    
1449     class_cidr_bitlen_ipv6: CIDR_BITLEN_IPV6 '=' NUMBER ';'
1450     {
1451 michael 967 if (conf_parser_ctx.pass == 1)
1452 michael 1647 block_state.cidr_bitlen_ipv6.value = $3 > 128 ? 128 : $3;
1453 adx 30 };
1454    
1455     class_number_per_cidr: NUMBER_PER_CIDR '=' NUMBER ';'
1456     {
1457 michael 967 if (conf_parser_ctx.pass == 1)
1458 michael 1647 block_state.number_per_cidr.value = $3;
1459 adx 30 };
1460    
1461 michael 1783 class_min_idle: MIN_IDLE '=' timespec ';'
1462     {
1463 michael 1785 if (conf_parser_ctx.pass != 1)
1464     break;
1465    
1466     block_state.min_idle.value = $3;
1467     block_state.flags.value |= CLASS_FLAGS_FAKE_IDLE;
1468 michael 1783 };
1469    
1470     class_max_idle: MAX_IDLE '=' timespec ';'
1471     {
1472 michael 1785 if (conf_parser_ctx.pass != 1)
1473     break;
1474    
1475     block_state.max_idle.value = $3;
1476     block_state.flags.value |= CLASS_FLAGS_FAKE_IDLE;
1477 michael 1783 };
1478    
1479     class_flags: IRCD_FLAGS
1480     {
1481     if (conf_parser_ctx.pass == 1)
1482 michael 1785 block_state.flags.value &= CLASS_FLAGS_FAKE_IDLE;
1483 michael 1783 } '=' class_flags_items ';';
1484    
1485     class_flags_items: class_flags_items ',' class_flags_item | class_flags_item;
1486     class_flags_item: RANDOM_IDLE
1487     {
1488     if (conf_parser_ctx.pass == 1)
1489     block_state.flags.value |= CLASS_FLAGS_RANDOM_IDLE;
1490     } | HIDE_IDLE_FROM_OPERS
1491     {
1492     if (conf_parser_ctx.pass == 1)
1493     block_state.flags.value |= CLASS_FLAGS_HIDE_IDLE_FROM_OPERS;
1494     };
1495    
1496    
1497 adx 30 /***************************************************************************
1498 michael 6664 * listen {} section
1499 adx 30 ***************************************************************************/
1500     listen_entry: LISTEN
1501     {
1502 michael 967 if (conf_parser_ctx.pass == 2)
1503 michael 1646 reset_block_state();
1504     } '{' listen_items '}' ';';
1505 adx 30
1506     listen_flags: IRCD_FLAGS
1507     {
1508 michael 1646 block_state.flags.value = 0;
1509 adx 30 } '=' listen_flags_items ';';
1510    
1511     listen_flags_items: listen_flags_items ',' listen_flags_item | listen_flags_item;
1512     listen_flags_item: T_SSL
1513     {
1514 michael 967 if (conf_parser_ctx.pass == 2)
1515 michael 1646 block_state.flags.value |= LISTENER_SSL;
1516 adx 30 } | HIDDEN
1517     {
1518 michael 967 if (conf_parser_ctx.pass == 2)
1519 michael 1647 block_state.flags.value |= LISTENER_HIDDEN;
1520 michael 900 } | T_SERVER
1521     {
1522 michael 967 if (conf_parser_ctx.pass == 2)
1523 michael 1647 block_state.flags.value |= LISTENER_SERVER;
1524 adx 30 };
1525    
1526     listen_items: listen_items listen_item | listen_item;
1527 michael 440 listen_item: listen_port | listen_flags | listen_address | listen_host | error ';';
1528 adx 30
1529 michael 1648 listen_port: PORT '=' port_items { block_state.flags.value = 0; } ';';
1530 adx 30
1531     port_items: port_items ',' port_item | port_item;
1532    
1533     port_item: NUMBER
1534     {
1535 michael 967 if (conf_parser_ctx.pass == 2)
1536 adx 30 {
1537 michael 7105 #ifndef HAVE_TLS
1538 michael 1646 if (block_state.flags.value & LISTENER_SSL)
1539 michael 4499 {
1540 michael 7105 conf_error_report("TLS not available - port closed");
1541 michael 4499 break;
1542     }
1543 adx 30 #endif
1544 michael 6367 listener_add($1, block_state.addr.buf, block_state.flags.value);
1545 adx 30 }
1546     } | NUMBER TWODOTS NUMBER
1547     {
1548 michael 967 if (conf_parser_ctx.pass == 2)
1549 adx 30 {
1550 michael 7105 #ifndef HAVE_TLS
1551 michael 1646 if (block_state.flags.value & LISTENER_SSL)
1552 michael 4499 {
1553 michael 7105 conf_error_report("TLS not available - port closed");
1554 michael 4499 break;
1555     }
1556 adx 30 #endif
1557    
1558 michael 3439 for (int i = $1; i <= $3; ++i)
1559 michael 6367 listener_add(i, block_state.addr.buf, block_state.flags.value);
1560 adx 30 }
1561     };
1562    
1563     listen_address: IP '=' QSTRING ';'
1564     {
1565 michael 967 if (conf_parser_ctx.pass == 2)
1566 michael 1646 strlcpy(block_state.addr.buf, yylval.string, sizeof(block_state.addr.buf));
1567 adx 30 };
1568    
1569     listen_host: HOST '=' QSTRING ';'
1570     {
1571 michael 967 if (conf_parser_ctx.pass == 2)
1572 michael 1646 strlcpy(block_state.addr.buf, yylval.string, sizeof(block_state.addr.buf));
1573 adx 30 };
1574    
1575 michael 6664
1576 adx 30 /***************************************************************************
1577 michael 6664 * auth {} section
1578 adx 30 ***************************************************************************/
1579     auth_entry: IRCD_AUTH
1580     {
1581 michael 967 if (conf_parser_ctx.pass == 2)
1582 michael 1646 reset_block_state();
1583 adx 30 } '{' auth_items '}' ';'
1584     {
1585 michael 4915 dlink_node *node = NULL;
1586 adx 30
1587 michael 1646 if (conf_parser_ctx.pass != 2)
1588     break;
1589 adx 30
1590 michael 4915 DLINK_FOREACH(node, block_state.mask.list.head)
1591 michael 1646 {
1592     struct MaskItem *conf = NULL;
1593     struct split_nuh_item nuh;
1594 michael 7318 char *s = node->data;
1595 adx 30
1596 michael 7318 if (EmptyString(s))
1597     continue;
1598    
1599     nuh.nuhmask = s;
1600 michael 1646 nuh.nickptr = NULL;
1601 michael 1647 nuh.userptr = block_state.user.buf;
1602     nuh.hostptr = block_state.host.buf;
1603 michael 1646 nuh.nicksize = 0;
1604 michael 1647 nuh.usersize = sizeof(block_state.user.buf);
1605     nuh.hostsize = sizeof(block_state.host.buf);
1606 michael 1646 split_nuh(&nuh);
1607 adx 30
1608 michael 1646 conf = conf_make(CONF_CLIENT);
1609 michael 2106 conf->user = xstrdup(block_state.user.buf);
1610     conf->host = xstrdup(block_state.host.buf);
1611 adx 30
1612 michael 1647 if (block_state.rpass.buf[0])
1613     conf->passwd = xstrdup(block_state.rpass.buf);
1614 michael 1646 if (block_state.name.buf[0])
1615 michael 1911 conf->name = xstrdup(block_state.name.buf);
1616 adx 30
1617 michael 1646 conf->flags = block_state.flags.value;
1618     conf->port = block_state.port.value;
1619 adx 30
1620 michael 1646 conf_add_class_to_conf(conf, block_state.class.buf);
1621     add_conf_by_address(CONF_CLIENT, conf);
1622 adx 30 }
1623 michael 2916 };
1624 adx 30
1625     auth_items: auth_items auth_item | auth_item;
1626 michael 3439 auth_item: auth_user |
1627     auth_passwd |
1628     auth_class |
1629     auth_flags |
1630     auth_spoof |
1631 michael 3441 auth_redir_serv |
1632 michael 3439 auth_redir_port |
1633     auth_encrypted |
1634     error ';' ;
1635 adx 30
1636     auth_user: USER '=' QSTRING ';'
1637     {
1638 michael 967 if (conf_parser_ctx.pass == 2)
1639 michael 1646 dlinkAdd(xstrdup(yylval.string), make_dlink_node(), &block_state.mask.list);
1640 adx 30 };
1641    
1642     auth_passwd: PASSWORD '=' QSTRING ';'
1643     {
1644 michael 967 if (conf_parser_ctx.pass == 2)
1645 michael 1647 strlcpy(block_state.rpass.buf, yylval.string, sizeof(block_state.rpass.buf));
1646 adx 30 };
1647    
1648     auth_class: CLASS '=' QSTRING ';'
1649     {
1650 michael 967 if (conf_parser_ctx.pass == 2)
1651 michael 1646 strlcpy(block_state.class.buf, yylval.string, sizeof(block_state.class.buf));
1652 adx 30 };
1653    
1654     auth_encrypted: ENCRYPTED '=' TBOOL ';'
1655     {
1656 michael 967 if (conf_parser_ctx.pass == 2)
1657 adx 30 {
1658     if (yylval.number)
1659 michael 1646 block_state.flags.value |= CONF_FLAGS_ENCRYPTED;
1660 adx 30 else
1661 michael 1646 block_state.flags.value &= ~CONF_FLAGS_ENCRYPTED;
1662 adx 30 }
1663     };
1664    
1665     auth_flags: IRCD_FLAGS
1666     {
1667 michael 1646 if (conf_parser_ctx.pass == 2)
1668 michael 2093 block_state.flags.value &= (CONF_FLAGS_ENCRYPTED | CONF_FLAGS_SPOOF_IP);
1669 adx 30 } '=' auth_flags_items ';';
1670    
1671     auth_flags_items: auth_flags_items ',' auth_flags_item | auth_flags_item;
1672 michael 1228 auth_flags_item: SPOOF_NOTICE
1673 adx 30 {
1674 michael 967 if (conf_parser_ctx.pass == 2)
1675 michael 1646 block_state.flags.value |= CONF_FLAGS_SPOOF_NOTICE;
1676 adx 30 } | EXCEED_LIMIT
1677     {
1678 michael 967 if (conf_parser_ctx.pass == 2)
1679 michael 1646 block_state.flags.value |= CONF_FLAGS_NOLIMIT;
1680 adx 30 } | KLINE_EXEMPT
1681     {
1682 michael 967 if (conf_parser_ctx.pass == 2)
1683 michael 1646 block_state.flags.value |= CONF_FLAGS_EXEMPTKLINE;
1684 michael 5985 } | XLINE_EXEMPT
1685     {
1686     if (conf_parser_ctx.pass == 2)
1687     block_state.flags.value |= CONF_FLAGS_EXEMPTXLINE;
1688 adx 30 } | NEED_IDENT
1689     {
1690 michael 967 if (conf_parser_ctx.pass == 2)
1691 michael 1646 block_state.flags.value |= CONF_FLAGS_NEED_IDENTD;
1692 adx 30 } | CAN_FLOOD
1693     {
1694 michael 967 if (conf_parser_ctx.pass == 2)
1695 michael 1646 block_state.flags.value |= CONF_FLAGS_CAN_FLOOD;
1696 adx 30 } | NO_TILDE
1697     {
1698 michael 967 if (conf_parser_ctx.pass == 2)
1699 michael 1646 block_state.flags.value |= CONF_FLAGS_NO_TILDE;
1700 adx 30 } | RESV_EXEMPT
1701     {
1702 michael 967 if (conf_parser_ctx.pass == 2)
1703 michael 1646 block_state.flags.value |= CONF_FLAGS_EXEMPTRESV;
1704 michael 1715 } | T_WEBIRC
1705     {
1706     if (conf_parser_ctx.pass == 2)
1707     block_state.flags.value |= CONF_FLAGS_WEBIRC;
1708 adx 30 } | NEED_PASSWORD
1709     {
1710 michael 967 if (conf_parser_ctx.pass == 2)
1711 michael 1646 block_state.flags.value |= CONF_FLAGS_NEED_PASSWORD;
1712 adx 30 };
1713    
1714 michael 2916 auth_spoof: SPOOF '=' QSTRING ';'
1715 adx 30 {
1716 michael 1646 if (conf_parser_ctx.pass != 2)
1717     break;
1718    
1719 michael 3441 if (valid_hostname(yylval.string))
1720 adx 30 {
1721 michael 1646 strlcpy(block_state.name.buf, yylval.string, sizeof(block_state.name.buf));
1722     block_state.flags.value |= CONF_FLAGS_SPOOF_IP;
1723 adx 30 }
1724 michael 1646 else
1725     ilog(LOG_TYPE_IRCD, "Spoof either is too long or contains invalid characters. Ignoring it.");
1726 adx 30 };
1727    
1728     auth_redir_serv: REDIRSERV '=' QSTRING ';'
1729     {
1730 michael 1646 if (conf_parser_ctx.pass != 2)
1731     break;
1732    
1733     strlcpy(block_state.name.buf, yylval.string, sizeof(block_state.name.buf));
1734     block_state.flags.value |= CONF_FLAGS_REDIR;
1735 adx 30 };
1736    
1737     auth_redir_port: REDIRPORT '=' NUMBER ';'
1738     {
1739 michael 1646 if (conf_parser_ctx.pass != 2)
1740     break;
1741 michael 1647
1742 michael 1646 block_state.flags.value |= CONF_FLAGS_REDIR;
1743     block_state.port.value = $3;
1744 adx 30 };
1745    
1746    
1747     /***************************************************************************
1748 michael 6664 * resv {} section
1749 adx 30 ***************************************************************************/
1750     resv_entry: RESV
1751     {
1752 michael 1647 if (conf_parser_ctx.pass != 2)
1753     break;
1754 adx 30
1755 michael 1647 reset_block_state();
1756     strlcpy(block_state.rpass.buf, CONF_NOREASON, sizeof(block_state.rpass.buf));
1757 michael 1823 } '{' resv_items '}' ';'
1758     {
1759 michael 1858 if (conf_parser_ctx.pass != 2)
1760     break;
1761    
1762 michael 7282 resv_make(block_state.name.buf, block_state.rpass.buf, &block_state.mask.list);
1763 michael 1823 };
1764 michael 1647
1765 michael 3439 resv_items: resv_items resv_item | resv_item;
1766     resv_item: resv_mask | resv_reason | resv_exempt | error ';' ;
1767 adx 30
1768 michael 1858 resv_mask: MASK '=' QSTRING ';'
1769 adx 30 {
1770 michael 967 if (conf_parser_ctx.pass == 2)
1771 michael 1858 strlcpy(block_state.name.buf, yylval.string, sizeof(block_state.name.buf));
1772 adx 30 };
1773    
1774 michael 1858 resv_reason: REASON '=' QSTRING ';'
1775 adx 30 {
1776 michael 1823 if (conf_parser_ctx.pass == 2)
1777 michael 1858 strlcpy(block_state.rpass.buf, yylval.string, sizeof(block_state.rpass.buf));
1778 adx 30 };
1779    
1780 michael 1858 resv_exempt: EXEMPT '=' QSTRING ';'
1781 adx 30 {
1782 michael 967 if (conf_parser_ctx.pass == 2)
1783 michael 1858 dlinkAdd(xstrdup(yylval.string), make_dlink_node(), &block_state.mask.list);
1784 adx 30 };
1785    
1786 michael 1858
1787 adx 30 /***************************************************************************
1788 michael 6664 * service {} section
1789 michael 1157 ***************************************************************************/
1790     service_entry: T_SERVICE '{' service_items '}' ';';
1791    
1792     service_items: service_items service_item | service_item;
1793     service_item: service_name | error;
1794    
1795     service_name: NAME '=' QSTRING ';'
1796     {
1797 michael 2129 if (conf_parser_ctx.pass != 2)
1798     break;
1799    
1800 michael 8660 if (server_valid_name(yylval.string) == true)
1801 michael 1157 {
1802 michael 7248 struct ServiceItem *service = service_make();
1803     service->name = xstrdup(yylval.string);
1804 michael 1157 }
1805     };
1806    
1807 michael 6664
1808 michael 1157 /***************************************************************************
1809 michael 6664 * shared {} section, for sharing remote klines etc.
1810 adx 30 ***************************************************************************/
1811     shared_entry: T_SHARED
1812     {
1813 michael 1647 if (conf_parser_ctx.pass != 2)
1814     break;
1815    
1816     reset_block_state();
1817    
1818     strlcpy(block_state.name.buf, "*", sizeof(block_state.name.buf));
1819     strlcpy(block_state.user.buf, "*", sizeof(block_state.user.buf));
1820     strlcpy(block_state.host.buf, "*", sizeof(block_state.host.buf));
1821     block_state.flags.value = SHARED_ALL;
1822 adx 30 } '{' shared_items '}' ';'
1823     {
1824 michael 1647 if (conf_parser_ctx.pass != 2)
1825     break;
1826    
1827 michael 7209 struct SharedItem *shared = shared_make();
1828     shared->type = block_state.flags.value;
1829     shared->server = xstrdup(block_state.name.buf);
1830     shared->user = xstrdup(block_state.user.buf);
1831     shared->host = xstrdup(block_state.host.buf);
1832 adx 30 };
1833    
1834     shared_items: shared_items shared_item | shared_item;
1835     shared_item: shared_name | shared_user | shared_type | error ';' ;
1836    
1837     shared_name: NAME '=' QSTRING ';'
1838     {
1839 michael 967 if (conf_parser_ctx.pass == 2)
1840 michael 1647 strlcpy(block_state.name.buf, yylval.string, sizeof(block_state.name.buf));
1841 adx 30 };
1842    
1843     shared_user: USER '=' QSTRING ';'
1844     {
1845 michael 967 if (conf_parser_ctx.pass == 2)
1846 adx 30 {
1847 michael 593 struct split_nuh_item nuh;
1848    
1849     nuh.nuhmask = yylval.string;
1850     nuh.nickptr = NULL;
1851 michael 1647 nuh.userptr = block_state.user.buf;
1852     nuh.hostptr = block_state.host.buf;
1853 michael 593
1854     nuh.nicksize = 0;
1855 michael 1647 nuh.usersize = sizeof(block_state.user.buf);
1856     nuh.hostsize = sizeof(block_state.host.buf);
1857 michael 593
1858     split_nuh(&nuh);
1859 adx 30 }
1860     };
1861    
1862     shared_type: TYPE
1863     {
1864 michael 967 if (conf_parser_ctx.pass == 2)
1865 michael 1647 block_state.flags.value = 0;
1866 adx 30 } '=' shared_types ';' ;
1867    
1868     shared_types: shared_types ',' shared_type_item | shared_type_item;
1869     shared_type_item: KLINE
1870     {
1871 michael 967 if (conf_parser_ctx.pass == 2)
1872 michael 1647 block_state.flags.value |= SHARED_KLINE;
1873 michael 1301 } | UNKLINE
1874 adx 30 {
1875 michael 967 if (conf_parser_ctx.pass == 2)
1876 michael 1647 block_state.flags.value |= SHARED_UNKLINE;
1877 michael 1301 } | T_DLINE
1878 adx 30 {
1879 michael 967 if (conf_parser_ctx.pass == 2)
1880 michael 1647 block_state.flags.value |= SHARED_DLINE;
1881 michael 1301 } | T_UNDLINE
1882     {
1883     if (conf_parser_ctx.pass == 2)
1884 michael 1647 block_state.flags.value |= SHARED_UNDLINE;
1885 adx 30 } | XLINE
1886     {
1887 michael 967 if (conf_parser_ctx.pass == 2)
1888 michael 1647 block_state.flags.value |= SHARED_XLINE;
1889 adx 30 } | T_UNXLINE
1890     {
1891 michael 967 if (conf_parser_ctx.pass == 2)
1892 michael 1647 block_state.flags.value |= SHARED_UNXLINE;
1893 adx 30 } | RESV
1894     {
1895 michael 967 if (conf_parser_ctx.pass == 2)
1896 michael 1647 block_state.flags.value |= SHARED_RESV;
1897 adx 30 } | T_UNRESV
1898     {
1899 michael 967 if (conf_parser_ctx.pass == 2)
1900 michael 1647 block_state.flags.value |= SHARED_UNRESV;
1901 adx 30 } | T_LOCOPS
1902     {
1903 michael 967 if (conf_parser_ctx.pass == 2)
1904 michael 1647 block_state.flags.value |= SHARED_LOCOPS;
1905 adx 30 } | T_ALL
1906     {
1907 michael 967 if (conf_parser_ctx.pass == 2)
1908 michael 1647 block_state.flags.value = SHARED_ALL;
1909 adx 30 };
1910    
1911 michael 6664
1912 adx 30 /***************************************************************************
1913 michael 6664 * cluster {} section
1914 adx 30 ***************************************************************************/
1915     cluster_entry: T_CLUSTER
1916     {
1917 michael 1647 if (conf_parser_ctx.pass != 2)
1918     break;
1919    
1920     reset_block_state();
1921    
1922     strlcpy(block_state.name.buf, "*", sizeof(block_state.name.buf));
1923 michael 7209 block_state.flags.value = CLUSTER_ALL;
1924 adx 30 } '{' cluster_items '}' ';'
1925     {
1926 michael 1647 if (conf_parser_ctx.pass != 2)
1927     break;
1928    
1929 michael 7209 struct ClusterItem *cluster = cluster_make();
1930     cluster->type = block_state.flags.value;
1931     cluster->server = xstrdup(block_state.name.buf);
1932 adx 30 };
1933    
1934 michael 3439 cluster_items: cluster_items cluster_item | cluster_item;
1935     cluster_item: cluster_name | cluster_type | error ';' ;
1936 adx 30
1937     cluster_name: NAME '=' QSTRING ';'
1938     {
1939 michael 967 if (conf_parser_ctx.pass == 2)
1940 michael 1647 strlcpy(block_state.name.buf, yylval.string, sizeof(block_state.name.buf));
1941 adx 30 };
1942    
1943     cluster_type: TYPE
1944     {
1945 michael 967 if (conf_parser_ctx.pass == 2)
1946 michael 1647 block_state.flags.value = 0;
1947 adx 30 } '=' cluster_types ';' ;
1948    
1949 michael 3439 cluster_types: cluster_types ',' cluster_type_item | cluster_type_item;
1950 adx 30 cluster_type_item: KLINE
1951     {
1952 michael 967 if (conf_parser_ctx.pass == 2)
1953 michael 7209 block_state.flags.value |= CLUSTER_KLINE;
1954 michael 1301 } | UNKLINE
1955 adx 30 {
1956 michael 967 if (conf_parser_ctx.pass == 2)
1957 michael 7209 block_state.flags.value |= CLUSTER_UNKLINE;
1958 michael 1301 } | T_DLINE
1959 adx 30 {
1960 michael 967 if (conf_parser_ctx.pass == 2)
1961 michael 7209 block_state.flags.value |= CLUSTER_DLINE;
1962 michael 1301 } | T_UNDLINE
1963     {
1964     if (conf_parser_ctx.pass == 2)
1965 michael 7209 block_state.flags.value |= CLUSTER_UNDLINE;
1966 adx 30 } | XLINE
1967     {
1968 michael 967 if (conf_parser_ctx.pass == 2)
1969 michael 7209 block_state.flags.value |= CLUSTER_XLINE;
1970 adx 30 } | T_UNXLINE
1971     {
1972 michael 967 if (conf_parser_ctx.pass == 2)
1973 michael 7209 block_state.flags.value |= CLUSTER_UNXLINE;
1974 adx 30 } | RESV
1975     {
1976 michael 967 if (conf_parser_ctx.pass == 2)
1977 michael 7209 block_state.flags.value |= CLUSTER_RESV;
1978 adx 30 } | T_UNRESV
1979     {
1980 michael 967 if (conf_parser_ctx.pass == 2)
1981 michael 7209 block_state.flags.value |= CLUSTER_UNRESV;
1982 adx 30 } | T_LOCOPS
1983     {
1984 michael 967 if (conf_parser_ctx.pass == 2)
1985 michael 7209 block_state.flags.value |= CLUSTER_LOCOPS;
1986 adx 30 } | T_ALL
1987     {
1988 michael 967 if (conf_parser_ctx.pass == 2)
1989 michael 7209 block_state.flags.value = CLUSTER_ALL;
1990 adx 30 };
1991    
1992 michael 6664
1993 adx 30 /***************************************************************************
1994 michael 6664 * connect {} section
1995 adx 30 ***************************************************************************/
1996 michael 2916 connect_entry: CONNECT
1997 adx 30 {
1998 michael 1265
1999 michael 1647 if (conf_parser_ctx.pass != 2)
2000     break;
2001    
2002     reset_block_state();
2003 michael 2397 block_state.aftype.value = AF_INET;
2004 michael 1647 block_state.port.value = PORTNUM;
2005 michael 1285 } '{' connect_items '}' ';'
2006 adx 30 {
2007 michael 1647 struct MaskItem *conf = NULL;
2008     struct addrinfo hints, *res;
2009    
2010     if (conf_parser_ctx.pass != 2)
2011     break;
2012    
2013 michael 1648 if (!block_state.name.buf[0] ||
2014     !block_state.host.buf[0])
2015 michael 1647 break;
2016    
2017 michael 2126 if (!block_state.rpass.buf[0] ||
2018     !block_state.spass.buf[0])
2019 michael 1647 break;
2020    
2021     if (has_wildcards(block_state.name.buf) ||
2022     has_wildcards(block_state.host.buf))
2023     break;
2024    
2025     conf = conf_make(CONF_SERVER);
2026     conf->port = block_state.port.value;
2027     conf->flags = block_state.flags.value;
2028     conf->aftype = block_state.aftype.value;
2029     conf->host = xstrdup(block_state.host.buf);
2030     conf->name = xstrdup(block_state.name.buf);
2031     conf->passwd = xstrdup(block_state.rpass.buf);
2032     conf->spasswd = xstrdup(block_state.spass.buf);
2033 michael 2228
2034     if (block_state.cert.buf[0])
2035     conf->certfp = xstrdup(block_state.cert.buf);
2036    
2037 michael 2252 if (block_state.ciph.buf[0])
2038     conf->cipher_list = xstrdup(block_state.ciph.buf);
2039 michael 1647
2040     dlinkMoveList(&block_state.leaf.list, &conf->leaf_list);
2041     dlinkMoveList(&block_state.hub.list, &conf->hub_list);
2042    
2043     if (block_state.bind.buf[0])
2044 adx 30 {
2045 michael 1647 memset(&hints, 0, sizeof(hints));
2046    
2047     hints.ai_family = AF_UNSPEC;
2048     hints.ai_socktype = SOCK_STREAM;
2049     hints.ai_flags = AI_PASSIVE | AI_NUMERICHOST;
2050    
2051     if (getaddrinfo(block_state.bind.buf, NULL, &hints, &res))
2052     ilog(LOG_TYPE_IRCD, "Invalid netmask for server vhost(%s)", block_state.bind.buf);
2053 michael 1302 else
2054     {
2055 michael 3443 assert(res);
2056 adx 30
2057 michael 1647 memcpy(&conf->bind, res->ai_addr, res->ai_addrlen);
2058     conf->bind.ss.ss_family = res->ai_family;
2059     conf->bind.ss_len = res->ai_addrlen;
2060     freeaddrinfo(res);
2061 michael 1302 }
2062 michael 1647 }
2063 adx 30
2064 michael 1647 conf_add_class_to_conf(conf, block_state.class.buf);
2065     lookup_confhost(conf);
2066 adx 30 };
2067    
2068     connect_items: connect_items connect_item | connect_item;
2069 michael 3439 connect_item: connect_name |
2070     connect_host |
2071     connect_vhost |
2072     connect_send_password |
2073     connect_accept_password |
2074     connect_ssl_certificate_fingerprint |
2075     connect_aftype |
2076     connect_port |
2077     connect_ssl_cipher_list |
2078     connect_flags |
2079     connect_hub_mask |
2080     connect_leaf_mask |
2081     connect_class |
2082     connect_encrypted |
2083 michael 1076 error ';' ;
2084 adx 30
2085     connect_name: NAME '=' QSTRING ';'
2086     {
2087 michael 967 if (conf_parser_ctx.pass == 2)
2088 michael 1647 strlcpy(block_state.name.buf, yylval.string, sizeof(block_state.name.buf));
2089 adx 30 };
2090    
2091 michael 2916 connect_host: HOST '=' QSTRING ';'
2092 adx 30 {
2093 michael 967 if (conf_parser_ctx.pass == 2)
2094 michael 1647 strlcpy(block_state.host.buf, yylval.string, sizeof(block_state.host.buf));
2095 adx 30 };
2096    
2097 michael 2916 connect_vhost: VHOST '=' QSTRING ';'
2098 adx 30 {
2099 michael 967 if (conf_parser_ctx.pass == 2)
2100 michael 1647 strlcpy(block_state.bind.buf, yylval.string, sizeof(block_state.bind.buf));
2101 adx 30 };
2102 michael 2916
2103 adx 30 connect_send_password: SEND_PASSWORD '=' QSTRING ';'
2104     {
2105 michael 1647 if (conf_parser_ctx.pass != 2)
2106     break;
2107 adx 30
2108 michael 1647 if ($3[0] == ':')
2109 michael 1752 conf_error_report("Server passwords cannot begin with a colon");
2110 michael 3443 else if (strchr($3, ' '))
2111 michael 1752 conf_error_report("Server passwords cannot contain spaces");
2112 michael 1647 else
2113     strlcpy(block_state.spass.buf, yylval.string, sizeof(block_state.spass.buf));
2114 adx 30 };
2115    
2116     connect_accept_password: ACCEPT_PASSWORD '=' QSTRING ';'
2117     {
2118 michael 1647 if (conf_parser_ctx.pass != 2)
2119     break;
2120 adx 30
2121 michael 1647 if ($3[0] == ':')
2122 michael 1752 conf_error_report("Server passwords cannot begin with a colon");
2123 michael 3443 else if (strchr($3, ' '))
2124 michael 1752 conf_error_report("Server passwords cannot contain spaces");
2125 michael 1647 else
2126     strlcpy(block_state.rpass.buf, yylval.string, sizeof(block_state.rpass.buf));
2127 adx 30 };
2128    
2129 michael 2244 connect_ssl_certificate_fingerprint: SSL_CERTIFICATE_FINGERPRINT '=' QSTRING ';'
2130 michael 2228 {
2131     if (conf_parser_ctx.pass == 2)
2132 michael 2229 strlcpy(block_state.cert.buf, yylval.string, sizeof(block_state.cert.buf));
2133 michael 2228 };
2134    
2135 adx 30 connect_port: PORT '=' NUMBER ';'
2136     {
2137 michael 967 if (conf_parser_ctx.pass == 2)
2138 michael 1647 block_state.port.value = $3;
2139 adx 30 };
2140    
2141     connect_aftype: AFTYPE '=' T_IPV4 ';'
2142     {
2143 michael 967 if (conf_parser_ctx.pass == 2)
2144 michael 1647 block_state.aftype.value = AF_INET;
2145 adx 30 } | AFTYPE '=' T_IPV6 ';'
2146     {
2147 michael 967 if (conf_parser_ctx.pass == 2)
2148 michael 1647 block_state.aftype.value = AF_INET6;
2149 adx 30 };
2150    
2151     connect_flags: IRCD_FLAGS
2152     {
2153 michael 1648 block_state.flags.value &= CONF_FLAGS_ENCRYPTED;
2154 adx 30 } '=' connect_flags_items ';';
2155    
2156     connect_flags_items: connect_flags_items ',' connect_flags_item | connect_flags_item;
2157 michael 1302 connect_flags_item: AUTOCONN
2158 adx 30 {
2159 michael 967 if (conf_parser_ctx.pass == 2)
2160 michael 1647 block_state.flags.value |= CONF_FLAGS_ALLOW_AUTO_CONN;
2161 michael 1303 } | T_SSL
2162     {
2163     if (conf_parser_ctx.pass == 2)
2164 michael 1647 block_state.flags.value |= CONF_FLAGS_SSL;
2165 michael 1228 };
2166 adx 30
2167     connect_encrypted: ENCRYPTED '=' TBOOL ';'
2168     {
2169 michael 967 if (conf_parser_ctx.pass == 2)
2170 adx 30 {
2171     if (yylval.number)
2172 michael 1647 block_state.flags.value |= CONF_FLAGS_ENCRYPTED;
2173 adx 30 else
2174 michael 1647 block_state.flags.value &= ~CONF_FLAGS_ENCRYPTED;
2175 adx 30 }
2176     };
2177    
2178 michael 2916 connect_hub_mask: HUB_MASK '=' QSTRING ';'
2179 adx 30 {
2180 michael 967 if (conf_parser_ctx.pass == 2)
2181 michael 1647 dlinkAdd(xstrdup(yylval.string), make_dlink_node(), &block_state.hub.list);
2182 adx 30 };
2183    
2184 michael 2916 connect_leaf_mask: LEAF_MASK '=' QSTRING ';'
2185 adx 30 {
2186 michael 967 if (conf_parser_ctx.pass == 2)
2187 michael 1647 dlinkAdd(xstrdup(yylval.string), make_dlink_node(), &block_state.leaf.list);
2188 adx 30 };
2189    
2190     connect_class: CLASS '=' QSTRING ';'
2191     {
2192 michael 967 if (conf_parser_ctx.pass == 2)
2193 michael 1647 strlcpy(block_state.class.buf, yylval.string, sizeof(block_state.class.buf));
2194 adx 30 };
2195    
2196 michael 1306 connect_ssl_cipher_list: T_SSL_CIPHER_LIST '=' QSTRING ';'
2197     {
2198 michael 7105 #ifdef HAVE_TLS
2199 michael 1306 if (conf_parser_ctx.pass == 2)
2200 michael 1647 strlcpy(block_state.ciph.buf, yylval.string, sizeof(block_state.ciph.buf));
2201 michael 1306 #else
2202     if (conf_parser_ctx.pass == 2)
2203 michael 7105 conf_error_report("Ignoring connect::ciphers -- no TLS support");
2204 michael 1306 #endif
2205     };
2206    
2207    
2208 adx 30 /***************************************************************************
2209 michael 6664 * kill {} section
2210 adx 30 ***************************************************************************/
2211     kill_entry: KILL
2212     {
2213 michael 967 if (conf_parser_ctx.pass == 2)
2214 michael 1647 reset_block_state();
2215 adx 30 } '{' kill_items '}' ';'
2216     {
2217 michael 1647 struct MaskItem *conf = NULL;
2218    
2219     if (conf_parser_ctx.pass != 2)
2220     break;
2221    
2222     if (!block_state.user.buf[0] ||
2223     !block_state.host.buf[0])
2224     break;
2225    
2226 michael 1921 conf = conf_make(CONF_KLINE);
2227     conf->user = xstrdup(block_state.user.buf);
2228     conf->host = xstrdup(block_state.host.buf);
2229 michael 1647
2230 michael 1921 if (block_state.rpass.buf[0])
2231     conf->reason = xstrdup(block_state.rpass.buf);
2232 michael 1647 else
2233 michael 1921 conf->reason = xstrdup(CONF_NOREASON);
2234     add_conf_by_address(CONF_KLINE, conf);
2235 michael 2916 };
2236 adx 30
2237     kill_items: kill_items kill_item | kill_item;
2238 michael 1921 kill_item: kill_user | kill_reason | error;
2239 adx 30
2240     kill_user: USER '=' QSTRING ';'
2241     {
2242 michael 1647
2243 michael 967 if (conf_parser_ctx.pass == 2)
2244 adx 30 {
2245 michael 593 struct split_nuh_item nuh;
2246 adx 30
2247 michael 593 nuh.nuhmask = yylval.string;
2248     nuh.nickptr = NULL;
2249 michael 1647 nuh.userptr = block_state.user.buf;
2250     nuh.hostptr = block_state.host.buf;
2251 adx 30
2252 michael 593 nuh.nicksize = 0;
2253 michael 1647 nuh.usersize = sizeof(block_state.user.buf);
2254     nuh.hostsize = sizeof(block_state.host.buf);
2255 adx 30
2256 michael 593 split_nuh(&nuh);
2257 adx 30 }
2258     };
2259    
2260 michael 2916 kill_reason: REASON '=' QSTRING ';'
2261 adx 30 {
2262 michael 967 if (conf_parser_ctx.pass == 2)
2263 michael 1647 strlcpy(block_state.rpass.buf, yylval.string, sizeof(block_state.rpass.buf));
2264 adx 30 };
2265    
2266 michael 6664
2267 adx 30 /***************************************************************************
2268 michael 6664 * deny {} section
2269 adx 30 ***************************************************************************/
2270 michael 2916 deny_entry: DENY
2271 adx 30 {
2272 michael 967 if (conf_parser_ctx.pass == 2)
2273 michael 1646 reset_block_state();
2274 adx 30 } '{' deny_items '}' ';'
2275     {
2276 michael 1646 struct MaskItem *conf = NULL;
2277    
2278     if (conf_parser_ctx.pass != 2)
2279     break;
2280    
2281     if (!block_state.addr.buf[0])
2282     break;
2283    
2284     if (parse_netmask(block_state.addr.buf, NULL, NULL) != HM_HOST)
2285 adx 30 {
2286 michael 1646 conf = conf_make(CONF_DLINE);
2287     conf->host = xstrdup(block_state.addr.buf);
2288 michael 1005
2289 michael 1647 if (block_state.rpass.buf[0])
2290     conf->reason = xstrdup(block_state.rpass.buf);
2291 michael 1646 else
2292     conf->reason = xstrdup(CONF_NOREASON);
2293     add_conf_by_address(CONF_DLINE, conf);
2294 adx 30 }
2295 michael 2916 };
2296 adx 30
2297     deny_items: deny_items deny_item | deny_item;
2298     deny_item: deny_ip | deny_reason | error;
2299    
2300     deny_ip: IP '=' QSTRING ';'
2301     {
2302 michael 967 if (conf_parser_ctx.pass == 2)
2303 michael 1646 strlcpy(block_state.addr.buf, yylval.string, sizeof(block_state.addr.buf));
2304 adx 30 };
2305    
2306 michael 2916 deny_reason: REASON '=' QSTRING ';'
2307 adx 30 {
2308 michael 967 if (conf_parser_ctx.pass == 2)
2309 michael 1647 strlcpy(block_state.rpass.buf, yylval.string, sizeof(block_state.rpass.buf));
2310 adx 30 };
2311    
2312 michael 6664
2313 adx 30 /***************************************************************************
2314 michael 6664 * exempt {} section
2315 adx 30 ***************************************************************************/
2316     exempt_entry: EXEMPT '{' exempt_items '}' ';';
2317    
2318 michael 6664 exempt_items: exempt_items exempt_item | exempt_item;
2319     exempt_item: exempt_ip | error;
2320 adx 30
2321     exempt_ip: IP '=' QSTRING ';'
2322     {
2323 michael 967 if (conf_parser_ctx.pass == 2)
2324 adx 30 {
2325 michael 6664 if (*yylval.string && parse_netmask(yylval.string, NULL, NULL) != HM_HOST)
2326 adx 30 {
2327 michael 1646 struct MaskItem *conf = conf_make(CONF_EXEMPT);
2328     conf->host = xstrdup(yylval.string);
2329 adx 30
2330 michael 1646 add_conf_by_address(CONF_EXEMPT, conf);
2331 adx 30 }
2332     }
2333     };
2334    
2335     /***************************************************************************
2336 michael 6664 * gecos {} section
2337 adx 30 ***************************************************************************/
2338     gecos_entry: GECOS
2339     {
2340 michael 967 if (conf_parser_ctx.pass == 2)
2341 michael 1646 reset_block_state();
2342 adx 30 } '{' gecos_items '}' ';'
2343     {
2344 michael 1646 if (conf_parser_ctx.pass != 2)
2345     break;
2346    
2347     if (!block_state.name.buf[0])
2348     break;
2349    
2350 michael 7304 struct GecosItem *gecos = gecos_make();
2351     gecos->mask = xstrdup(block_state.name.buf);
2352 adx 30
2353 michael 1647 if (block_state.rpass.buf[0])
2354 michael 7304 gecos->reason = xstrdup(block_state.rpass.buf);
2355 michael 1646 else
2356 michael 7304 gecos->reason = xstrdup(CONF_NOREASON);
2357 adx 30 };
2358    
2359     gecos_items: gecos_items gecos_item | gecos_item;
2360 michael 1921 gecos_item: gecos_name | gecos_reason | error;
2361 adx 30
2362 michael 2916 gecos_name: NAME '=' QSTRING ';'
2363 adx 30 {
2364 michael 967 if (conf_parser_ctx.pass == 2)
2365 michael 1646 strlcpy(block_state.name.buf, yylval.string, sizeof(block_state.name.buf));
2366 adx 30 };
2367    
2368 michael 2916 gecos_reason: REASON '=' QSTRING ';'
2369 adx 30 {
2370 michael 967 if (conf_parser_ctx.pass == 2)
2371 michael 1647 strlcpy(block_state.rpass.buf, yylval.string, sizeof(block_state.rpass.buf));
2372 adx 30 };
2373    
2374 michael 6664
2375 adx 30 /***************************************************************************
2376 michael 6664 * general {} section
2377 adx 30 ***************************************************************************/
2378 michael 6664 general_entry: GENERAL '{' general_items '}' ';';
2379 adx 30
2380     general_items: general_items general_item | general_item;
2381 michael 4313 general_item: general_away_count |
2382     general_away_time |
2383 michael 3439 general_ignore_bogus_ts |
2384     general_failed_oper_notice |
2385     general_anti_nick_flood |
2386     general_max_nick_time |
2387     general_max_nick_changes |
2388     general_max_accept |
2389 michael 7437 general_whowas_history_length |
2390 michael 3439 general_anti_spam_exit_message_time |
2391     general_ts_warn_delta |
2392     general_ts_max_delta |
2393 michael 1549 general_kill_chase_time_limit |
2394     general_invisible_on_connect |
2395 michael 3473 general_warn_no_connect_block |
2396 michael 3439 general_dots_in_ident |
2397 michael 5025 general_stats_i_oper_only |
2398     general_stats_k_oper_only |
2399     general_stats_m_oper_only |
2400 michael 3439 general_stats_o_oper_only |
2401 michael 5025 general_stats_P_oper_only |
2402     general_stats_u_oper_only |
2403 michael 3439 general_pace_wait |
2404     general_pace_wait_simple |
2405     general_short_motd |
2406     general_no_oper_flood |
2407     general_oper_only_umodes |
2408     general_max_targets |
2409     general_oper_umodes |
2410     general_caller_id_wait |
2411     general_opers_bypass_callerid |
2412     general_default_floodcount |
2413 michael 7858 general_default_floodtime |
2414 michael 3439 general_min_nonwildcard |
2415     general_min_nonwildcard_simple |
2416 michael 3877 general_throttle_count |
2417 michael 3439 general_throttle_time |
2418 michael 1072 general_ping_cookie |
2419 michael 2916 general_disable_auth |
2420 michael 3439 general_tkline_expire_notices |
2421 michael 5805 general_dline_min_cidr |
2422     general_dline_min_cidr6 |
2423     general_kline_min_cidr |
2424     general_kline_min_cidr6 |
2425 michael 3439 general_stats_e_disabled |
2426     general_max_watch |
2427     general_cycle_on_host_change |
2428     error;
2429 adx 30
2430    
2431 michael 4313 general_away_count: AWAY_COUNT '=' NUMBER ';'
2432     {
2433 michael 4340 ConfigGeneral.away_count = $3;
2434 michael 4313 };
2435    
2436     general_away_time: AWAY_TIME '=' timespec ';'
2437     {
2438 michael 4340 ConfigGeneral.away_time = $3;
2439 michael 4313 };
2440    
2441 michael 876 general_max_watch: MAX_WATCH '=' NUMBER ';'
2442     {
2443 michael 4340 ConfigGeneral.max_watch = $3;
2444 michael 876 };
2445 adx 30
2446 michael 7437 general_whowas_history_length: WHOWAS_HISTORY_LENGTH '=' NUMBER ';'
2447     {
2448     ConfigGeneral.whowas_history_length = $3;
2449     };
2450    
2451 michael 2283 general_cycle_on_host_change: CYCLE_ON_HOST_CHANGE '=' TBOOL ';'
2452     {
2453     if (conf_parser_ctx.pass == 2)
2454 michael 4340 ConfigGeneral.cycle_on_host_change = yylval.number;
2455 michael 2283 };
2456    
2457 michael 5805 general_dline_min_cidr: DLINE_MIN_CIDR '=' NUMBER ';'
2458 michael 1459 {
2459 michael 5805 ConfigGeneral.dline_min_cidr = $3;
2460 michael 1459 };
2461    
2462 michael 5805 general_dline_min_cidr6: DLINE_MIN_CIDR6 '=' NUMBER ';'
2463 michael 1459 {
2464 michael 5805 ConfigGeneral.dline_min_cidr6 = $3;
2465 michael 1459 };
2466    
2467 michael 5805 general_kline_min_cidr: KLINE_MIN_CIDR '=' NUMBER ';'
2468 michael 1459 {
2469 michael 5805 ConfigGeneral.kline_min_cidr = $3;
2470 michael 1459 };
2471    
2472 michael 5805 general_kline_min_cidr6: KLINE_MIN_CIDR6 '=' NUMBER ';'
2473 adx 30 {
2474 michael 5805 ConfigGeneral.kline_min_cidr6 = $3;
2475 adx 30 };
2476    
2477     general_tkline_expire_notices: TKLINE_EXPIRE_NOTICES '=' TBOOL ';'
2478     {
2479 michael 4340 ConfigGeneral.tkline_expire_notices = yylval.number;
2480 adx 30 };
2481    
2482 michael 1074 general_kill_chase_time_limit: KILL_CHASE_TIME_LIMIT '=' timespec ';'
2483 adx 30 {
2484 michael 4340 ConfigGeneral.kill_chase_time_limit = $3;
2485 adx 30 };
2486    
2487     general_ignore_bogus_ts: IGNORE_BOGUS_TS '=' TBOOL ';'
2488     {
2489 michael 4340 ConfigGeneral.ignore_bogus_ts = yylval.number;
2490 adx 30 };
2491    
2492     general_failed_oper_notice: FAILED_OPER_NOTICE '=' TBOOL ';'
2493     {
2494 michael 4340 ConfigGeneral.failed_oper_notice = yylval.number;
2495 adx 30 };
2496    
2497     general_anti_nick_flood: ANTI_NICK_FLOOD '=' TBOOL ';'
2498     {
2499 michael 4340 ConfigGeneral.anti_nick_flood = yylval.number;
2500 adx 30 };
2501    
2502     general_max_nick_time: MAX_NICK_TIME '=' timespec ';'
2503     {
2504 michael 4340 ConfigGeneral.max_nick_time = $3;
2505 adx 30 };
2506    
2507     general_max_nick_changes: MAX_NICK_CHANGES '=' NUMBER ';'
2508     {
2509 michael 4340 ConfigGeneral.max_nick_changes = $3;
2510 adx 30 };
2511    
2512     general_max_accept: MAX_ACCEPT '=' NUMBER ';'
2513     {
2514 michael 4340 ConfigGeneral.max_accept = $3;
2515 adx 30 };
2516    
2517     general_anti_spam_exit_message_time: ANTI_SPAM_EXIT_MESSAGE_TIME '=' timespec ';'
2518     {
2519 michael 4340 ConfigGeneral.anti_spam_exit_message_time = $3;
2520 adx 30 };
2521    
2522     general_ts_warn_delta: TS_WARN_DELTA '=' timespec ';'
2523     {
2524 michael 4340 ConfigGeneral.ts_warn_delta = $3;
2525 adx 30 };
2526    
2527     general_ts_max_delta: TS_MAX_DELTA '=' timespec ';'
2528     {
2529 michael 967 if (conf_parser_ctx.pass == 2)
2530 michael 4340 ConfigGeneral.ts_max_delta = $3;
2531 adx 30 };
2532    
2533     general_invisible_on_connect: INVISIBLE_ON_CONNECT '=' TBOOL ';'
2534     {
2535 michael 4340 ConfigGeneral.invisible_on_connect = yylval.number;
2536 adx 30 };
2537    
2538 michael 3473 general_warn_no_connect_block: WARN_NO_CONNECT_BLOCK '=' TBOOL ';'
2539 adx 30 {
2540 michael 4340 ConfigGeneral.warn_no_connect_block = yylval.number;
2541 adx 30 };
2542    
2543 michael 584 general_stats_e_disabled: STATS_E_DISABLED '=' TBOOL ';'
2544     {
2545 michael 4340 ConfigGeneral.stats_e_disabled = yylval.number;
2546 michael 584 };
2547    
2548 michael 5025 general_stats_m_oper_only: STATS_M_OPER_ONLY '=' TBOOL ';'
2549     {
2550     ConfigGeneral.stats_m_oper_only = yylval.number;
2551     };
2552    
2553 adx 30 general_stats_o_oper_only: STATS_O_OPER_ONLY '=' TBOOL ';'
2554     {
2555 michael 4340 ConfigGeneral.stats_o_oper_only = yylval.number;
2556 adx 30 };
2557    
2558     general_stats_P_oper_only: STATS_P_OPER_ONLY '=' TBOOL ';'
2559     {
2560 michael 4340 ConfigGeneral.stats_P_oper_only = yylval.number;
2561 adx 30 };
2562    
2563 michael 2269 general_stats_u_oper_only: STATS_U_OPER_ONLY '=' TBOOL ';'
2564     {
2565 michael 4340 ConfigGeneral.stats_u_oper_only = yylval.number;
2566 michael 2269 };
2567    
2568 adx 30 general_stats_k_oper_only: STATS_K_OPER_ONLY '=' TBOOL ';'
2569     {
2570 michael 4340 ConfigGeneral.stats_k_oper_only = 2 * yylval.number;
2571 adx 30 } | STATS_K_OPER_ONLY '=' TMASKED ';'
2572     {
2573 michael 4340 ConfigGeneral.stats_k_oper_only = 1;
2574 adx 30 };
2575    
2576     general_stats_i_oper_only: STATS_I_OPER_ONLY '=' TBOOL ';'
2577     {
2578 michael 4340 ConfigGeneral.stats_i_oper_only = 2 * yylval.number;
2579 adx 30 } | STATS_I_OPER_ONLY '=' TMASKED ';'
2580     {
2581 michael 4340 ConfigGeneral.stats_i_oper_only = 1;
2582 adx 30 };
2583    
2584     general_pace_wait: PACE_WAIT '=' timespec ';'
2585     {
2586 michael 4340 ConfigGeneral.pace_wait = $3;
2587 adx 30 };
2588    
2589     general_caller_id_wait: CALLER_ID_WAIT '=' timespec ';'
2590     {
2591 michael 4340 ConfigGeneral.caller_id_wait = $3;
2592 adx 30 };
2593    
2594     general_opers_bypass_callerid: OPERS_BYPASS_CALLERID '=' TBOOL ';'
2595     {
2596 michael 4340 ConfigGeneral.opers_bypass_callerid = yylval.number;
2597 adx 30 };
2598    
2599     general_pace_wait_simple: PACE_WAIT_SIMPLE '=' timespec ';'
2600     {
2601 michael 4340 ConfigGeneral.pace_wait_simple = $3;
2602 adx 30 };
2603    
2604     general_short_motd: SHORT_MOTD '=' TBOOL ';'
2605     {
2606 michael 4340 ConfigGeneral.short_motd = yylval.number;
2607 adx 30 };
2608 michael 2916
2609 adx 30 general_no_oper_flood: NO_OPER_FLOOD '=' TBOOL ';'
2610     {
2611 michael 4340 ConfigGeneral.no_oper_flood = yylval.number;
2612 adx 30 };
2613    
2614     general_dots_in_ident: DOTS_IN_IDENT '=' NUMBER ';'
2615     {
2616 michael 4340 ConfigGeneral.dots_in_ident = $3;
2617 adx 30 };
2618    
2619     general_max_targets: MAX_TARGETS '=' NUMBER ';'
2620     {
2621 michael 4340 ConfigGeneral.max_targets = $3;
2622 adx 30 };
2623    
2624     general_ping_cookie: PING_COOKIE '=' TBOOL ';'
2625     {
2626 michael 4340 ConfigGeneral.ping_cookie = yylval.number;
2627 adx 30 };
2628    
2629     general_disable_auth: DISABLE_AUTH '=' TBOOL ';'
2630     {
2631 michael 4340 ConfigGeneral.disable_auth = yylval.number;
2632 adx 30 };
2633    
2634 michael 3877 general_throttle_count: THROTTLE_COUNT '=' NUMBER ';'
2635     {
2636 michael 4340 ConfigGeneral.throttle_count = $3;
2637 michael 3877 };
2638    
2639 adx 30 general_throttle_time: THROTTLE_TIME '=' timespec ';'
2640     {
2641 michael 4340 ConfigGeneral.throttle_time = $3;
2642 adx 30 };
2643    
2644     general_oper_umodes: OPER_UMODES
2645     {
2646 michael 4340 ConfigGeneral.oper_umodes = 0;
2647 adx 30 } '=' umode_oitems ';' ;
2648    
2649     umode_oitems: umode_oitems ',' umode_oitem | umode_oitem;
2650     umode_oitem: T_BOTS
2651     {
2652 michael 4340 ConfigGeneral.oper_umodes |= UMODE_BOTS;
2653 adx 30 } | T_CCONN
2654     {
2655 michael 4340 ConfigGeneral.oper_umodes |= UMODE_CCONN;
2656 adx 30 } | T_DEAF
2657     {
2658 michael 4340 ConfigGeneral.oper_umodes |= UMODE_DEAF;
2659 adx 30 } | T_DEBUG
2660     {
2661 michael 4340 ConfigGeneral.oper_umodes |= UMODE_DEBUG;
2662 adx 30 } | T_FULL
2663     {
2664 michael 4340 ConfigGeneral.oper_umodes |= UMODE_FULL;
2665 michael 1294 } | HIDDEN
2666     {
2667 michael 4340 ConfigGeneral.oper_umodes |= UMODE_HIDDEN;
2668 michael 3513 } | HIDE_CHANS
2669     {
2670 michael 4340 ConfigGeneral.oper_umodes |= UMODE_HIDECHANS;
2671 michael 3506 } | HIDE_IDLE
2672     {
2673 michael 4340 ConfigGeneral.oper_umodes |= UMODE_HIDEIDLE;
2674 adx 30 } | T_SKILL
2675     {
2676 michael 4340 ConfigGeneral.oper_umodes |= UMODE_SKILL;
2677 adx 30 } | T_NCHANGE
2678     {
2679 michael 4340 ConfigGeneral.oper_umodes |= UMODE_NCHANGE;
2680 adx 30 } | T_REJ
2681     {
2682 michael 4340 ConfigGeneral.oper_umodes |= UMODE_REJ;
2683 adx 30 } | T_UNAUTH
2684     {
2685 michael 4340 ConfigGeneral.oper_umodes |= UMODE_UNAUTH;
2686 adx 30 } | T_SPY
2687     {
2688 michael 4340 ConfigGeneral.oper_umodes |= UMODE_SPY;
2689 adx 30 } | T_EXTERNAL
2690     {
2691 michael 4340 ConfigGeneral.oper_umodes |= UMODE_EXTERNAL;
2692 adx 30 } | T_SERVNOTICE
2693     {
2694 michael 4340 ConfigGeneral.oper_umodes |= UMODE_SERVNOTICE;
2695 adx 30 } | T_INVISIBLE
2696     {
2697 michael 4340 ConfigGeneral.oper_umodes |= UMODE_INVISIBLE;
2698 adx 30 } | T_WALLOP
2699     {
2700 michael 4340 ConfigGeneral.oper_umodes |= UMODE_WALLOP;
2701 adx 30 } | T_SOFTCALLERID
2702     {
2703 michael 4340 ConfigGeneral.oper_umodes |= UMODE_SOFTCALLERID;
2704 adx 30 } | T_CALLERID
2705     {
2706 michael 4340 ConfigGeneral.oper_umodes |= UMODE_CALLERID;
2707 adx 30 } | T_LOCOPS
2708     {
2709 michael 4340 ConfigGeneral.oper_umodes |= UMODE_LOCOPS;
2710 michael 1979 } | T_NONONREG
2711     {
2712 michael 4340 ConfigGeneral.oper_umodes |= UMODE_REGONLY;
2713 michael 1976 } | T_FARCONNECT
2714     {
2715 michael 4340 ConfigGeneral.oper_umodes |= UMODE_FARCONNECT;
2716 adx 30 };
2717    
2718 michael 2916 general_oper_only_umodes: OPER_ONLY_UMODES
2719 adx 30 {
2720 michael 4340 ConfigGeneral.oper_only_umodes = 0;
2721 adx 30 } '=' umode_items ';' ;
2722    
2723 michael 3439 umode_items: umode_items ',' umode_item | umode_item;
2724     umode_item: T_BOTS
2725 adx 30 {
2726 michael 4340 ConfigGeneral.oper_only_umodes |= UMODE_BOTS;
2727 adx 30 } | T_CCONN
2728     {
2729 michael 4340 ConfigGeneral.oper_only_umodes |= UMODE_CCONN;
2730 adx 30 } | T_DEAF
2731     {
2732 michael 4340 ConfigGeneral.oper_only_umodes |= UMODE_DEAF;
2733 adx 30 } | T_DEBUG
2734     {
2735 michael 4340 ConfigGeneral.oper_only_umodes |= UMODE_DEBUG;
2736 adx 30 } | T_FULL
2737 michael 2916 {
2738 michael 4340 ConfigGeneral.oper_only_umodes |= UMODE_FULL;
2739 adx 30 } | T_SKILL
2740     {
2741 michael 4340 ConfigGeneral.oper_only_umodes |= UMODE_SKILL;
2742 michael 1294 } | HIDDEN
2743     {
2744 michael 4340 ConfigGeneral.oper_only_umodes |= UMODE_HIDDEN;
2745 adx 30 } | T_NCHANGE
2746     {
2747 michael 4340 ConfigGeneral.oper_only_umodes |= UMODE_NCHANGE;
2748 adx 30 } | T_REJ
2749     {
2750 michael 4340 ConfigGeneral.oper_only_umodes |= UMODE_REJ;
2751 adx 30 } | T_UNAUTH
2752     {
2753 michael 4340 ConfigGeneral.oper_only_umodes |= UMODE_UNAUTH;
2754 adx 30 } | T_SPY
2755     {
2756 michael 4340 ConfigGeneral.oper_only_umodes |= UMODE_SPY;
2757 adx 30 } | T_EXTERNAL
2758     {
2759 michael 4340 ConfigGeneral.oper_only_umodes |= UMODE_EXTERNAL;
2760 adx 30 } | T_SERVNOTICE
2761     {
2762 michael 4340 ConfigGeneral.oper_only_umodes |= UMODE_SERVNOTICE;
2763 adx 30 } | T_INVISIBLE
2764     {
2765 michael 4340 ConfigGeneral.oper_only_umodes |= UMODE_INVISIBLE;
2766 adx 30 } | T_WALLOP
2767     {
2768 michael 4340 ConfigGeneral.oper_only_umodes |= UMODE_WALLOP;
2769 adx 30 } | T_SOFTCALLERID
2770     {
2771 michael 4340 ConfigGeneral.oper_only_umodes |= UMODE_SOFTCALLERID;
2772 adx 30 } | T_CALLERID
2773     {
2774 michael 4340 ConfigGeneral.oper_only_umodes |= UMODE_CALLERID;
2775 adx 30 } | T_LOCOPS
2776     {
2777 michael 4340 ConfigGeneral.oper_only_umodes |= UMODE_LOCOPS;
2778 michael 1855 } | T_NONONREG
2779     {
2780 michael 4340 ConfigGeneral.oper_only_umodes |= UMODE_REGONLY;
2781 michael 1976 } | T_FARCONNECT
2782     {
2783 michael 4340 ConfigGeneral.oper_only_umodes |= UMODE_FARCONNECT;
2784 adx 30 };
2785    
2786     general_min_nonwildcard: MIN_NONWILDCARD '=' NUMBER ';'
2787     {
2788 michael 4340 ConfigGeneral.min_nonwildcard = $3;
2789 adx 30 };
2790    
2791     general_min_nonwildcard_simple: MIN_NONWILDCARD_SIMPLE '=' NUMBER ';'
2792     {
2793 michael 4340 ConfigGeneral.min_nonwildcard_simple = $3;
2794 adx 30 };
2795    
2796     general_default_floodcount: DEFAULT_FLOODCOUNT '=' NUMBER ';'
2797     {
2798 michael 4340 ConfigGeneral.default_floodcount = $3;
2799 adx 30 };
2800    
2801 michael 7858 general_default_floodtime: DEFAULT_FLOODTIME '=' timespec ';'
2802     {
2803     ConfigGeneral.default_floodtime = $3;
2804     };
2805 adx 30
2806 michael 7858
2807 adx 30 /***************************************************************************
2808 michael 6664 * channel {} section
2809 adx 30 ***************************************************************************/
2810 michael 6664 channel_entry: CHANNEL '{' channel_items '}' ';';
2811 adx 30
2812     channel_items: channel_items channel_item | channel_item;
2813 michael 1495 channel_item: channel_max_bans |
2814 michael 8046 channel_max_bans_large |
2815 michael 3860 channel_invite_client_count |
2816     channel_invite_client_time |
2817 michael 6792 channel_invite_delay_channel |
2818 michael 7793 channel_invite_expire_time |
2819 michael 3860 channel_knock_client_count |
2820     channel_knock_client_time |
2821 michael 3439 channel_knock_delay_channel |
2822 michael 3933 channel_max_channels |
2823 michael 7766 channel_max_invites |
2824 michael 5489 channel_default_join_flood_count |
2825     channel_default_join_flood_time |
2826 michael 3439 channel_disable_fake_channels |
2827     error;
2828 adx 30
2829 michael 632 channel_disable_fake_channels: DISABLE_FAKE_CHANNELS '=' TBOOL ';'
2830     {
2831     ConfigChannel.disable_fake_channels = yylval.number;
2832     };
2833    
2834 michael 3860 channel_invite_client_count: INVITE_CLIENT_COUNT '=' NUMBER ';'
2835 adx 30 {
2836 michael 3860 ConfigChannel.invite_client_count = $3;
2837 adx 30 };
2838    
2839 michael 3860 channel_invite_client_time: INVITE_CLIENT_TIME '=' timespec ';'
2840 adx 30 {
2841 michael 3860 ConfigChannel.invite_client_time = $3;
2842 adx 30 };
2843    
2844 michael 6792 channel_invite_delay_channel: INVITE_DELAY_CHANNEL '=' timespec ';'
2845     {
2846     ConfigChannel.invite_delay_channel = $3;
2847     };
2848    
2849 michael 7793 channel_invite_expire_time: INVITE_EXPIRE_TIME '=' timespec ';'
2850     {
2851     ConfigChannel.invite_expire_time = $3;
2852     };
2853    
2854 michael 3860 channel_knock_client_count: KNOCK_CLIENT_COUNT '=' NUMBER ';'
2855 michael 3762 {
2856 michael 3860 ConfigChannel.knock_client_count = $3;
2857 michael 3762 };
2858    
2859 michael 3860 channel_knock_client_time: KNOCK_CLIENT_TIME '=' timespec ';'
2860 michael 3762 {
2861 michael 3860 ConfigChannel.knock_client_time = $3;
2862 michael 3762 };
2863    
2864 michael 3860 channel_knock_delay_channel: KNOCK_DELAY_CHANNEL '=' timespec ';'
2865     {
2866     ConfigChannel.knock_delay_channel = $3;
2867     };
2868    
2869 michael 3933 channel_max_channels: MAX_CHANNELS '=' NUMBER ';'
2870 adx 30 {
2871 michael 3933 ConfigChannel.max_channels = $3;
2872 adx 30 };
2873    
2874 michael 7766 channel_max_invites: MAX_INVITES '=' NUMBER ';'
2875     {
2876     ConfigChannel.max_invites = $3;
2877     };
2878    
2879 adx 30 channel_max_bans: MAX_BANS '=' NUMBER ';'
2880     {
2881     ConfigChannel.max_bans = $3;
2882     };
2883    
2884 michael 8046 channel_max_bans_large: MAX_BANS_LARGE '=' NUMBER ';'
2885     {
2886     ConfigChannel.max_bans_large = $3;
2887     };
2888    
2889 michael 5489 channel_default_join_flood_count: DEFAULT_JOIN_FLOOD_COUNT '=' NUMBER ';'
2890 adx 30 {
2891 michael 5489 ConfigChannel.default_join_flood_count = yylval.number;
2892 adx 30 };
2893    
2894 michael 5489 channel_default_join_flood_time: DEFAULT_JOIN_FLOOD_TIME '=' timespec ';'
2895 adx 30 {
2896 michael 5489 ConfigChannel.default_join_flood_time = $3;
2897 adx 30 };
2898    
2899 michael 6664
2900 adx 30 /***************************************************************************
2901 michael 6664 * serverhide {} section
2902 adx 30 ***************************************************************************/
2903 michael 6664 serverhide_entry: SERVERHIDE '{' serverhide_items '}' ';';
2904 adx 30
2905     serverhide_items: serverhide_items serverhide_item | serverhide_item;
2906 michael 3439 serverhide_item: serverhide_flatten_links |
2907 michael 6597 serverhide_flatten_links_delay |
2908 michael 6599 serverhide_flatten_links_file |
2909 michael 3439 serverhide_disable_remote_commands |
2910 michael 2196 serverhide_hide_servers |
2911 michael 3439 serverhide_hide_services |
2912     serverhide_hidden |
2913     serverhide_hidden_name |
2914     serverhide_hide_server_ips |
2915 adx 30 error;
2916    
2917     serverhide_flatten_links: FLATTEN_LINKS '=' TBOOL ';'
2918     {
2919 michael 967 if (conf_parser_ctx.pass == 2)
2920 adx 30 ConfigServerHide.flatten_links = yylval.number;
2921     };
2922    
2923 michael 6636 serverhide_flatten_links_delay: FLATTEN_LINKS_DELAY '=' timespec ';'
2924     {
2925     if (conf_parser_ctx.pass == 2)
2926     {
2927     if ($3 > 0)
2928     {
2929     event_write_links_file.when = $3;
2930     event_add(&event_write_links_file, NULL);
2931     }
2932     else
2933     event_delete(&event_write_links_file);
2934    
2935     ConfigServerHide.flatten_links_delay = $3;
2936     }
2937     };
2938    
2939     serverhide_flatten_links_file: FLATTEN_LINKS_FILE '=' QSTRING ';'
2940     {
2941     if (conf_parser_ctx.pass == 2)
2942     {
2943 michael 7032 xfree(ConfigServerHide.flatten_links_file);
2944 michael 6636 ConfigServerHide.flatten_links_file = xstrdup(yylval.string);
2945     }
2946     };
2947    
2948 michael 2196 serverhide_disable_remote_commands: DISABLE_REMOTE_COMMANDS '=' TBOOL ';'
2949     {
2950     if (conf_parser_ctx.pass == 2)
2951     ConfigServerHide.disable_remote_commands = yylval.number;
2952     };
2953    
2954 adx 30 serverhide_hide_servers: HIDE_SERVERS '=' TBOOL ';'
2955     {
2956 michael 967 if (conf_parser_ctx.pass == 2)
2957 adx 30 ConfigServerHide.hide_servers = yylval.number;
2958     };
2959    
2960 michael 1851 serverhide_hide_services: HIDE_SERVICES '=' TBOOL ';'
2961     {
2962     if (conf_parser_ctx.pass == 2)
2963     ConfigServerHide.hide_services = yylval.number;
2964     };
2965    
2966 adx 30 serverhide_hidden_name: HIDDEN_NAME '=' QSTRING ';'
2967     {
2968 michael 967 if (conf_parser_ctx.pass == 2)
2969 adx 30 {
2970 michael 7032 xfree(ConfigServerHide.hidden_name);
2971 michael 1646 ConfigServerHide.hidden_name = xstrdup(yylval.string);
2972 adx 30 }
2973     };
2974    
2975     serverhide_hidden: HIDDEN '=' TBOOL ';'
2976     {
2977 michael 967 if (conf_parser_ctx.pass == 2)
2978 adx 30 ConfigServerHide.hidden = yylval.number;
2979     };
2980    
2981     serverhide_hide_server_ips: HIDE_SERVER_IPS '=' TBOOL ';'
2982     {
2983 michael 967 if (conf_parser_ctx.pass == 2)
2984 adx 30 ConfigServerHide.hide_server_ips = yylval.number;
2985     };

Properties

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