ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/trunk/src/conf_parser.y
Revision: 9139
Committed: Sat Jan 11 22:50:08 2020 UTC (6 years, 8 months ago) by michael
File size: 73729 byte(s)
Log Message:
- Supported TLSv1.3 cipher suites can now be configured explicitely via the new 'serverinfo::tls_cipher_suites' configuration directive

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

Properties

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