ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/trunk/src/conf_parser.y
Revision: 8792
Committed: Thu Jan 17 18:35:32 2019 UTC (7 years, 8 months ago) by michael
File size: 74816 byte(s)
Log Message:
- No longer enforce a lower limit of MAXCLIENTS_MIN on GlobalSetOptions.maxclients and ConfigServerInfo.default_max_clients

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 4340 if (conf_parser_ctx.pass == 2 && !ConfigServerInfo.name)
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 4340 if (conf_parser_ctx.pass == 2 && !ConfigServerInfo.sid)
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 5489 ConfigServerInfo.default_max_clients = MAXCLIENTS_MAX;
660 michael 1736 }
661     else
662 michael 5489 ConfigServerInfo.default_max_clients = $3;
663 adx 30 };
664    
665 michael 1751 serverinfo_max_nick_length: MAX_NICK_LENGTH '=' NUMBER ';'
666     {
667     if (conf_parser_ctx.pass != 2)
668     break;
669    
670     if ($3 < 9)
671     {
672     conf_error_report("max_nick_length too low, setting to 9");
673 michael 4340 ConfigServerInfo.max_nick_length = 9;
674 michael 1751 }
675     else if ($3 > NICKLEN)
676     {
677 michael 3443 char buf[IRCD_BUFSIZE] = "";
678 michael 1751
679     snprintf(buf, sizeof(buf), "max_nick_length too high, setting to %d", NICKLEN);
680     conf_error_report(buf);
681 michael 4340 ConfigServerInfo.max_nick_length = NICKLEN;
682 michael 1751 }
683     else
684 michael 4340 ConfigServerInfo.max_nick_length = $3;
685 michael 1751 };
686    
687     serverinfo_max_topic_length: MAX_TOPIC_LENGTH '=' NUMBER ';'
688     {
689     if (conf_parser_ctx.pass != 2)
690     break;
691    
692     if ($3 < 80)
693     {
694     conf_error_report("max_topic_length too low, setting to 80");
695 michael 4340 ConfigServerInfo.max_topic_length = 80;
696 michael 1751 }
697     else if ($3 > TOPICLEN)
698     {
699 michael 3443 char buf[IRCD_BUFSIZE] = "";
700 michael 1751
701     snprintf(buf, sizeof(buf), "max_topic_length too high, setting to %d", TOPICLEN);
702     conf_error_report(buf);
703 michael 4340 ConfigServerInfo.max_topic_length = TOPICLEN;
704 michael 1751 }
705     else
706 michael 4340 ConfigServerInfo.max_topic_length = $3;
707 michael 1751 };
708    
709 michael 2916 serverinfo_hub: HUB '=' TBOOL ';'
710 adx 30 {
711 michael 967 if (conf_parser_ctx.pass == 2)
712 michael 4340 ConfigServerInfo.hub = yylval.number;
713 adx 30 };
714    
715 michael 6664
716 adx 30 /***************************************************************************
717 michael 6664 * admin {} section
718 adx 30 ***************************************************************************/
719     admin_entry: ADMIN '{' admin_items '}' ';' ;
720    
721     admin_items: admin_items admin_item | admin_item;
722 michael 3439 admin_item: admin_name |
723     admin_description |
724     admin_email |
725     error ';' ;
726 adx 30
727 michael 2916 admin_name: NAME '=' QSTRING ';'
728 adx 30 {
729 michael 2129 if (conf_parser_ctx.pass != 2)
730     break;
731    
732 michael 7032 xfree(ConfigAdminInfo.name);
733 michael 4340 ConfigAdminInfo.name = xstrdup(yylval.string);
734 adx 30 };
735    
736     admin_email: EMAIL '=' QSTRING ';'
737     {
738 michael 2129 if (conf_parser_ctx.pass != 2)
739     break;
740    
741 michael 7032 xfree(ConfigAdminInfo.email);
742 michael 4340 ConfigAdminInfo.email = xstrdup(yylval.string);
743 adx 30 };
744    
745     admin_description: DESCRIPTION '=' QSTRING ';'
746     {
747 michael 2129 if (conf_parser_ctx.pass != 2)
748     break;
749    
750 michael 7032 xfree(ConfigAdminInfo.description);
751 michael 4340 ConfigAdminInfo.description = xstrdup(yylval.string);
752 adx 30 };
753    
754 michael 6664
755 adx 30 /***************************************************************************
756 michael 6664 * motd {} section
757 michael 2150 ***************************************************************************/
758 michael 2916 motd_entry: MOTD
759 michael 2150 {
760     if (conf_parser_ctx.pass == 2)
761     reset_block_state();
762     } '{' motd_items '}' ';'
763     {
764 michael 4915 dlink_node *node = NULL;
765 michael 2150
766     if (conf_parser_ctx.pass != 2)
767     break;
768    
769     if (!block_state.file.buf[0])
770     break;
771    
772 michael 4915 DLINK_FOREACH(node, block_state.mask.list.head)
773     motd_add(node->data, block_state.file.buf);
774 michael 2150 };
775    
776     motd_items: motd_items motd_item | motd_item;
777     motd_item: motd_mask | motd_file | error ';' ;
778    
779 michael 2916 motd_mask: MASK '=' QSTRING ';'
780 michael 2150 {
781     if (conf_parser_ctx.pass == 2)
782     dlinkAdd(xstrdup(yylval.string), make_dlink_node(), &block_state.mask.list);
783     };
784    
785     motd_file: T_FILE '=' QSTRING ';'
786     {
787     if (conf_parser_ctx.pass == 2)
788     strlcpy(block_state.file.buf, yylval.string, sizeof(block_state.file.buf));
789     };
790    
791 michael 6664
792 michael 2150 /***************************************************************************
793 michael 6664 * pseudo {} section
794 michael 4545 ***************************************************************************/
795     pseudo_entry: T_PSEUDO
796     {
797     if (conf_parser_ctx.pass == 2)
798     reset_block_state();
799     } '{' pseudo_items '}' ';'
800     {
801     if (conf_parser_ctx.pass != 2)
802     break;
803    
804     if (!block_state.command.buf[0] ||
805     !block_state.name.buf[0] ||
806     !block_state.nick.buf[0] ||
807     !block_state.host.buf[0])
808     break;
809    
810     pseudo_register(block_state.name.buf, block_state.nick.buf, block_state.host.buf,
811     block_state.prepend.buf, block_state.command.buf);
812     };
813    
814     pseudo_items: pseudo_items pseudo_item | pseudo_item;
815     pseudo_item: pseudo_command | pseudo_prepend | pseudo_name | pseudo_target | error ';' ;
816    
817     pseudo_command: T_COMMAND '=' QSTRING ';'
818     {
819     if (conf_parser_ctx.pass == 2)
820     strlcpy(block_state.command.buf, yylval.string, sizeof(block_state.command.buf));
821     };
822    
823     pseudo_name: NAME '=' QSTRING ';'
824     {
825     if (conf_parser_ctx.pass == 2)
826     strlcpy(block_state.name.buf, yylval.string, sizeof(block_state.name.buf));
827     };
828    
829     pseudo_prepend: T_PREPEND '=' QSTRING ';'
830     {
831     if (conf_parser_ctx.pass == 2)
832     strlcpy(block_state.prepend.buf, yylval.string, sizeof(block_state.prepend.buf));
833     };
834    
835     pseudo_target: T_TARGET '=' QSTRING ';'
836     {
837     if (conf_parser_ctx.pass == 2)
838     {
839     struct split_nuh_item nuh;
840    
841     nuh.nuhmask = yylval.string;
842     nuh.nickptr = NULL;
843 michael 5602 nuh.userptr = block_state.nick.buf;
844 michael 4545 nuh.hostptr = block_state.host.buf;
845     nuh.nicksize = 0;
846     nuh.usersize = sizeof(block_state.nick.buf);
847     nuh.hostsize = sizeof(block_state.host.buf);
848 michael 5602
849 michael 4545 split_nuh(&nuh);
850     }
851     };
852    
853 michael 6664
854 michael 4545 /***************************************************************************
855 michael 6664 * log {} section
856 adx 30 ***************************************************************************/
857 michael 1247 logging_entry: T_LOG '{' logging_items '}' ';' ;
858     logging_items: logging_items logging_item | logging_item ;
859 adx 30
860 michael 3439 logging_item: logging_use_logging | logging_file_entry |
861     error ';' ;
862 adx 30
863 michael 1247 logging_use_logging: USE_LOGGING '=' TBOOL ';'
864 adx 30 {
865 michael 967 if (conf_parser_ctx.pass == 2)
866 michael 4340 ConfigLog.use_logging = yylval.number;
867 adx 30 };
868    
869 michael 1247 logging_file_entry:
870 adx 30 {
871 michael 1647 if (conf_parser_ctx.pass == 2)
872     reset_block_state();
873 michael 1247 } T_FILE '{' logging_file_items '}' ';'
874 adx 30 {
875 michael 1647 if (conf_parser_ctx.pass != 2)
876     break;
877    
878     if (block_state.type.value && block_state.file.buf[0])
879 michael 1831 log_set_file(block_state.type.value, block_state.size.value,
880 michael 1647 block_state.file.buf);
881 adx 30 };
882    
883 michael 1247 logging_file_items: logging_file_items logging_file_item |
884     logging_file_item ;
885 adx 30
886 michael 1247 logging_file_item: logging_file_name | logging_file_type |
887     logging_file_size | error ';' ;
888    
889     logging_file_name: NAME '=' QSTRING ';'
890 adx 30 {
891 michael 1647 if (conf_parser_ctx.pass != 2)
892     break;
893    
894     strlcpy(block_state.file.buf, yylval.string, sizeof(block_state.file.buf));
895 michael 1247 }
896 adx 30
897 michael 1247 logging_file_size: T_SIZE '=' sizespec ';'
898 adx 30 {
899 michael 1647 block_state.size.value = $3;
900 michael 1250 } | T_SIZE '=' T_UNLIMITED ';'
901     {
902 michael 1647 block_state.size.value = 0;
903 adx 30 };
904    
905 michael 1247 logging_file_type: TYPE
906 adx 30 {
907 michael 967 if (conf_parser_ctx.pass == 2)
908 michael 1647 block_state.type.value = 0;
909 michael 1247 } '=' logging_file_type_items ';' ;
910 adx 30
911 michael 1247 logging_file_type_items: logging_file_type_items ',' logging_file_type_item | logging_file_type_item;
912     logging_file_type_item: USER
913 adx 30 {
914 michael 967 if (conf_parser_ctx.pass == 2)
915 michael 1647 block_state.type.value = LOG_TYPE_USER;
916 michael 1247 } | OPERATOR
917 adx 30 {
918 michael 967 if (conf_parser_ctx.pass == 2)
919 michael 1647 block_state.type.value = LOG_TYPE_OPER;
920 michael 2336 } | XLINE
921     {
922     if (conf_parser_ctx.pass == 2)
923     block_state.type.value = LOG_TYPE_XLINE;
924     } | RESV
925     {
926     if (conf_parser_ctx.pass == 2)
927     block_state.type.value = LOG_TYPE_RESV;
928 michael 1247 } | T_DLINE
929 adx 30 {
930 michael 967 if (conf_parser_ctx.pass == 2)
931 michael 1647 block_state.type.value = LOG_TYPE_DLINE;
932 michael 1247 } | KLINE
933 adx 30 {
934 michael 967 if (conf_parser_ctx.pass == 2)
935 michael 1647 block_state.type.value = LOG_TYPE_KLINE;
936 michael 1247 } | KILL
937 adx 30 {
938 michael 967 if (conf_parser_ctx.pass == 2)
939 michael 1647 block_state.type.value = LOG_TYPE_KILL;
940 michael 1247 } | T_DEBUG
941 adx 30 {
942 michael 967 if (conf_parser_ctx.pass == 2)
943 michael 1647 block_state.type.value = LOG_TYPE_DEBUG;
944 adx 30 };
945    
946 michael 1247
947 adx 30 /***************************************************************************
948 michael 6664 * operator {} section
949 adx 30 ***************************************************************************/
950 michael 2916 oper_entry: OPERATOR
951 adx 30 {
952 michael 1646 if (conf_parser_ctx.pass != 2)
953     break;
954    
955     reset_block_state();
956     block_state.flags.value |= CONF_FLAGS_ENCRYPTED;
957 michael 1285 } '{' oper_items '}' ';'
958 adx 30 {
959 michael 4915 dlink_node *node = NULL;
960 adx 30
961 michael 1646 if (conf_parser_ctx.pass != 2)
962     break;
963 adx 30
964 michael 1646 if (!block_state.name.buf[0])
965     break;
966 michael 6662
967 michael 1647 if (!block_state.rpass.buf[0])
968 michael 1646 break;
969 adx 30
970 michael 4915 DLINK_FOREACH(node, block_state.mask.list.head)
971 michael 1646 {
972     struct MaskItem *conf = NULL;
973     struct split_nuh_item nuh;
974 michael 7318 char *s = node->data;
975 adx 30
976 michael 7318 if (EmptyString(s))
977     continue;
978    
979     nuh.nuhmask = s;
980 michael 1646 nuh.nickptr = NULL;
981 michael 1647 nuh.userptr = block_state.user.buf;
982     nuh.hostptr = block_state.host.buf;
983 michael 1646 nuh.nicksize = 0;
984 michael 1647 nuh.usersize = sizeof(block_state.user.buf);
985     nuh.hostsize = sizeof(block_state.host.buf);
986 michael 1646 split_nuh(&nuh);
987 adx 30
988 michael 2228 conf = conf_make(CONF_OPER);
989     conf->name = xstrdup(block_state.name.buf);
990     conf->user = xstrdup(block_state.user.buf);
991     conf->host = xstrdup(block_state.host.buf);
992 michael 1285
993 michael 2228 if (block_state.cert.buf[0])
994     conf->certfp = xstrdup(block_state.cert.buf);
995    
996 michael 1647 if (block_state.rpass.buf[0])
997     conf->passwd = xstrdup(block_state.rpass.buf);
998 michael 1285
999 michael 5556 if (block_state.whois.buf[0])
1000     conf->whois = xstrdup(block_state.whois.buf);
1001    
1002 michael 1646 conf->flags = block_state.flags.value;
1003     conf->modes = block_state.modes.value;
1004     conf->port = block_state.port.value;
1005     conf->htype = parse_netmask(conf->host, &conf->addr, &conf->bits);
1006 adx 30
1007 michael 1646 conf_add_class_to_conf(conf, block_state.class.buf);
1008 adx 30 }
1009 michael 1646 };
1010 adx 30
1011     oper_items: oper_items oper_item | oper_item;
1012 michael 3439 oper_item: oper_name |
1013     oper_user |
1014     oper_password |
1015 michael 5556 oper_whois |
1016 michael 3439 oper_umodes |
1017     oper_class |
1018     oper_encrypted |
1019     oper_ssl_certificate_fingerprint |
1020     oper_ssl_connection_required |
1021     oper_flags |
1022     error ';' ;
1023 adx 30
1024     oper_name: NAME '=' QSTRING ';'
1025     {
1026 michael 967 if (conf_parser_ctx.pass == 2)
1027 michael 1646 strlcpy(block_state.name.buf, yylval.string, sizeof(block_state.name.buf));
1028 adx 30 };
1029    
1030     oper_user: USER '=' QSTRING ';'
1031     {
1032 michael 967 if (conf_parser_ctx.pass == 2)
1033 michael 1646 dlinkAdd(xstrdup(yylval.string), make_dlink_node(), &block_state.mask.list);
1034 adx 30 };
1035    
1036     oper_password: PASSWORD '=' QSTRING ';'
1037     {
1038 michael 967 if (conf_parser_ctx.pass == 2)
1039 michael 1647 strlcpy(block_state.rpass.buf, yylval.string, sizeof(block_state.rpass.buf));
1040 adx 30 };
1041    
1042 michael 5556 oper_whois: WHOIS '=' QSTRING ';'
1043     {
1044     if (conf_parser_ctx.pass == 2)
1045     strlcpy(block_state.whois.buf, yylval.string, sizeof(block_state.whois.buf));
1046     };
1047    
1048 adx 30 oper_encrypted: ENCRYPTED '=' TBOOL ';'
1049     {
1050 michael 2129 if (conf_parser_ctx.pass != 2)
1051     break;
1052    
1053     if (yylval.number)
1054     block_state.flags.value |= CONF_FLAGS_ENCRYPTED;
1055     else
1056     block_state.flags.value &= ~CONF_FLAGS_ENCRYPTED;
1057 adx 30 };
1058    
1059 michael 2244 oper_ssl_certificate_fingerprint: SSL_CERTIFICATE_FINGERPRINT '=' QSTRING ';'
1060 michael 2228 {
1061     if (conf_parser_ctx.pass == 2)
1062 michael 2229 strlcpy(block_state.cert.buf, yylval.string, sizeof(block_state.cert.buf));
1063 michael 2228 };
1064    
1065 michael 2248 oper_ssl_connection_required: SSL_CONNECTION_REQUIRED '=' TBOOL ';'
1066     {
1067     if (conf_parser_ctx.pass != 2)
1068     break;
1069    
1070     if (yylval.number)
1071     block_state.flags.value |= CONF_FLAGS_SSL;
1072     else
1073     block_state.flags.value &= ~CONF_FLAGS_SSL;
1074     };
1075    
1076 adx 30 oper_class: CLASS '=' QSTRING ';'
1077     {
1078 michael 967 if (conf_parser_ctx.pass == 2)
1079 michael 1646 strlcpy(block_state.class.buf, yylval.string, sizeof(block_state.class.buf));
1080 adx 30 };
1081    
1082 michael 56 oper_umodes: T_UMODES
1083     {
1084 michael 967 if (conf_parser_ctx.pass == 2)
1085 michael 1646 block_state.modes.value = 0;
1086 michael 56 } '=' oper_umodes_items ';' ;
1087    
1088     oper_umodes_items: oper_umodes_items ',' oper_umodes_item | oper_umodes_item;
1089     oper_umodes_item: T_BOTS
1090     {
1091 michael 967 if (conf_parser_ctx.pass == 2)
1092 michael 1646 block_state.modes.value |= UMODE_BOTS;
1093 michael 56 } | T_CCONN
1094     {
1095 michael 967 if (conf_parser_ctx.pass == 2)
1096 michael 1646 block_state.modes.value |= UMODE_CCONN;
1097 michael 56 } | T_DEAF
1098     {
1099 michael 967 if (conf_parser_ctx.pass == 2)
1100 michael 1646 block_state.modes.value |= UMODE_DEAF;
1101 michael 56 } | T_DEBUG
1102     {
1103 michael 967 if (conf_parser_ctx.pass == 2)
1104 michael 1646 block_state.modes.value |= UMODE_DEBUG;
1105 michael 56 } | T_FULL
1106     {
1107 michael 967 if (conf_parser_ctx.pass == 2)
1108 michael 1646 block_state.modes.value |= UMODE_FULL;
1109 michael 1294 } | HIDDEN
1110     {
1111     if (conf_parser_ctx.pass == 2)
1112 michael 1646 block_state.modes.value |= UMODE_HIDDEN;
1113 michael 3513 } | HIDE_CHANS
1114     {
1115     if (conf_parser_ctx.pass == 2)
1116     block_state.modes.value |= UMODE_HIDECHANS;
1117 michael 3506 } | HIDE_IDLE
1118     {
1119     if (conf_parser_ctx.pass == 2)
1120     block_state.modes.value |= UMODE_HIDEIDLE;
1121 michael 56 } | T_SKILL
1122     {
1123 michael 967 if (conf_parser_ctx.pass == 2)
1124 michael 1646 block_state.modes.value |= UMODE_SKILL;
1125 michael 56 } | T_NCHANGE
1126     {
1127 michael 967 if (conf_parser_ctx.pass == 2)
1128 michael 1646 block_state.modes.value |= UMODE_NCHANGE;
1129 michael 56 } | T_REJ
1130     {
1131 michael 967 if (conf_parser_ctx.pass == 2)
1132 michael 1646 block_state.modes.value |= UMODE_REJ;
1133 michael 56 } | T_UNAUTH
1134     {
1135 michael 967 if (conf_parser_ctx.pass == 2)
1136 michael 1646 block_state.modes.value |= UMODE_UNAUTH;
1137 michael 56 } | T_SPY
1138     {
1139 michael 967 if (conf_parser_ctx.pass == 2)
1140 michael 1646 block_state.modes.value |= UMODE_SPY;
1141 michael 56 } | T_EXTERNAL
1142     {
1143 michael 967 if (conf_parser_ctx.pass == 2)
1144 michael 1646 block_state.modes.value |= UMODE_EXTERNAL;
1145 michael 56 } | T_SERVNOTICE
1146     {
1147 michael 967 if (conf_parser_ctx.pass == 2)
1148 michael 1646 block_state.modes.value |= UMODE_SERVNOTICE;
1149 michael 56 } | T_INVISIBLE
1150     {
1151 michael 967 if (conf_parser_ctx.pass == 2)
1152 michael 1646 block_state.modes.value |= UMODE_INVISIBLE;
1153 michael 56 } | T_WALLOP
1154     {
1155 michael 967 if (conf_parser_ctx.pass == 2)
1156 michael 1646 block_state.modes.value |= UMODE_WALLOP;
1157 michael 56 } | T_SOFTCALLERID
1158     {
1159 michael 967 if (conf_parser_ctx.pass == 2)
1160 michael 1646 block_state.modes.value |= UMODE_SOFTCALLERID;
1161 michael 56 } | T_CALLERID
1162     {
1163 michael 967 if (conf_parser_ctx.pass == 2)
1164 michael 1646 block_state.modes.value |= UMODE_CALLERID;
1165 michael 56 } | T_LOCOPS
1166     {
1167 michael 967 if (conf_parser_ctx.pass == 2)
1168 michael 1646 block_state.modes.value |= UMODE_LOCOPS;
1169 michael 1855 } | T_NONONREG
1170     {
1171     if (conf_parser_ctx.pass == 2)
1172     block_state.modes.value |= UMODE_REGONLY;
1173 michael 1976 } | T_FARCONNECT
1174     {
1175     if (conf_parser_ctx.pass == 2)
1176     block_state.modes.value |= UMODE_FARCONNECT;
1177 michael 56 };
1178    
1179 adx 30 oper_flags: IRCD_FLAGS
1180     {
1181 michael 1228 if (conf_parser_ctx.pass == 2)
1182 michael 1646 block_state.port.value = 0;
1183 adx 30 } '=' oper_flags_items ';';
1184    
1185     oper_flags_items: oper_flags_items ',' oper_flags_item | oper_flags_item;
1186 michael 2012 oper_flags_item: KILL ':' REMOTE
1187 adx 30 {
1188 michael 967 if (conf_parser_ctx.pass == 2)
1189 michael 2012 block_state.port.value |= OPER_FLAG_KILL_REMOTE;
1190     } | KILL
1191 adx 30 {
1192 michael 967 if (conf_parser_ctx.pass == 2)
1193 michael 2012 block_state.port.value |= OPER_FLAG_KILL;
1194     } | CONNECT ':' REMOTE
1195     {
1196     if (conf_parser_ctx.pass == 2)
1197     block_state.port.value |= OPER_FLAG_CONNECT_REMOTE;
1198     } | CONNECT
1199     {
1200     if (conf_parser_ctx.pass == 2)
1201     block_state.port.value |= OPER_FLAG_CONNECT;
1202     } | SQUIT ':' REMOTE
1203     {
1204     if (conf_parser_ctx.pass == 2)
1205     block_state.port.value |= OPER_FLAG_SQUIT_REMOTE;
1206     } | SQUIT
1207     {
1208     if (conf_parser_ctx.pass == 2)
1209     block_state.port.value |= OPER_FLAG_SQUIT;
1210 adx 30 } | KLINE
1211     {
1212 michael 967 if (conf_parser_ctx.pass == 2)
1213 michael 4019 block_state.port.value |= OPER_FLAG_KLINE;
1214 adx 30 } | UNKLINE
1215     {
1216 michael 967 if (conf_parser_ctx.pass == 2)
1217 michael 1646 block_state.port.value |= OPER_FLAG_UNKLINE;
1218 michael 1301 } | T_DLINE
1219     {
1220     if (conf_parser_ctx.pass == 2)
1221 michael 1646 block_state.port.value |= OPER_FLAG_DLINE;
1222 michael 1301 } | T_UNDLINE
1223     {
1224     if (conf_parser_ctx.pass == 2)
1225 michael 1646 block_state.port.value |= OPER_FLAG_UNDLINE;
1226 adx 30 } | XLINE
1227     {
1228 michael 967 if (conf_parser_ctx.pass == 2)
1229 michael 2852 block_state.port.value |= OPER_FLAG_XLINE;
1230     } | T_UNXLINE
1231     {
1232     if (conf_parser_ctx.pass == 2)
1233     block_state.port.value |= OPER_FLAG_UNXLINE;
1234 adx 30 } | DIE
1235     {
1236 michael 967 if (conf_parser_ctx.pass == 2)
1237 michael 1646 block_state.port.value |= OPER_FLAG_DIE;
1238 michael 1228 } | T_RESTART
1239     {
1240     if (conf_parser_ctx.pass == 2)
1241 michael 1646 block_state.port.value |= OPER_FLAG_RESTART;
1242 michael 7060 } | REHASH ':' REMOTE
1243     {
1244     if (conf_parser_ctx.pass == 2)
1245     block_state.port.value |= OPER_FLAG_REHASH_REMOTE;
1246 adx 30 } | REHASH
1247     {
1248 michael 967 if (conf_parser_ctx.pass == 2)
1249 michael 1646 block_state.port.value |= OPER_FLAG_REHASH;
1250 adx 30 } | ADMIN
1251     {
1252 michael 967 if (conf_parser_ctx.pass == 2)
1253 michael 1646 block_state.port.value |= OPER_FLAG_ADMIN;
1254 michael 1216 } | T_GLOBOPS
1255     {
1256     if (conf_parser_ctx.pass == 2)
1257 michael 1646 block_state.port.value |= OPER_FLAG_GLOBOPS;
1258 michael 2038 } | T_WALLOPS
1259     {
1260     if (conf_parser_ctx.pass == 2)
1261     block_state.port.value |= OPER_FLAG_WALLOPS;
1262     } | T_LOCOPS
1263     {
1264     if (conf_parser_ctx.pass == 2)
1265     block_state.port.value |= OPER_FLAG_LOCOPS;
1266 adx 30 } | REMOTEBAN
1267     {
1268 michael 967 if (conf_parser_ctx.pass == 2)
1269 michael 1646 block_state.port.value |= OPER_FLAG_REMOTEBAN;
1270 michael 1460 } | T_SET
1271     {
1272     if (conf_parser_ctx.pass == 2)
1273 michael 1646 block_state.port.value |= OPER_FLAG_SET;
1274 michael 1228 } | MODULE
1275 adx 30 {
1276 michael 967 if (conf_parser_ctx.pass == 2)
1277 michael 1646 block_state.port.value |= OPER_FLAG_MODULE;
1278 michael 5004 } | T_OPME
1279     {
1280     if (conf_parser_ctx.pass == 2)
1281     block_state.port.value |= OPER_FLAG_OPME;
1282 michael 6447 } | NICK ':' RESV
1283     {
1284     if (conf_parser_ctx.pass == 2)
1285     block_state.port.value |= OPER_FLAG_NICK_RESV;
1286     } | JOIN ':' RESV
1287     {
1288     if (conf_parser_ctx.pass == 2)
1289     block_state.port.value |= OPER_FLAG_JOIN_RESV;
1290 michael 6454 } | RESV
1291     {
1292     if (conf_parser_ctx.pass == 2)
1293     block_state.port.value |= OPER_FLAG_RESV;
1294     } | T_UNRESV
1295     {
1296     if (conf_parser_ctx.pass == 2)
1297     block_state.port.value |= OPER_FLAG_UNRESV;
1298 michael 6488 } | CLOSE
1299     {
1300     if (conf_parser_ctx.pass == 2)
1301     block_state.port.value |= OPER_FLAG_CLOSE;
1302 adx 30 };
1303    
1304    
1305     /***************************************************************************
1306 michael 6664 * class {} section
1307 adx 30 ***************************************************************************/
1308     class_entry: CLASS
1309     {
1310 michael 1651 if (conf_parser_ctx.pass != 1)
1311     break;
1312    
1313     reset_block_state();
1314    
1315     block_state.ping_freq.value = DEFAULT_PINGFREQUENCY;
1316     block_state.con_freq.value = DEFAULT_CONNECTFREQUENCY;
1317     block_state.max_total.value = MAXIMUM_LINKS_DEFAULT;
1318     block_state.max_sendq.value = DEFAULT_SENDQ;
1319     block_state.max_recvq.value = DEFAULT_RECVQ;
1320 michael 1285 } '{' class_items '}' ';'
1321 adx 30 {
1322 michael 1647 struct ClassItem *class = NULL;
1323 adx 30
1324 michael 1647 if (conf_parser_ctx.pass != 1)
1325     break;
1326 adx 30
1327 michael 1647 if (!block_state.class.buf[0])
1328     break;
1329 michael 671
1330 michael 8660 if (!(class = class_find(block_state.class.buf, false)))
1331 michael 1647 class = class_make();
1332 michael 671
1333 michael 1647 class->active = 1;
1334 michael 7032 xfree(class->name);
1335 michael 1647 class->name = xstrdup(block_state.class.buf);
1336     class->ping_freq = block_state.ping_freq.value;
1337 michael 8496 class->max_perip_local = block_state.max_perip_local.value;
1338     class->max_perip_global = block_state.max_perip_global.value;
1339 michael 1647 class->con_freq = block_state.con_freq.value;
1340     class->max_total = block_state.max_total.value;
1341     class->max_sendq = block_state.max_sendq.value;
1342     class->max_recvq = block_state.max_recvq.value;
1343 michael 3933 class->max_channels = block_state.max_channels.value;
1344 michael 671
1345 michael 1785 if (block_state.min_idle.value > block_state.max_idle.value)
1346     {
1347     block_state.min_idle.value = 0;
1348     block_state.max_idle.value = 0;
1349     block_state.flags.value &= ~CLASS_FLAGS_FAKE_IDLE;
1350     }
1351    
1352     class->flags = block_state.flags.value;
1353     class->min_idle = block_state.min_idle.value;
1354     class->max_idle = block_state.max_idle.value;
1355    
1356 michael 8609 int diff = (class->cidr_bitlen_ipv4 != block_state.cidr_bitlen_ipv4.value ||
1357     class->cidr_bitlen_ipv6 != block_state.cidr_bitlen_ipv6.value);
1358 michael 1647 class->cidr_bitlen_ipv4 = block_state.cidr_bitlen_ipv4.value;
1359     class->cidr_bitlen_ipv6 = block_state.cidr_bitlen_ipv6.value;
1360     class->number_per_cidr = block_state.number_per_cidr.value;
1361 michael 8607
1362 michael 8609 if (diff)
1363     class_ip_limit_rebuild(class);
1364 adx 30 };
1365    
1366     class_items: class_items class_item | class_item;
1367     class_item: class_name |
1368 michael 3439 class_cidr_bitlen_ipv4 |
1369     class_cidr_bitlen_ipv6 |
1370 adx 30 class_ping_time |
1371 michael 3439 class_number_per_cidr |
1372 michael 8496 class_number_per_ip_local |
1373     class_number_per_ip_global |
1374 adx 30 class_connectfreq |
1375 michael 3933 class_max_channels |
1376 adx 30 class_max_number |
1377 michael 7624 class_sendq |
1378     class_recvq |
1379 michael 1783 class_min_idle |
1380     class_max_idle |
1381     class_flags |
1382 michael 3439 error ';' ;
1383 adx 30
1384 michael 2916 class_name: NAME '=' QSTRING ';'
1385 adx 30 {
1386 michael 967 if (conf_parser_ctx.pass == 1)
1387 michael 1647 strlcpy(block_state.class.buf, yylval.string, sizeof(block_state.class.buf));
1388 adx 30 };
1389    
1390     class_ping_time: PING_TIME '=' timespec ';'
1391     {
1392 michael 967 if (conf_parser_ctx.pass == 1)
1393 michael 1647 block_state.ping_freq.value = $3;
1394 adx 30 };
1395    
1396 michael 8496 class_number_per_ip_local: NUMBER_PER_IP_LOCAL '=' NUMBER ';'
1397 adx 30 {
1398 michael 967 if (conf_parser_ctx.pass == 1)
1399 michael 8496 block_state.max_perip_local.value = $3;
1400 adx 30 };
1401    
1402 michael 8496 class_number_per_ip_global: NUMBER_PER_IP_GLOBAL '=' NUMBER ';'
1403     {
1404     if (conf_parser_ctx.pass == 1)
1405     block_state.max_perip_global.value = $3;
1406     };
1407    
1408 adx 30 class_connectfreq: CONNECTFREQ '=' timespec ';'
1409     {
1410 michael 967 if (conf_parser_ctx.pass == 1)
1411 michael 1647 block_state.con_freq.value = $3;
1412 adx 30 };
1413    
1414 michael 3933 class_max_channels: MAX_CHANNELS '=' NUMBER ';'
1415     {
1416     if (conf_parser_ctx.pass == 1)
1417     block_state.max_channels.value = $3;
1418     };
1419    
1420 adx 30 class_max_number: MAX_NUMBER '=' NUMBER ';'
1421     {
1422 michael 967 if (conf_parser_ctx.pass == 1)
1423 michael 1647 block_state.max_total.value = $3;
1424 adx 30 };
1425    
1426     class_sendq: SENDQ '=' sizespec ';'
1427     {
1428 michael 967 if (conf_parser_ctx.pass == 1)
1429 michael 1647 block_state.max_sendq.value = $3;
1430 adx 30 };
1431    
1432 michael 1516 class_recvq: T_RECVQ '=' sizespec ';'
1433     {
1434     if (conf_parser_ctx.pass == 1)
1435     if ($3 >= CLIENT_FLOOD_MIN && $3 <= CLIENT_FLOOD_MAX)
1436 michael 1647 block_state.max_recvq.value = $3;
1437 michael 1516 };
1438    
1439 adx 30 class_cidr_bitlen_ipv4: CIDR_BITLEN_IPV4 '=' NUMBER ';'
1440     {
1441 michael 967 if (conf_parser_ctx.pass == 1)
1442 michael 1647 block_state.cidr_bitlen_ipv4.value = $3 > 32 ? 32 : $3;
1443 adx 30 };
1444    
1445     class_cidr_bitlen_ipv6: CIDR_BITLEN_IPV6 '=' NUMBER ';'
1446     {
1447 michael 967 if (conf_parser_ctx.pass == 1)
1448 michael 1647 block_state.cidr_bitlen_ipv6.value = $3 > 128 ? 128 : $3;
1449 adx 30 };
1450    
1451     class_number_per_cidr: NUMBER_PER_CIDR '=' NUMBER ';'
1452     {
1453 michael 967 if (conf_parser_ctx.pass == 1)
1454 michael 1647 block_state.number_per_cidr.value = $3;
1455 adx 30 };
1456    
1457 michael 1783 class_min_idle: MIN_IDLE '=' timespec ';'
1458     {
1459 michael 1785 if (conf_parser_ctx.pass != 1)
1460     break;
1461    
1462     block_state.min_idle.value = $3;
1463     block_state.flags.value |= CLASS_FLAGS_FAKE_IDLE;
1464 michael 1783 };
1465    
1466     class_max_idle: MAX_IDLE '=' timespec ';'
1467     {
1468 michael 1785 if (conf_parser_ctx.pass != 1)
1469     break;
1470    
1471     block_state.max_idle.value = $3;
1472     block_state.flags.value |= CLASS_FLAGS_FAKE_IDLE;
1473 michael 1783 };
1474    
1475     class_flags: IRCD_FLAGS
1476     {
1477     if (conf_parser_ctx.pass == 1)
1478 michael 1785 block_state.flags.value &= CLASS_FLAGS_FAKE_IDLE;
1479 michael 1783 } '=' class_flags_items ';';
1480    
1481     class_flags_items: class_flags_items ',' class_flags_item | class_flags_item;
1482     class_flags_item: RANDOM_IDLE
1483     {
1484     if (conf_parser_ctx.pass == 1)
1485     block_state.flags.value |= CLASS_FLAGS_RANDOM_IDLE;
1486     } | HIDE_IDLE_FROM_OPERS
1487     {
1488     if (conf_parser_ctx.pass == 1)
1489     block_state.flags.value |= CLASS_FLAGS_HIDE_IDLE_FROM_OPERS;
1490     };
1491    
1492    
1493 adx 30 /***************************************************************************
1494 michael 6664 * listen {} section
1495 adx 30 ***************************************************************************/
1496     listen_entry: LISTEN
1497     {
1498 michael 967 if (conf_parser_ctx.pass == 2)
1499 michael 1646 reset_block_state();
1500     } '{' listen_items '}' ';';
1501 adx 30
1502     listen_flags: IRCD_FLAGS
1503     {
1504 michael 1646 block_state.flags.value = 0;
1505 adx 30 } '=' listen_flags_items ';';
1506    
1507     listen_flags_items: listen_flags_items ',' listen_flags_item | listen_flags_item;
1508     listen_flags_item: T_SSL
1509     {
1510 michael 967 if (conf_parser_ctx.pass == 2)
1511 michael 1646 block_state.flags.value |= LISTENER_SSL;
1512 adx 30 } | HIDDEN
1513     {
1514 michael 967 if (conf_parser_ctx.pass == 2)
1515 michael 1647 block_state.flags.value |= LISTENER_HIDDEN;
1516 michael 900 } | T_SERVER
1517     {
1518 michael 967 if (conf_parser_ctx.pass == 2)
1519 michael 1647 block_state.flags.value |= LISTENER_SERVER;
1520 adx 30 };
1521    
1522     listen_items: listen_items listen_item | listen_item;
1523 michael 440 listen_item: listen_port | listen_flags | listen_address | listen_host | error ';';
1524 adx 30
1525 michael 1648 listen_port: PORT '=' port_items { block_state.flags.value = 0; } ';';
1526 adx 30
1527     port_items: port_items ',' port_item | port_item;
1528    
1529     port_item: NUMBER
1530     {
1531 michael 967 if (conf_parser_ctx.pass == 2)
1532 adx 30 {
1533 michael 7105 #ifndef HAVE_TLS
1534 michael 1646 if (block_state.flags.value & LISTENER_SSL)
1535 michael 4499 {
1536 michael 7105 conf_error_report("TLS not available - port closed");
1537 michael 4499 break;
1538     }
1539 adx 30 #endif
1540 michael 6367 listener_add($1, block_state.addr.buf, block_state.flags.value);
1541 adx 30 }
1542     } | NUMBER TWODOTS NUMBER
1543     {
1544 michael 967 if (conf_parser_ctx.pass == 2)
1545 adx 30 {
1546 michael 7105 #ifndef HAVE_TLS
1547 michael 1646 if (block_state.flags.value & LISTENER_SSL)
1548 michael 4499 {
1549 michael 7105 conf_error_report("TLS not available - port closed");
1550 michael 4499 break;
1551     }
1552 adx 30 #endif
1553    
1554 michael 3439 for (int i = $1; i <= $3; ++i)
1555 michael 6367 listener_add(i, block_state.addr.buf, block_state.flags.value);
1556 adx 30 }
1557     };
1558    
1559     listen_address: IP '=' QSTRING ';'
1560     {
1561 michael 967 if (conf_parser_ctx.pass == 2)
1562 michael 1646 strlcpy(block_state.addr.buf, yylval.string, sizeof(block_state.addr.buf));
1563 adx 30 };
1564    
1565     listen_host: HOST '=' QSTRING ';'
1566     {
1567 michael 967 if (conf_parser_ctx.pass == 2)
1568 michael 1646 strlcpy(block_state.addr.buf, yylval.string, sizeof(block_state.addr.buf));
1569 adx 30 };
1570    
1571 michael 6664
1572 adx 30 /***************************************************************************
1573 michael 6664 * auth {} section
1574 adx 30 ***************************************************************************/
1575     auth_entry: IRCD_AUTH
1576     {
1577 michael 967 if (conf_parser_ctx.pass == 2)
1578 michael 1646 reset_block_state();
1579 adx 30 } '{' auth_items '}' ';'
1580     {
1581 michael 4915 dlink_node *node = NULL;
1582 adx 30
1583 michael 1646 if (conf_parser_ctx.pass != 2)
1584     break;
1585 adx 30
1586 michael 4915 DLINK_FOREACH(node, block_state.mask.list.head)
1587 michael 1646 {
1588     struct MaskItem *conf = NULL;
1589     struct split_nuh_item nuh;
1590 michael 7318 char *s = node->data;
1591 adx 30
1592 michael 7318 if (EmptyString(s))
1593     continue;
1594    
1595     nuh.nuhmask = s;
1596 michael 1646 nuh.nickptr = NULL;
1597 michael 1647 nuh.userptr = block_state.user.buf;
1598     nuh.hostptr = block_state.host.buf;
1599 michael 1646 nuh.nicksize = 0;
1600 michael 1647 nuh.usersize = sizeof(block_state.user.buf);
1601     nuh.hostsize = sizeof(block_state.host.buf);
1602 michael 1646 split_nuh(&nuh);
1603 adx 30
1604 michael 1646 conf = conf_make(CONF_CLIENT);
1605 michael 2106 conf->user = xstrdup(block_state.user.buf);
1606     conf->host = xstrdup(block_state.host.buf);
1607 adx 30
1608 michael 1647 if (block_state.rpass.buf[0])
1609     conf->passwd = xstrdup(block_state.rpass.buf);
1610 michael 1646 if (block_state.name.buf[0])
1611 michael 1911 conf->name = xstrdup(block_state.name.buf);
1612 adx 30
1613 michael 1646 conf->flags = block_state.flags.value;
1614     conf->port = block_state.port.value;
1615 adx 30
1616 michael 1646 conf_add_class_to_conf(conf, block_state.class.buf);
1617     add_conf_by_address(CONF_CLIENT, conf);
1618 adx 30 }
1619 michael 2916 };
1620 adx 30
1621     auth_items: auth_items auth_item | auth_item;
1622 michael 3439 auth_item: auth_user |
1623     auth_passwd |
1624     auth_class |
1625     auth_flags |
1626     auth_spoof |
1627 michael 3441 auth_redir_serv |
1628 michael 3439 auth_redir_port |
1629     auth_encrypted |
1630     error ';' ;
1631 adx 30
1632     auth_user: USER '=' QSTRING ';'
1633     {
1634 michael 967 if (conf_parser_ctx.pass == 2)
1635 michael 1646 dlinkAdd(xstrdup(yylval.string), make_dlink_node(), &block_state.mask.list);
1636 adx 30 };
1637    
1638     auth_passwd: PASSWORD '=' QSTRING ';'
1639     {
1640 michael 967 if (conf_parser_ctx.pass == 2)
1641 michael 1647 strlcpy(block_state.rpass.buf, yylval.string, sizeof(block_state.rpass.buf));
1642 adx 30 };
1643    
1644     auth_class: CLASS '=' QSTRING ';'
1645     {
1646 michael 967 if (conf_parser_ctx.pass == 2)
1647 michael 1646 strlcpy(block_state.class.buf, yylval.string, sizeof(block_state.class.buf));
1648 adx 30 };
1649    
1650     auth_encrypted: ENCRYPTED '=' TBOOL ';'
1651     {
1652 michael 967 if (conf_parser_ctx.pass == 2)
1653 adx 30 {
1654     if (yylval.number)
1655 michael 1646 block_state.flags.value |= CONF_FLAGS_ENCRYPTED;
1656 adx 30 else
1657 michael 1646 block_state.flags.value &= ~CONF_FLAGS_ENCRYPTED;
1658 adx 30 }
1659     };
1660    
1661     auth_flags: IRCD_FLAGS
1662     {
1663 michael 1646 if (conf_parser_ctx.pass == 2)
1664 michael 2093 block_state.flags.value &= (CONF_FLAGS_ENCRYPTED | CONF_FLAGS_SPOOF_IP);
1665 adx 30 } '=' auth_flags_items ';';
1666    
1667     auth_flags_items: auth_flags_items ',' auth_flags_item | auth_flags_item;
1668 michael 1228 auth_flags_item: SPOOF_NOTICE
1669 adx 30 {
1670 michael 967 if (conf_parser_ctx.pass == 2)
1671 michael 1646 block_state.flags.value |= CONF_FLAGS_SPOOF_NOTICE;
1672 adx 30 } | EXCEED_LIMIT
1673     {
1674 michael 967 if (conf_parser_ctx.pass == 2)
1675 michael 1646 block_state.flags.value |= CONF_FLAGS_NOLIMIT;
1676 adx 30 } | KLINE_EXEMPT
1677     {
1678 michael 967 if (conf_parser_ctx.pass == 2)
1679 michael 1646 block_state.flags.value |= CONF_FLAGS_EXEMPTKLINE;
1680 michael 5985 } | XLINE_EXEMPT
1681     {
1682     if (conf_parser_ctx.pass == 2)
1683     block_state.flags.value |= CONF_FLAGS_EXEMPTXLINE;
1684 adx 30 } | NEED_IDENT
1685     {
1686 michael 967 if (conf_parser_ctx.pass == 2)
1687 michael 1646 block_state.flags.value |= CONF_FLAGS_NEED_IDENTD;
1688 adx 30 } | CAN_FLOOD
1689     {
1690 michael 967 if (conf_parser_ctx.pass == 2)
1691 michael 1646 block_state.flags.value |= CONF_FLAGS_CAN_FLOOD;
1692 adx 30 } | NO_TILDE
1693     {
1694 michael 967 if (conf_parser_ctx.pass == 2)
1695 michael 1646 block_state.flags.value |= CONF_FLAGS_NO_TILDE;
1696 adx 30 } | RESV_EXEMPT
1697     {
1698 michael 967 if (conf_parser_ctx.pass == 2)
1699 michael 1646 block_state.flags.value |= CONF_FLAGS_EXEMPTRESV;
1700 michael 1715 } | T_WEBIRC
1701     {
1702     if (conf_parser_ctx.pass == 2)
1703     block_state.flags.value |= CONF_FLAGS_WEBIRC;
1704 adx 30 } | NEED_PASSWORD
1705     {
1706 michael 967 if (conf_parser_ctx.pass == 2)
1707 michael 1646 block_state.flags.value |= CONF_FLAGS_NEED_PASSWORD;
1708 adx 30 };
1709    
1710 michael 2916 auth_spoof: SPOOF '=' QSTRING ';'
1711 adx 30 {
1712 michael 1646 if (conf_parser_ctx.pass != 2)
1713     break;
1714    
1715 michael 3441 if (valid_hostname(yylval.string))
1716 adx 30 {
1717 michael 1646 strlcpy(block_state.name.buf, yylval.string, sizeof(block_state.name.buf));
1718     block_state.flags.value |= CONF_FLAGS_SPOOF_IP;
1719 adx 30 }
1720 michael 1646 else
1721     ilog(LOG_TYPE_IRCD, "Spoof either is too long or contains invalid characters. Ignoring it.");
1722 adx 30 };
1723    
1724     auth_redir_serv: REDIRSERV '=' QSTRING ';'
1725     {
1726 michael 1646 if (conf_parser_ctx.pass != 2)
1727     break;
1728    
1729     strlcpy(block_state.name.buf, yylval.string, sizeof(block_state.name.buf));
1730     block_state.flags.value |= CONF_FLAGS_REDIR;
1731 adx 30 };
1732    
1733     auth_redir_port: REDIRPORT '=' NUMBER ';'
1734     {
1735 michael 1646 if (conf_parser_ctx.pass != 2)
1736     break;
1737 michael 1647
1738 michael 1646 block_state.flags.value |= CONF_FLAGS_REDIR;
1739     block_state.port.value = $3;
1740 adx 30 };
1741    
1742    
1743     /***************************************************************************
1744 michael 6664 * resv {} section
1745 adx 30 ***************************************************************************/
1746     resv_entry: RESV
1747     {
1748 michael 1647 if (conf_parser_ctx.pass != 2)
1749     break;
1750 adx 30
1751 michael 1647 reset_block_state();
1752     strlcpy(block_state.rpass.buf, CONF_NOREASON, sizeof(block_state.rpass.buf));
1753 michael 1823 } '{' resv_items '}' ';'
1754     {
1755 michael 1858 if (conf_parser_ctx.pass != 2)
1756     break;
1757    
1758 michael 7282 resv_make(block_state.name.buf, block_state.rpass.buf, &block_state.mask.list);
1759 michael 1823 };
1760 michael 1647
1761 michael 3439 resv_items: resv_items resv_item | resv_item;
1762     resv_item: resv_mask | resv_reason | resv_exempt | error ';' ;
1763 adx 30
1764 michael 1858 resv_mask: MASK '=' QSTRING ';'
1765 adx 30 {
1766 michael 967 if (conf_parser_ctx.pass == 2)
1767 michael 1858 strlcpy(block_state.name.buf, yylval.string, sizeof(block_state.name.buf));
1768 adx 30 };
1769    
1770 michael 1858 resv_reason: REASON '=' QSTRING ';'
1771 adx 30 {
1772 michael 1823 if (conf_parser_ctx.pass == 2)
1773 michael 1858 strlcpy(block_state.rpass.buf, yylval.string, sizeof(block_state.rpass.buf));
1774 adx 30 };
1775    
1776 michael 1858 resv_exempt: EXEMPT '=' QSTRING ';'
1777 adx 30 {
1778 michael 967 if (conf_parser_ctx.pass == 2)
1779 michael 1858 dlinkAdd(xstrdup(yylval.string), make_dlink_node(), &block_state.mask.list);
1780 adx 30 };
1781    
1782 michael 1858
1783 adx 30 /***************************************************************************
1784 michael 6664 * service {} section
1785 michael 1157 ***************************************************************************/
1786     service_entry: T_SERVICE '{' service_items '}' ';';
1787    
1788     service_items: service_items service_item | service_item;
1789     service_item: service_name | error;
1790    
1791     service_name: NAME '=' QSTRING ';'
1792     {
1793 michael 2129 if (conf_parser_ctx.pass != 2)
1794     break;
1795    
1796 michael 8660 if (server_valid_name(yylval.string) == true)
1797 michael 1157 {
1798 michael 7248 struct ServiceItem *service = service_make();
1799     service->name = xstrdup(yylval.string);
1800 michael 1157 }
1801     };
1802    
1803 michael 6664
1804 michael 1157 /***************************************************************************
1805 michael 6664 * shared {} section, for sharing remote klines etc.
1806 adx 30 ***************************************************************************/
1807     shared_entry: T_SHARED
1808     {
1809 michael 1647 if (conf_parser_ctx.pass != 2)
1810     break;
1811    
1812     reset_block_state();
1813    
1814     strlcpy(block_state.name.buf, "*", sizeof(block_state.name.buf));
1815     strlcpy(block_state.user.buf, "*", sizeof(block_state.user.buf));
1816     strlcpy(block_state.host.buf, "*", sizeof(block_state.host.buf));
1817     block_state.flags.value = SHARED_ALL;
1818 adx 30 } '{' shared_items '}' ';'
1819     {
1820 michael 1647 if (conf_parser_ctx.pass != 2)
1821     break;
1822    
1823 michael 7209 struct SharedItem *shared = shared_make();
1824     shared->type = block_state.flags.value;
1825     shared->server = xstrdup(block_state.name.buf);
1826     shared->user = xstrdup(block_state.user.buf);
1827     shared->host = xstrdup(block_state.host.buf);
1828 adx 30 };
1829    
1830     shared_items: shared_items shared_item | shared_item;
1831     shared_item: shared_name | shared_user | shared_type | error ';' ;
1832    
1833     shared_name: NAME '=' QSTRING ';'
1834     {
1835 michael 967 if (conf_parser_ctx.pass == 2)
1836 michael 1647 strlcpy(block_state.name.buf, yylval.string, sizeof(block_state.name.buf));
1837 adx 30 };
1838    
1839     shared_user: USER '=' QSTRING ';'
1840     {
1841 michael 967 if (conf_parser_ctx.pass == 2)
1842 adx 30 {
1843 michael 593 struct split_nuh_item nuh;
1844    
1845     nuh.nuhmask = yylval.string;
1846     nuh.nickptr = NULL;
1847 michael 1647 nuh.userptr = block_state.user.buf;
1848     nuh.hostptr = block_state.host.buf;
1849 michael 593
1850     nuh.nicksize = 0;
1851 michael 1647 nuh.usersize = sizeof(block_state.user.buf);
1852     nuh.hostsize = sizeof(block_state.host.buf);
1853 michael 593
1854     split_nuh(&nuh);
1855 adx 30 }
1856     };
1857    
1858     shared_type: TYPE
1859     {
1860 michael 967 if (conf_parser_ctx.pass == 2)
1861 michael 1647 block_state.flags.value = 0;
1862 adx 30 } '=' shared_types ';' ;
1863    
1864     shared_types: shared_types ',' shared_type_item | shared_type_item;
1865     shared_type_item: KLINE
1866     {
1867 michael 967 if (conf_parser_ctx.pass == 2)
1868 michael 1647 block_state.flags.value |= SHARED_KLINE;
1869 michael 1301 } | UNKLINE
1870 adx 30 {
1871 michael 967 if (conf_parser_ctx.pass == 2)
1872 michael 1647 block_state.flags.value |= SHARED_UNKLINE;
1873 michael 1301 } | T_DLINE
1874 adx 30 {
1875 michael 967 if (conf_parser_ctx.pass == 2)
1876 michael 1647 block_state.flags.value |= SHARED_DLINE;
1877 michael 1301 } | T_UNDLINE
1878     {
1879     if (conf_parser_ctx.pass == 2)
1880 michael 1647 block_state.flags.value |= SHARED_UNDLINE;
1881 adx 30 } | XLINE
1882     {
1883 michael 967 if (conf_parser_ctx.pass == 2)
1884 michael 1647 block_state.flags.value |= SHARED_XLINE;
1885 adx 30 } | T_UNXLINE
1886     {
1887 michael 967 if (conf_parser_ctx.pass == 2)
1888 michael 1647 block_state.flags.value |= SHARED_UNXLINE;
1889 adx 30 } | RESV
1890     {
1891 michael 967 if (conf_parser_ctx.pass == 2)
1892 michael 1647 block_state.flags.value |= SHARED_RESV;
1893 adx 30 } | T_UNRESV
1894     {
1895 michael 967 if (conf_parser_ctx.pass == 2)
1896 michael 1647 block_state.flags.value |= SHARED_UNRESV;
1897 adx 30 } | T_LOCOPS
1898     {
1899 michael 967 if (conf_parser_ctx.pass == 2)
1900 michael 1647 block_state.flags.value |= SHARED_LOCOPS;
1901 adx 30 } | T_ALL
1902     {
1903 michael 967 if (conf_parser_ctx.pass == 2)
1904 michael 1647 block_state.flags.value = SHARED_ALL;
1905 adx 30 };
1906    
1907 michael 6664
1908 adx 30 /***************************************************************************
1909 michael 6664 * cluster {} section
1910 adx 30 ***************************************************************************/
1911     cluster_entry: T_CLUSTER
1912     {
1913 michael 1647 if (conf_parser_ctx.pass != 2)
1914     break;
1915    
1916     reset_block_state();
1917    
1918     strlcpy(block_state.name.buf, "*", sizeof(block_state.name.buf));
1919 michael 7209 block_state.flags.value = CLUSTER_ALL;
1920 adx 30 } '{' cluster_items '}' ';'
1921     {
1922 michael 1647 if (conf_parser_ctx.pass != 2)
1923     break;
1924    
1925 michael 7209 struct ClusterItem *cluster = cluster_make();
1926     cluster->type = block_state.flags.value;
1927     cluster->server = xstrdup(block_state.name.buf);
1928 adx 30 };
1929    
1930 michael 3439 cluster_items: cluster_items cluster_item | cluster_item;
1931     cluster_item: cluster_name | cluster_type | error ';' ;
1932 adx 30
1933     cluster_name: NAME '=' QSTRING ';'
1934     {
1935 michael 967 if (conf_parser_ctx.pass == 2)
1936 michael 1647 strlcpy(block_state.name.buf, yylval.string, sizeof(block_state.name.buf));
1937 adx 30 };
1938    
1939     cluster_type: TYPE
1940     {
1941 michael 967 if (conf_parser_ctx.pass == 2)
1942 michael 1647 block_state.flags.value = 0;
1943 adx 30 } '=' cluster_types ';' ;
1944    
1945 michael 3439 cluster_types: cluster_types ',' cluster_type_item | cluster_type_item;
1946 adx 30 cluster_type_item: KLINE
1947     {
1948 michael 967 if (conf_parser_ctx.pass == 2)
1949 michael 7209 block_state.flags.value |= CLUSTER_KLINE;
1950 michael 1301 } | UNKLINE
1951 adx 30 {
1952 michael 967 if (conf_parser_ctx.pass == 2)
1953 michael 7209 block_state.flags.value |= CLUSTER_UNKLINE;
1954 michael 1301 } | T_DLINE
1955 adx 30 {
1956 michael 967 if (conf_parser_ctx.pass == 2)
1957 michael 7209 block_state.flags.value |= CLUSTER_DLINE;
1958 michael 1301 } | T_UNDLINE
1959     {
1960     if (conf_parser_ctx.pass == 2)
1961 michael 7209 block_state.flags.value |= CLUSTER_UNDLINE;
1962 adx 30 } | XLINE
1963     {
1964 michael 967 if (conf_parser_ctx.pass == 2)
1965 michael 7209 block_state.flags.value |= CLUSTER_XLINE;
1966 adx 30 } | T_UNXLINE
1967     {
1968 michael 967 if (conf_parser_ctx.pass == 2)
1969 michael 7209 block_state.flags.value |= CLUSTER_UNXLINE;
1970 adx 30 } | RESV
1971     {
1972 michael 967 if (conf_parser_ctx.pass == 2)
1973 michael 7209 block_state.flags.value |= CLUSTER_RESV;
1974 adx 30 } | T_UNRESV
1975     {
1976 michael 967 if (conf_parser_ctx.pass == 2)
1977 michael 7209 block_state.flags.value |= CLUSTER_UNRESV;
1978 adx 30 } | T_LOCOPS
1979     {
1980 michael 967 if (conf_parser_ctx.pass == 2)
1981 michael 7209 block_state.flags.value |= CLUSTER_LOCOPS;
1982 adx 30 } | T_ALL
1983     {
1984 michael 967 if (conf_parser_ctx.pass == 2)
1985 michael 7209 block_state.flags.value = CLUSTER_ALL;
1986 adx 30 };
1987    
1988 michael 6664
1989 adx 30 /***************************************************************************
1990 michael 6664 * connect {} section
1991 adx 30 ***************************************************************************/
1992 michael 2916 connect_entry: CONNECT
1993 adx 30 {
1994 michael 1265
1995 michael 1647 if (conf_parser_ctx.pass != 2)
1996     break;
1997    
1998     reset_block_state();
1999 michael 2397 block_state.aftype.value = AF_INET;
2000 michael 1647 block_state.port.value = PORTNUM;
2001 michael 1285 } '{' connect_items '}' ';'
2002 adx 30 {
2003 michael 1647 struct MaskItem *conf = NULL;
2004     struct addrinfo hints, *res;
2005    
2006     if (conf_parser_ctx.pass != 2)
2007     break;
2008    
2009 michael 1648 if (!block_state.name.buf[0] ||
2010     !block_state.host.buf[0])
2011 michael 1647 break;
2012    
2013 michael 2126 if (!block_state.rpass.buf[0] ||
2014     !block_state.spass.buf[0])
2015 michael 1647 break;
2016    
2017     if (has_wildcards(block_state.name.buf) ||
2018     has_wildcards(block_state.host.buf))
2019     break;
2020    
2021     conf = conf_make(CONF_SERVER);
2022     conf->port = block_state.port.value;
2023     conf->flags = block_state.flags.value;
2024     conf->aftype = block_state.aftype.value;
2025     conf->host = xstrdup(block_state.host.buf);
2026     conf->name = xstrdup(block_state.name.buf);
2027     conf->passwd = xstrdup(block_state.rpass.buf);
2028     conf->spasswd = xstrdup(block_state.spass.buf);
2029 michael 2228
2030     if (block_state.cert.buf[0])
2031     conf->certfp = xstrdup(block_state.cert.buf);
2032    
2033 michael 2252 if (block_state.ciph.buf[0])
2034     conf->cipher_list = xstrdup(block_state.ciph.buf);
2035 michael 1647
2036     dlinkMoveList(&block_state.leaf.list, &conf->leaf_list);
2037     dlinkMoveList(&block_state.hub.list, &conf->hub_list);
2038    
2039     if (block_state.bind.buf[0])
2040 adx 30 {
2041 michael 1647 memset(&hints, 0, sizeof(hints));
2042    
2043     hints.ai_family = AF_UNSPEC;
2044     hints.ai_socktype = SOCK_STREAM;
2045     hints.ai_flags = AI_PASSIVE | AI_NUMERICHOST;
2046    
2047     if (getaddrinfo(block_state.bind.buf, NULL, &hints, &res))
2048     ilog(LOG_TYPE_IRCD, "Invalid netmask for server vhost(%s)", block_state.bind.buf);
2049 michael 1302 else
2050     {
2051 michael 3443 assert(res);
2052 adx 30
2053 michael 1647 memcpy(&conf->bind, res->ai_addr, res->ai_addrlen);
2054     conf->bind.ss.ss_family = res->ai_family;
2055     conf->bind.ss_len = res->ai_addrlen;
2056     freeaddrinfo(res);
2057 michael 1302 }
2058 michael 1647 }
2059 adx 30
2060 michael 1647 conf_add_class_to_conf(conf, block_state.class.buf);
2061     lookup_confhost(conf);
2062 adx 30 };
2063    
2064     connect_items: connect_items connect_item | connect_item;
2065 michael 3439 connect_item: connect_name |
2066     connect_host |
2067     connect_vhost |
2068     connect_send_password |
2069     connect_accept_password |
2070     connect_ssl_certificate_fingerprint |
2071     connect_aftype |
2072     connect_port |
2073     connect_ssl_cipher_list |
2074     connect_flags |
2075     connect_hub_mask |
2076     connect_leaf_mask |
2077     connect_class |
2078     connect_encrypted |
2079 michael 1076 error ';' ;
2080 adx 30
2081     connect_name: NAME '=' QSTRING ';'
2082     {
2083 michael 967 if (conf_parser_ctx.pass == 2)
2084 michael 1647 strlcpy(block_state.name.buf, yylval.string, sizeof(block_state.name.buf));
2085 adx 30 };
2086    
2087 michael 2916 connect_host: HOST '=' QSTRING ';'
2088 adx 30 {
2089 michael 967 if (conf_parser_ctx.pass == 2)
2090 michael 1647 strlcpy(block_state.host.buf, yylval.string, sizeof(block_state.host.buf));
2091 adx 30 };
2092    
2093 michael 2916 connect_vhost: VHOST '=' QSTRING ';'
2094 adx 30 {
2095 michael 967 if (conf_parser_ctx.pass == 2)
2096 michael 1647 strlcpy(block_state.bind.buf, yylval.string, sizeof(block_state.bind.buf));
2097 adx 30 };
2098 michael 2916
2099 adx 30 connect_send_password: SEND_PASSWORD '=' QSTRING ';'
2100     {
2101 michael 1647 if (conf_parser_ctx.pass != 2)
2102     break;
2103 adx 30
2104 michael 1647 if ($3[0] == ':')
2105 michael 1752 conf_error_report("Server passwords cannot begin with a colon");
2106 michael 3443 else if (strchr($3, ' '))
2107 michael 1752 conf_error_report("Server passwords cannot contain spaces");
2108 michael 1647 else
2109     strlcpy(block_state.spass.buf, yylval.string, sizeof(block_state.spass.buf));
2110 adx 30 };
2111    
2112     connect_accept_password: ACCEPT_PASSWORD '=' QSTRING ';'
2113     {
2114 michael 1647 if (conf_parser_ctx.pass != 2)
2115     break;
2116 adx 30
2117 michael 1647 if ($3[0] == ':')
2118 michael 1752 conf_error_report("Server passwords cannot begin with a colon");
2119 michael 3443 else if (strchr($3, ' '))
2120 michael 1752 conf_error_report("Server passwords cannot contain spaces");
2121 michael 1647 else
2122     strlcpy(block_state.rpass.buf, yylval.string, sizeof(block_state.rpass.buf));
2123 adx 30 };
2124    
2125 michael 2244 connect_ssl_certificate_fingerprint: SSL_CERTIFICATE_FINGERPRINT '=' QSTRING ';'
2126 michael 2228 {
2127     if (conf_parser_ctx.pass == 2)
2128 michael 2229 strlcpy(block_state.cert.buf, yylval.string, sizeof(block_state.cert.buf));
2129 michael 2228 };
2130    
2131 adx 30 connect_port: PORT '=' NUMBER ';'
2132     {
2133 michael 967 if (conf_parser_ctx.pass == 2)
2134 michael 1647 block_state.port.value = $3;
2135 adx 30 };
2136    
2137     connect_aftype: AFTYPE '=' T_IPV4 ';'
2138     {
2139 michael 967 if (conf_parser_ctx.pass == 2)
2140 michael 1647 block_state.aftype.value = AF_INET;
2141 adx 30 } | AFTYPE '=' T_IPV6 ';'
2142     {
2143 michael 967 if (conf_parser_ctx.pass == 2)
2144 michael 1647 block_state.aftype.value = AF_INET6;
2145 adx 30 };
2146    
2147     connect_flags: IRCD_FLAGS
2148     {
2149 michael 1648 block_state.flags.value &= CONF_FLAGS_ENCRYPTED;
2150 adx 30 } '=' connect_flags_items ';';
2151    
2152     connect_flags_items: connect_flags_items ',' connect_flags_item | connect_flags_item;
2153 michael 1302 connect_flags_item: AUTOCONN
2154 adx 30 {
2155 michael 967 if (conf_parser_ctx.pass == 2)
2156 michael 1647 block_state.flags.value |= CONF_FLAGS_ALLOW_AUTO_CONN;
2157 michael 1303 } | T_SSL
2158     {
2159     if (conf_parser_ctx.pass == 2)
2160 michael 1647 block_state.flags.value |= CONF_FLAGS_SSL;
2161 michael 1228 };
2162 adx 30
2163     connect_encrypted: ENCRYPTED '=' TBOOL ';'
2164     {
2165 michael 967 if (conf_parser_ctx.pass == 2)
2166 adx 30 {
2167     if (yylval.number)
2168 michael 1647 block_state.flags.value |= CONF_FLAGS_ENCRYPTED;
2169 adx 30 else
2170 michael 1647 block_state.flags.value &= ~CONF_FLAGS_ENCRYPTED;
2171 adx 30 }
2172     };
2173    
2174 michael 2916 connect_hub_mask: HUB_MASK '=' QSTRING ';'
2175 adx 30 {
2176 michael 967 if (conf_parser_ctx.pass == 2)
2177 michael 1647 dlinkAdd(xstrdup(yylval.string), make_dlink_node(), &block_state.hub.list);
2178 adx 30 };
2179    
2180 michael 2916 connect_leaf_mask: LEAF_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.leaf.list);
2184 adx 30 };
2185    
2186     connect_class: CLASS '=' QSTRING ';'
2187     {
2188 michael 967 if (conf_parser_ctx.pass == 2)
2189 michael 1647 strlcpy(block_state.class.buf, yylval.string, sizeof(block_state.class.buf));
2190 adx 30 };
2191    
2192 michael 1306 connect_ssl_cipher_list: T_SSL_CIPHER_LIST '=' QSTRING ';'
2193     {
2194 michael 7105 #ifdef HAVE_TLS
2195 michael 1306 if (conf_parser_ctx.pass == 2)
2196 michael 1647 strlcpy(block_state.ciph.buf, yylval.string, sizeof(block_state.ciph.buf));
2197 michael 1306 #else
2198     if (conf_parser_ctx.pass == 2)
2199 michael 7105 conf_error_report("Ignoring connect::ciphers -- no TLS support");
2200 michael 1306 #endif
2201     };
2202    
2203    
2204 adx 30 /***************************************************************************
2205 michael 6664 * kill {} section
2206 adx 30 ***************************************************************************/
2207     kill_entry: KILL
2208     {
2209 michael 967 if (conf_parser_ctx.pass == 2)
2210 michael 1647 reset_block_state();
2211 adx 30 } '{' kill_items '}' ';'
2212     {
2213 michael 1647 struct MaskItem *conf = NULL;
2214    
2215     if (conf_parser_ctx.pass != 2)
2216     break;
2217    
2218     if (!block_state.user.buf[0] ||
2219     !block_state.host.buf[0])
2220     break;
2221    
2222 michael 1921 conf = conf_make(CONF_KLINE);
2223     conf->user = xstrdup(block_state.user.buf);
2224     conf->host = xstrdup(block_state.host.buf);
2225 michael 1647
2226 michael 1921 if (block_state.rpass.buf[0])
2227     conf->reason = xstrdup(block_state.rpass.buf);
2228 michael 1647 else
2229 michael 1921 conf->reason = xstrdup(CONF_NOREASON);
2230     add_conf_by_address(CONF_KLINE, conf);
2231 michael 2916 };
2232 adx 30
2233     kill_items: kill_items kill_item | kill_item;
2234 michael 1921 kill_item: kill_user | kill_reason | error;
2235 adx 30
2236     kill_user: USER '=' QSTRING ';'
2237     {
2238 michael 1647
2239 michael 967 if (conf_parser_ctx.pass == 2)
2240 adx 30 {
2241 michael 593 struct split_nuh_item nuh;
2242 adx 30
2243 michael 593 nuh.nuhmask = yylval.string;
2244     nuh.nickptr = NULL;
2245 michael 1647 nuh.userptr = block_state.user.buf;
2246     nuh.hostptr = block_state.host.buf;
2247 adx 30
2248 michael 593 nuh.nicksize = 0;
2249 michael 1647 nuh.usersize = sizeof(block_state.user.buf);
2250     nuh.hostsize = sizeof(block_state.host.buf);
2251 adx 30
2252 michael 593 split_nuh(&nuh);
2253 adx 30 }
2254     };
2255    
2256 michael 2916 kill_reason: REASON '=' QSTRING ';'
2257 adx 30 {
2258 michael 967 if (conf_parser_ctx.pass == 2)
2259 michael 1647 strlcpy(block_state.rpass.buf, yylval.string, sizeof(block_state.rpass.buf));
2260 adx 30 };
2261    
2262 michael 6664
2263 adx 30 /***************************************************************************
2264 michael 6664 * deny {} section
2265 adx 30 ***************************************************************************/
2266 michael 2916 deny_entry: DENY
2267 adx 30 {
2268 michael 967 if (conf_parser_ctx.pass == 2)
2269 michael 1646 reset_block_state();
2270 adx 30 } '{' deny_items '}' ';'
2271     {
2272 michael 1646 struct MaskItem *conf = NULL;
2273    
2274     if (conf_parser_ctx.pass != 2)
2275     break;
2276    
2277     if (!block_state.addr.buf[0])
2278     break;
2279    
2280     if (parse_netmask(block_state.addr.buf, NULL, NULL) != HM_HOST)
2281 adx 30 {
2282 michael 1646 conf = conf_make(CONF_DLINE);
2283     conf->host = xstrdup(block_state.addr.buf);
2284 michael 1005
2285 michael 1647 if (block_state.rpass.buf[0])
2286     conf->reason = xstrdup(block_state.rpass.buf);
2287 michael 1646 else
2288     conf->reason = xstrdup(CONF_NOREASON);
2289     add_conf_by_address(CONF_DLINE, conf);
2290 adx 30 }
2291 michael 2916 };
2292 adx 30
2293     deny_items: deny_items deny_item | deny_item;
2294     deny_item: deny_ip | deny_reason | error;
2295    
2296     deny_ip: IP '=' QSTRING ';'
2297     {
2298 michael 967 if (conf_parser_ctx.pass == 2)
2299 michael 1646 strlcpy(block_state.addr.buf, yylval.string, sizeof(block_state.addr.buf));
2300 adx 30 };
2301    
2302 michael 2916 deny_reason: REASON '=' QSTRING ';'
2303 adx 30 {
2304 michael 967 if (conf_parser_ctx.pass == 2)
2305 michael 1647 strlcpy(block_state.rpass.buf, yylval.string, sizeof(block_state.rpass.buf));
2306 adx 30 };
2307    
2308 michael 6664
2309 adx 30 /***************************************************************************
2310 michael 6664 * exempt {} section
2311 adx 30 ***************************************************************************/
2312     exempt_entry: EXEMPT '{' exempt_items '}' ';';
2313    
2314 michael 6664 exempt_items: exempt_items exempt_item | exempt_item;
2315     exempt_item: exempt_ip | error;
2316 adx 30
2317     exempt_ip: IP '=' QSTRING ';'
2318     {
2319 michael 967 if (conf_parser_ctx.pass == 2)
2320 adx 30 {
2321 michael 6664 if (*yylval.string && parse_netmask(yylval.string, NULL, NULL) != HM_HOST)
2322 adx 30 {
2323 michael 1646 struct MaskItem *conf = conf_make(CONF_EXEMPT);
2324     conf->host = xstrdup(yylval.string);
2325 adx 30
2326 michael 1646 add_conf_by_address(CONF_EXEMPT, conf);
2327 adx 30 }
2328     }
2329     };
2330    
2331     /***************************************************************************
2332 michael 6664 * gecos {} section
2333 adx 30 ***************************************************************************/
2334     gecos_entry: GECOS
2335     {
2336 michael 967 if (conf_parser_ctx.pass == 2)
2337 michael 1646 reset_block_state();
2338 adx 30 } '{' gecos_items '}' ';'
2339     {
2340 michael 1646 if (conf_parser_ctx.pass != 2)
2341     break;
2342    
2343     if (!block_state.name.buf[0])
2344     break;
2345    
2346 michael 7304 struct GecosItem *gecos = gecos_make();
2347     gecos->mask = xstrdup(block_state.name.buf);
2348 adx 30
2349 michael 1647 if (block_state.rpass.buf[0])
2350 michael 7304 gecos->reason = xstrdup(block_state.rpass.buf);
2351 michael 1646 else
2352 michael 7304 gecos->reason = xstrdup(CONF_NOREASON);
2353 adx 30 };
2354    
2355     gecos_items: gecos_items gecos_item | gecos_item;
2356 michael 1921 gecos_item: gecos_name | gecos_reason | error;
2357 adx 30
2358 michael 2916 gecos_name: NAME '=' QSTRING ';'
2359 adx 30 {
2360 michael 967 if (conf_parser_ctx.pass == 2)
2361 michael 1646 strlcpy(block_state.name.buf, yylval.string, sizeof(block_state.name.buf));
2362 adx 30 };
2363    
2364 michael 2916 gecos_reason: REASON '=' QSTRING ';'
2365 adx 30 {
2366 michael 967 if (conf_parser_ctx.pass == 2)
2367 michael 1647 strlcpy(block_state.rpass.buf, yylval.string, sizeof(block_state.rpass.buf));
2368 adx 30 };
2369    
2370 michael 6664
2371 adx 30 /***************************************************************************
2372 michael 6664 * general {} section
2373 adx 30 ***************************************************************************/
2374 michael 6664 general_entry: GENERAL '{' general_items '}' ';';
2375 adx 30
2376     general_items: general_items general_item | general_item;
2377 michael 4313 general_item: general_away_count |
2378     general_away_time |
2379 michael 3439 general_failed_oper_notice |
2380     general_anti_nick_flood |
2381     general_max_nick_time |
2382     general_max_nick_changes |
2383     general_max_accept |
2384 michael 7437 general_whowas_history_length |
2385 michael 3439 general_anti_spam_exit_message_time |
2386     general_ts_warn_delta |
2387     general_ts_max_delta |
2388 michael 1549 general_kill_chase_time_limit |
2389     general_invisible_on_connect |
2390 michael 3473 general_warn_no_connect_block |
2391 michael 3439 general_dots_in_ident |
2392 michael 5025 general_stats_i_oper_only |
2393     general_stats_k_oper_only |
2394     general_stats_m_oper_only |
2395 michael 3439 general_stats_o_oper_only |
2396 michael 5025 general_stats_P_oper_only |
2397     general_stats_u_oper_only |
2398 michael 3439 general_pace_wait |
2399     general_pace_wait_simple |
2400     general_short_motd |
2401     general_no_oper_flood |
2402     general_oper_only_umodes |
2403     general_max_targets |
2404     general_oper_umodes |
2405     general_caller_id_wait |
2406     general_opers_bypass_callerid |
2407     general_default_floodcount |
2408 michael 7858 general_default_floodtime |
2409 michael 3439 general_min_nonwildcard |
2410     general_min_nonwildcard_simple |
2411 michael 3877 general_throttle_count |
2412 michael 3439 general_throttle_time |
2413 michael 1072 general_ping_cookie |
2414 michael 2916 general_disable_auth |
2415 michael 3439 general_tkline_expire_notices |
2416 michael 5805 general_dline_min_cidr |
2417     general_dline_min_cidr6 |
2418     general_kline_min_cidr |
2419     general_kline_min_cidr6 |
2420 michael 3439 general_stats_e_disabled |
2421     general_max_watch |
2422     general_cycle_on_host_change |
2423     error;
2424 adx 30
2425    
2426 michael 4313 general_away_count: AWAY_COUNT '=' NUMBER ';'
2427     {
2428 michael 4340 ConfigGeneral.away_count = $3;
2429 michael 4313 };
2430    
2431     general_away_time: AWAY_TIME '=' timespec ';'
2432     {
2433 michael 4340 ConfigGeneral.away_time = $3;
2434 michael 4313 };
2435    
2436 michael 876 general_max_watch: MAX_WATCH '=' NUMBER ';'
2437     {
2438 michael 4340 ConfigGeneral.max_watch = $3;
2439 michael 876 };
2440 adx 30
2441 michael 7437 general_whowas_history_length: WHOWAS_HISTORY_LENGTH '=' NUMBER ';'
2442     {
2443     ConfigGeneral.whowas_history_length = $3;
2444     };
2445    
2446 michael 2283 general_cycle_on_host_change: CYCLE_ON_HOST_CHANGE '=' TBOOL ';'
2447     {
2448     if (conf_parser_ctx.pass == 2)
2449 michael 4340 ConfigGeneral.cycle_on_host_change = yylval.number;
2450 michael 2283 };
2451    
2452 michael 5805 general_dline_min_cidr: DLINE_MIN_CIDR '=' NUMBER ';'
2453 michael 1459 {
2454 michael 5805 ConfigGeneral.dline_min_cidr = $3;
2455 michael 1459 };
2456    
2457 michael 5805 general_dline_min_cidr6: DLINE_MIN_CIDR6 '=' NUMBER ';'
2458 michael 1459 {
2459 michael 5805 ConfigGeneral.dline_min_cidr6 = $3;
2460 michael 1459 };
2461    
2462 michael 5805 general_kline_min_cidr: KLINE_MIN_CIDR '=' NUMBER ';'
2463 michael 1459 {
2464 michael 5805 ConfigGeneral.kline_min_cidr = $3;
2465 michael 1459 };
2466    
2467 michael 5805 general_kline_min_cidr6: KLINE_MIN_CIDR6 '=' NUMBER ';'
2468 adx 30 {
2469 michael 5805 ConfigGeneral.kline_min_cidr6 = $3;
2470 adx 30 };
2471    
2472     general_tkline_expire_notices: TKLINE_EXPIRE_NOTICES '=' TBOOL ';'
2473     {
2474 michael 4340 ConfigGeneral.tkline_expire_notices = yylval.number;
2475 adx 30 };
2476    
2477 michael 1074 general_kill_chase_time_limit: KILL_CHASE_TIME_LIMIT '=' timespec ';'
2478 adx 30 {
2479 michael 4340 ConfigGeneral.kill_chase_time_limit = $3;
2480 adx 30 };
2481    
2482     general_failed_oper_notice: FAILED_OPER_NOTICE '=' TBOOL ';'
2483     {
2484 michael 4340 ConfigGeneral.failed_oper_notice = yylval.number;
2485 adx 30 };
2486    
2487     general_anti_nick_flood: ANTI_NICK_FLOOD '=' TBOOL ';'
2488     {
2489 michael 4340 ConfigGeneral.anti_nick_flood = yylval.number;
2490 adx 30 };
2491    
2492     general_max_nick_time: MAX_NICK_TIME '=' timespec ';'
2493     {
2494 michael 4340 ConfigGeneral.max_nick_time = $3;
2495 adx 30 };
2496    
2497     general_max_nick_changes: MAX_NICK_CHANGES '=' NUMBER ';'
2498     {
2499 michael 4340 ConfigGeneral.max_nick_changes = $3;
2500 adx 30 };
2501    
2502     general_max_accept: MAX_ACCEPT '=' NUMBER ';'
2503     {
2504 michael 4340 ConfigGeneral.max_accept = $3;
2505 adx 30 };
2506    
2507     general_anti_spam_exit_message_time: ANTI_SPAM_EXIT_MESSAGE_TIME '=' timespec ';'
2508     {
2509 michael 4340 ConfigGeneral.anti_spam_exit_message_time = $3;
2510 adx 30 };
2511    
2512     general_ts_warn_delta: TS_WARN_DELTA '=' timespec ';'
2513     {
2514 michael 4340 ConfigGeneral.ts_warn_delta = $3;
2515 adx 30 };
2516    
2517     general_ts_max_delta: TS_MAX_DELTA '=' timespec ';'
2518     {
2519 michael 967 if (conf_parser_ctx.pass == 2)
2520 michael 4340 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 adx 30 } '=' umode_oitems ';' ;
2638    
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 adx 30 } '=' umode_items ';' ;
2712    
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