ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/trunk/src/conf_parser.y
Revision: 7258
Committed: Sat Feb 6 17:29:57 2016 UTC (10 years, 7 months ago) by michael
File size: 76301 byte(s)
Log Message:
- Improve libGeoIP support

File Contents

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

Properties

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