ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/trunk/src/conf_parser.y
Revision: 8963
Committed: Sat May 11 21:06:49 2019 UTC (7 years, 4 months ago) by michael
File size: 73346 byte(s)
Log Message:
- Removed general::tkline_expire_notices configuration directive and added user mode +X (sees *LINE expiration notices) instead

File Contents

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

Properties

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