ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/trunk/src/conf_parser.y
Revision: 8861
Committed: Fri Feb 15 21:30:36 2019 UTC (7 years, 7 months ago) by michael
File size: 74768 byte(s)
Log Message:
- config_parser.y: minor style corrections

File Contents

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

Properties

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