ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/trunk/src/conf_parser.y
Revision: 7234
Committed: Wed Feb 3 16:30:10 2016 UTC (10 years, 8 months ago) by michael
File size: 74187 byte(s)
Log Message:
- Move resv.* to conf_resv.*

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

Properties

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