ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/trunk/src/conf_parser.y
Revision: 7248
Committed: Thu Feb 4 17:21:58 2016 UTC (10 years, 8 months ago) by michael
File size: 74213 byte(s)
Log Message:
- Move service {} block configuration management into its own module

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

Properties

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