ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/trunk/src/conf_parser.y
(Generate patch)

Comparing ircd-hybrid/trunk/src/conf_parser.y (file contents):
Revision 2252 by michael, Sun Jun 16 13:29:13 2013 UTC vs.
Revision 4565 by michael, Sun Aug 24 10:27:40 2014 UTC

# Line 1 | Line 1
1   /*
2 < *  ircd-hybrid: an advanced Internet Relay Chat Daemon(ircd).
3 < *  conf_parser.y: Parses the ircd configuration file.
2 > *  ircd-hybrid: an advanced, lightweight Internet Relay Chat Daemon (ircd)
3   *
4 < *  Copyright (C) 2005 by the past and present ircd coders, and others.
4 > *  Copyright (c) 2000-2014 ircd-hybrid development team
5   *
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
# Line 16 | Line 15
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 < *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
18 > *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
19   *  USA
21 *
22 *  $Id$
20   */
21  
22 + /*! \file conf_parser.y
23 + * \brief Parses the ircd configuration file.
24 + * \version $Id$
25 + */
26 +
27 +
28   %{
29  
30   #define YY_NO_UNPUT
# Line 34 | Line 37
37   #include "list.h"
38   #include "conf.h"
39   #include "conf_class.h"
40 + #include "conf_pseudo.h"
41   #include "event.h"
42   #include "log.h"
43   #include "client.h"     /* for UMODE_ALL only */
44   #include "irc_string.h"
45   #include "memory.h"
46   #include "modules.h"
47 < #include "s_serv.h"
47 > #include "server.h"
48   #include "hostmask.h"
49   #include "send.h"
50   #include "listener.h"
51   #include "resv.h"
52   #include "numeric.h"
53 < #include "s_user.h"
53 > #include "user.h"
54   #include "motd.h"
55  
56   #ifdef HAVE_LIBCRYPTO
# Line 62 | Line 66 | int yylex(void);
66  
67   static struct
68   {
69 <  struct {
69 >  struct
70 >  {
71      dlink_list list;
72    } mask,
73      leaf,
74      hub;
75  
76 <  struct {
76 >  struct
77 >  {
78      char buf[IRCD_BUFSIZE];
79    } name,
80 +    nick,
81      user,
82      host,
83      addr,
# Line 80 | Line 87 | static struct
87      cert,
88      rpass,
89      spass,
90 <    class;
90 >    class,
91 >    target,
92 >    prepend,
93 >    command;
94  
95 <  struct {
95 >  struct
96 >  {
97      unsigned int value;
98    } flags,
99      modes,
# Line 101 | Line 112 | static struct
112      max_ident,
113      max_sendq,
114      max_recvq,
115 +    max_channels,
116      cidr_bitlen_ipv4,
117      cidr_bitlen_ipv6,
118      number_per_cidr;
# Line 148 | Line 160 | reset_block_state(void)
160   %token  ANTI_NICK_FLOOD
161   %token  ANTI_SPAM_EXIT_MESSAGE_TIME
162   %token  AUTOCONN
163 + %token  AWAY_COUNT
164 + %token  AWAY_TIME
165   %token  BYTES KBYTES MBYTES
166   %token  CALLER_ID_WAIT
167   %token  CAN_FLOOD
# Line 157 | Line 171 | reset_block_state(void)
171   %token  CLASS
172   %token  CONNECT
173   %token  CONNECTFREQ
174 + %token  CYCLE_ON_HOST_CHANGE
175   %token  DEFAULT_FLOODCOUNT
176   %token  DEFAULT_SPLIT_SERVER_COUNT
177   %token  DEFAULT_SPLIT_USER_COUNT
# Line 187 | Line 202 | reset_block_state(void)
202   %token  HAVENT_READ_CONF
203   %token  HIDDEN
204   %token  HIDDEN_NAME
205 + %token  HIDE_CHANS
206 + %token  HIDE_IDLE
207   %token  HIDE_IDLE_FROM_OPERS
208   %token  HIDE_SERVER_IPS
209   %token  HIDE_SERVERS
# Line 197 | Line 214 | reset_block_state(void)
214   %token  HUB_MASK
215   %token  IGNORE_BOGUS_TS
216   %token  INVISIBLE_ON_CONNECT
217 + %token  INVITE_CLIENT_COUNT
218 + %token  INVITE_CLIENT_TIME
219   %token  IP
220   %token  IRCD_AUTH
221   %token  IRCD_FLAGS
# Line 207 | Line 226 | reset_block_state(void)
226   %token  KILL_CHASE_TIME_LIMIT
227   %token  KLINE
228   %token  KLINE_EXEMPT
229 < %token  KNOCK_DELAY
229 > %token  KNOCK_CLIENT_COUNT
230 > %token  KNOCK_CLIENT_TIME
231   %token  KNOCK_DELAY_CHANNEL
232   %token  LEAF_MASK
233   %token  LINKS_DELAY
# Line 215 | Line 235 | reset_block_state(void)
235   %token  MASK
236   %token  MAX_ACCEPT
237   %token  MAX_BANS
238 < %token  MAX_CHANS_PER_OPER
219 < %token  MAX_CHANS_PER_USER
238 > %token  MAX_CHANNELS
239   %token  MAX_GLOBAL
240   %token  MAX_IDENT
241   %token  MAX_IDLE
# Line 283 | Line 302 | reset_block_state(void)
302   %token  SSL_CERTIFICATE_FILE
303   %token  SSL_CERTIFICATE_FINGERPRINT
304   %token  SSL_CONNECTION_REQUIRED
305 + %token  SSL_DH_ELLIPTIC_CURVE
306   %token  SSL_DH_PARAM_FILE
307 + %token  SSL_MESSAGE_DIGEST_ALGORITHM
308   %token  STATS_E_DISABLED
309   %token  STATS_I_OPER_ONLY
310   %token  STATS_K_OPER_ONLY
311   %token  STATS_O_OPER_ONLY
312   %token  STATS_P_OPER_ONLY
313 + %token  STATS_U_OPER_ONLY
314   %token  T_ALL
315   %token  T_BOTS
316   %token  T_CALLERID
317   %token  T_CCONN
318 + %token  T_COMMAND
319   %token  T_CLUSTER
320   %token  T_DEAF
321   %token  T_DEBUG
# Line 310 | Line 333 | reset_block_state(void)
333   %token  T_MAX_CLIENTS
334   %token  T_NCHANGE
335   %token  T_NONONREG
336 < %token  T_OPERWALL
336 > %token  T_PREPEND
337 > %token  T_PSEUDO
338   %token  T_RECVQ
339   %token  T_REJ
340   %token  T_RESTART
341   %token  T_SERVER
342   %token  T_SERVICE
319 %token  T_SERVICES_NAME
343   %token  T_SERVNOTICE
344   %token  T_SET
345   %token  T_SHARED
# Line 326 | Line 349 | reset_block_state(void)
349   %token  T_SPY
350   %token  T_SSL
351   %token  T_SSL_CIPHER_LIST
352 < %token  T_SSL_CLIENT_METHOD
330 < %token  T_SSL_SERVER_METHOD
331 < %token  T_SSLV3
332 < %token  T_TLSV1
352 > %token  T_TARGET
353   %token  T_UMODES
354   %token  T_UNAUTH
355   %token  T_UNDLINE
# Line 340 | Line 360 | reset_block_state(void)
360   %token  T_WALLOPS
361   %token  T_WEBIRC
362   %token  TBOOL
363 + %token  THROTTLE_COUNT
364   %token  THROTTLE_TIME
365   %token  TKLINE_EXPIRE_NOTICES
366   %token  TMASKED
# Line 354 | Line 375 | reset_block_state(void)
375   %token  USER
376   %token  VHOST
377   %token  VHOST6
378 < %token  WARN_NO_NLINE
378 > %token  WARN_NO_CONNECT_BLOCK
379   %token  XLINE
380  
381   %type  <string> QSTRING
# Line 365 | Line 386 | reset_block_state(void)
386   %type  <number> sizespec_
387  
388   %%
389 < conf:  
389 > conf:
390          | conf conf_item
391          ;
392  
393   conf_item:        admin_entry
394                  | logging_entry
395                  | oper_entry
396 <                | channel_entry
397 <                | class_entry
396 >                | channel_entry
397 >                | class_entry
398                  | listen_entry
399                  | auth_entry
400                  | serverinfo_entry
401 <                | serverhide_entry
401 >                | serverhide_entry
402                  | resv_entry
403                  | service_entry
404                  | shared_entry
405 <                | cluster_entry
405 >                | cluster_entry
406                  | connect_entry
407                  | kill_entry
408                  | deny_entry
409 <                | exempt_entry
410 <                | general_entry
409 >                | exempt_entry
410 >                | general_entry
411                  | gecos_entry
412                  | modules_entry
413                  | motd_entry
414 +                | pseudo_entry
415                  | error ';'
416                  | error '}'
417          ;
418  
419  
420   timespec_: { $$ = 0; } | timespec;
421 < timespec:       NUMBER timespec_
422 <                {
423 <                        $$ = $1 + $2;
424 <                }
425 <                | NUMBER SECONDS timespec_
426 <                {
427 <                        $$ = $1 + $3;
428 <                }
429 <                | NUMBER MINUTES timespec_
430 <                {
431 <                        $$ = $1 * 60 + $3;
432 <                }
433 <                | NUMBER HOURS timespec_
434 <                {
435 <                        $$ = $1 * 60 * 60 + $3;
436 <                }
415 <                | NUMBER DAYS timespec_
416 <                {
417 <                        $$ = $1 * 60 * 60 * 24 + $3;
418 <                }
419 <                | NUMBER WEEKS timespec_
420 <                {
421 <                        $$ = $1 * 60 * 60 * 24 * 7 + $3;
422 <                }
423 <                | NUMBER MONTHS timespec_
424 <                {
425 <                        $$ = $1 * 60 * 60 * 24 * 7 * 4 + $3;
426 <                }
427 <                | NUMBER YEARS timespec_
428 <                {
429 <                        $$ = $1 * 60 * 60 * 24 * 365 + $3;
430 <                }
431 <                ;
432 <
433 < sizespec_:      { $$ = 0; } | sizespec;
434 < sizespec:       NUMBER sizespec_ { $$ = $1 + $2; }
435 <                | NUMBER BYTES sizespec_ { $$ = $1 + $3; }
436 <                | NUMBER KBYTES sizespec_ { $$ = $1 * 1024 + $3; }
437 <                | NUMBER MBYTES sizespec_ { $$ = $1 * 1024 * 1024 + $3; }
438 <                ;
421 > timespec:  NUMBER timespec_         { $$ = $1 + $2; } |
422 >           NUMBER SECONDS timespec_ { $$ = $1 + $3; } |
423 >           NUMBER MINUTES timespec_ { $$ = $1 * 60 + $3; } |
424 >           NUMBER HOURS timespec_   { $$ = $1 * 60 * 60 + $3; } |
425 >           NUMBER DAYS timespec_    { $$ = $1 * 60 * 60 * 24 + $3; } |
426 >           NUMBER WEEKS timespec_   { $$ = $1 * 60 * 60 * 24 * 7 + $3; } |
427 >           NUMBER MONTHS timespec_  { $$ = $1 * 60 * 60 * 24 * 7 * 4 + $3; } |
428 >           NUMBER YEARS timespec_   { $$ = $1 * 60 * 60 * 24 * 365 + $3; }
429 >           ;
430 >
431 > sizespec_:  { $$ = 0; } | sizespec;
432 > sizespec:   NUMBER sizespec_ { $$ = $1 + $2; } |
433 >            NUMBER BYTES sizespec_ { $$ = $1 + $3; } |
434 >            NUMBER KBYTES sizespec_ { $$ = $1 * 1024 + $3; } |
435 >            NUMBER MBYTES sizespec_ { $$ = $1 * 1024 * 1024 + $3; }
436 >            ;
437  
438  
439   /***************************************************************************
# Line 463 | Line 461 | modules_path: PATH '=' QSTRING ';'
461   serverinfo_entry: SERVERINFO '{' serverinfo_items '}' ';';
462  
463   serverinfo_items:       serverinfo_items serverinfo_item | serverinfo_item ;
464 < serverinfo_item:        serverinfo_name | serverinfo_vhost |
465 <                        serverinfo_hub | serverinfo_description |
466 <                        serverinfo_network_name | serverinfo_network_desc |
467 <                        serverinfo_max_clients | serverinfo_max_nick_length |
468 <                        serverinfo_max_topic_length | serverinfo_ssl_dh_param_file |
469 <                        serverinfo_rsa_private_key_file | serverinfo_vhost6 |
470 <                        serverinfo_sid | serverinfo_ssl_certificate_file |
471 <                        serverinfo_ssl_client_method | serverinfo_ssl_server_method |
464 > serverinfo_item:        serverinfo_name |
465 >                        serverinfo_vhost |
466 >                        serverinfo_hub |
467 >                        serverinfo_description |
468 >                        serverinfo_network_name |
469 >                        serverinfo_network_desc |
470 >                        serverinfo_max_clients |
471 >                        serverinfo_max_nick_length |
472 >                        serverinfo_max_topic_length |
473 >                        serverinfo_ssl_dh_param_file |
474 >                        serverinfo_ssl_dh_elliptic_curve |
475 >                        serverinfo_rsa_private_key_file |
476 >                        serverinfo_vhost6 |
477 >                        serverinfo_sid |
478 >                        serverinfo_ssl_certificate_file |
479                          serverinfo_ssl_cipher_list |
480 <                        error ';' ;
480 >                        serverinfo_ssl_message_digest_algorithm |
481 >                        error ';' ;
482  
483  
478 serverinfo_ssl_client_method: T_SSL_CLIENT_METHOD '=' client_method_types ';' ;
479 serverinfo_ssl_server_method: T_SSL_SERVER_METHOD '=' server_method_types ';' ;
480
481 client_method_types: client_method_types ',' client_method_type_item | client_method_type_item;
482 client_method_type_item: T_SSLV3
483 {
484 #ifdef HAVE_LIBCRYPTO
485  if (conf_parser_ctx.pass == 2 && ServerInfo.client_ctx)
486    SSL_CTX_clear_options(ServerInfo.client_ctx, SSL_OP_NO_SSLv3);
487 #endif
488 } | T_TLSV1
489 {
490 #ifdef HAVE_LIBCRYPTO
491  if (conf_parser_ctx.pass == 2 && ServerInfo.client_ctx)
492    SSL_CTX_clear_options(ServerInfo.client_ctx, SSL_OP_NO_TLSv1);
493 #endif
494 };
495
496 server_method_types: server_method_types ',' server_method_type_item | server_method_type_item;
497 server_method_type_item: T_SSLV3
498 {
499 #ifdef HAVE_LIBCRYPTO
500  if (conf_parser_ctx.pass == 2 && ServerInfo.server_ctx)
501    SSL_CTX_clear_options(ServerInfo.server_ctx, SSL_OP_NO_SSLv3);
502 #endif
503 } | T_TLSV1
504 {
505 #ifdef HAVE_LIBCRYPTO
506  if (conf_parser_ctx.pass == 2 && ServerInfo.server_ctx)
507    SSL_CTX_clear_options(ServerInfo.server_ctx, SSL_OP_NO_TLSv1);
508 #endif
509 };
510
484   serverinfo_ssl_certificate_file: SSL_CERTIFICATE_FILE '=' QSTRING ';'
485   {
486   #ifdef HAVE_LIBCRYPTO
487 <  if (conf_parser_ctx.pass == 2 && ServerInfo.server_ctx)
487 >  if (conf_parser_ctx.pass == 2)
488    {
489 <    if (!ServerInfo.rsa_private_key_file)
489 >    if (!ConfigServerInfo.rsa_private_key_file)
490      {
491        conf_error_report("No rsa_private_key_file specified, SSL disabled");
492        break;
493      }
494  
495 <    if (SSL_CTX_use_certificate_file(ServerInfo.server_ctx, yylval.string,
495 >    if (SSL_CTX_use_certificate_file(ConfigServerInfo.server_ctx, yylval.string,
496                                       SSL_FILETYPE_PEM) <= 0 ||
497 <        SSL_CTX_use_certificate_file(ServerInfo.client_ctx, yylval.string,
497 >        SSL_CTX_use_certificate_file(ConfigServerInfo.client_ctx, yylval.string,
498                                       SSL_FILETYPE_PEM) <= 0)
499      {
500        report_crypto_errors();
# Line 529 | Line 502 | serverinfo_ssl_certificate_file: SSL_CER
502        break;
503      }
504  
505 <    if (SSL_CTX_use_PrivateKey_file(ServerInfo.server_ctx, ServerInfo.rsa_private_key_file,
505 >    if (SSL_CTX_use_PrivateKey_file(ConfigServerInfo.server_ctx, ConfigServerInfo.rsa_private_key_file,
506                                      SSL_FILETYPE_PEM) <= 0 ||
507 <        SSL_CTX_use_PrivateKey_file(ServerInfo.client_ctx, ServerInfo.rsa_private_key_file,
507 >        SSL_CTX_use_PrivateKey_file(ConfigServerInfo.client_ctx, ConfigServerInfo.rsa_private_key_file,
508                                      SSL_FILETYPE_PEM) <= 0)
509      {
510        report_crypto_errors();
# Line 539 | Line 512 | serverinfo_ssl_certificate_file: SSL_CER
512        break;
513      }
514  
515 <    if (!SSL_CTX_check_private_key(ServerInfo.server_ctx) ||
516 <        !SSL_CTX_check_private_key(ServerInfo.client_ctx))
515 >    if (!SSL_CTX_check_private_key(ConfigServerInfo.server_ctx) ||
516 >        !SSL_CTX_check_private_key(ConfigServerInfo.client_ctx))
517      {
518        report_crypto_errors();
519        conf_error_report("Could not read RSA private key");
# Line 558 | Line 531 | serverinfo_rsa_private_key_file: RSA_PRI
531    if (conf_parser_ctx.pass != 1)
532      break;
533  
534 <  if (ServerInfo.rsa_private_key)
534 >  if (ConfigServerInfo.rsa_private_key)
535    {
536 <    RSA_free(ServerInfo.rsa_private_key);
537 <    ServerInfo.rsa_private_key = NULL;
536 >    RSA_free(ConfigServerInfo.rsa_private_key);
537 >    ConfigServerInfo.rsa_private_key = NULL;
538    }
539  
540 <  if (ServerInfo.rsa_private_key_file)
540 >  if (ConfigServerInfo.rsa_private_key_file)
541    {
542 <    MyFree(ServerInfo.rsa_private_key_file);
543 <    ServerInfo.rsa_private_key_file = NULL;
542 >    MyFree(ConfigServerInfo.rsa_private_key_file);
543 >    ConfigServerInfo.rsa_private_key_file = NULL;
544    }
545  
546 <  ServerInfo.rsa_private_key_file = xstrdup(yylval.string);
546 >  ConfigServerInfo.rsa_private_key_file = xstrdup(yylval.string);
547  
548    if ((file = BIO_new_file(yylval.string, "r")) == NULL)
549    {
# Line 578 | Line 551 | serverinfo_rsa_private_key_file: RSA_PRI
551      break;
552    }
553  
554 <  ServerInfo.rsa_private_key = PEM_read_bio_RSAPrivateKey(file, NULL, 0, NULL);
554 >  ConfigServerInfo.rsa_private_key = PEM_read_bio_RSAPrivateKey(file, NULL, 0, NULL);
555  
556    BIO_set_close(file, BIO_CLOSE);
557    BIO_free(file);
558  
559 <  if (ServerInfo.rsa_private_key == NULL)
559 >  if (ConfigServerInfo.rsa_private_key == NULL)
560    {
561      conf_error_report("Couldn't extract key, ignoring");
562      break;
563    }
564  
565 <  if (!RSA_check_key(ServerInfo.rsa_private_key))
565 >  if (!RSA_check_key(ConfigServerInfo.rsa_private_key))
566    {
567 <    RSA_free(ServerInfo.rsa_private_key);
568 <    ServerInfo.rsa_private_key = NULL;
567 >    RSA_free(ConfigServerInfo.rsa_private_key);
568 >    ConfigServerInfo.rsa_private_key = NULL;
569  
570      conf_error_report("Invalid key, ignoring");
571      break;
572    }
573  
574 <  /* require 2048 bit (256 byte) key */
602 <  if (RSA_size(ServerInfo.rsa_private_key) != 256)
574 >  if (RSA_size(ConfigServerInfo.rsa_private_key) < 128)
575    {
576 <    RSA_free(ServerInfo.rsa_private_key);
577 <    ServerInfo.rsa_private_key = NULL;
576 >    RSA_free(ConfigServerInfo.rsa_private_key);
577 >    ConfigServerInfo.rsa_private_key = NULL;
578  
579 <    conf_error_report("Not a 2048 bit key, ignoring");
579 >    conf_error_report("Ignoring serverinfo::rsa_private_key_file -- need at least a 1024 bit key size");
580    }
581   #endif
582   };
583  
584   serverinfo_ssl_dh_param_file: SSL_DH_PARAM_FILE '=' QSTRING ';'
585   {
614 /* TBD - XXX: error reporting */
586   #ifdef HAVE_LIBCRYPTO
587 <  if (conf_parser_ctx.pass == 2 && ServerInfo.server_ctx)
587 >  if (conf_parser_ctx.pass == 2)
588    {
589      BIO *file = BIO_new_file(yylval.string, "r");
590  
# Line 628 | Line 599 | serverinfo_ssl_dh_param_file: SSL_DH_PAR
599          if (DH_size(dh) < 128)
600            conf_error_report("Ignoring serverinfo::ssl_dh_param_file -- need at least a 1024 bit DH prime size");
601          else
602 <          SSL_CTX_set_tmp_dh(ServerInfo.server_ctx, dh);
602 >          SSL_CTX_set_tmp_dh(ConfigServerInfo.server_ctx, dh);
603  
604          DH_free(dh);
605        }
606      }
607 +    else
608 +      conf_error_report("Ignoring serverinfo::ssl_dh_param_file -- could not open/read Diffie-Hellman parameter file");
609    }
610   #endif
611   };
# Line 640 | Line 613 | serverinfo_ssl_dh_param_file: SSL_DH_PAR
613   serverinfo_ssl_cipher_list: T_SSL_CIPHER_LIST '=' QSTRING ';'
614   {
615   #ifdef HAVE_LIBCRYPTO
616 <  if (conf_parser_ctx.pass == 2 && ServerInfo.server_ctx)
617 <    SSL_CTX_set_cipher_list(ServerInfo.server_ctx, yylval.string);
616 >  if (conf_parser_ctx.pass == 2)
617 >    SSL_CTX_set_cipher_list(ConfigServerInfo.server_ctx, yylval.string);
618 > #endif
619 > };
620 >
621 > serverinfo_ssl_message_digest_algorithm: SSL_MESSAGE_DIGEST_ALGORITHM '=' QSTRING ';'
622 > {
623 > #ifdef HAVE_LIBCRYPTO
624 >  if (conf_parser_ctx.pass == 2)
625 >  {
626 >    if ((ConfigServerInfo.message_digest_algorithm = EVP_get_digestbyname(yylval.string)) == NULL)
627 >    {
628 >      ConfigServerInfo.message_digest_algorithm = EVP_sha256();
629 >      conf_error_report("Ignoring serverinfo::ssl_message_digest_algorithm -- unknown message digest algorithm");
630 >    }
631 >  }
632 > #endif
633 > }
634 >
635 > serverinfo_ssl_dh_elliptic_curve: SSL_DH_ELLIPTIC_CURVE '=' QSTRING ';'
636 > {
637 > #ifdef HAVE_LIBCRYPTO
638 > #if OPENSSL_VERSION_NUMBER >= 0x1000005FL && !defined(OPENSSL_NO_ECDH)
639 >  int nid = 0;
640 >  EC_KEY *key = NULL;
641 >
642 >  if (conf_parser_ctx.pass == 2)
643 >  {
644 >    if ((nid = OBJ_sn2nid(yylval.string)) == 0)
645 >    {
646 >        conf_error_report("Ignoring serverinfo::serverinfo_ssl_dh_elliptic_curve -- unknown curve name");
647 >        break;
648 >    }
649 >
650 >    if ((key = EC_KEY_new_by_curve_name(nid)) == NULL)
651 >    {
652 >      conf_error_report("Ignoring serverinfo::serverinfo_ssl_dh_elliptic_curve -- could not create curve");
653 >      break;
654 >    }
655 >
656 >    SSL_CTX_set_tmp_ecdh(ConfigServerInfo.server_ctx, key);
657 >    EC_KEY_free(key);
658 > }
659 > #endif
660   #endif
661   };
662  
663 < serverinfo_name: NAME '=' QSTRING ';'
663 > serverinfo_name: NAME '=' QSTRING ';'
664   {
665    /* this isn't rehashable */
666 <  if (conf_parser_ctx.pass == 2 && !ServerInfo.name)
666 >  if (conf_parser_ctx.pass == 2 && !ConfigServerInfo.name)
667    {
668      if (valid_servname(yylval.string))
669 <      ServerInfo.name = xstrdup(yylval.string);
669 >      ConfigServerInfo.name = xstrdup(yylval.string);
670      else
671      {
672        conf_error_report("Ignoring serverinfo::name -- invalid name. Aborting.");
# Line 660 | Line 675 | serverinfo_name: NAME '=' QSTRING ';'
675    }
676   };
677  
678 < serverinfo_sid: IRCD_SID '=' QSTRING ';'
678 > serverinfo_sid: IRCD_SID '=' QSTRING ';'
679   {
680    /* this isn't rehashable */
681 <  if (conf_parser_ctx.pass == 2 && !ServerInfo.sid)
681 >  if (conf_parser_ctx.pass == 2 && !ConfigServerInfo.sid)
682    {
683      if (valid_sid(yylval.string))
684 <      ServerInfo.sid = xstrdup(yylval.string);
684 >      ConfigServerInfo.sid = xstrdup(yylval.string);
685      else
686      {
687        conf_error_report("Ignoring serverinfo::sid -- invalid SID. Aborting.");
# Line 679 | Line 694 | serverinfo_description: DESCRIPTION '='
694   {
695    if (conf_parser_ctx.pass == 2)
696    {
697 <    MyFree(ServerInfo.description);
698 <    ServerInfo.description = xstrdup(yylval.string);
697 >    MyFree(ConfigServerInfo.description);
698 >    ConfigServerInfo.description = xstrdup(yylval.string);
699 >    strlcpy(me.info, ConfigServerInfo.description, sizeof(me.info));
700    }
701   };
702  
# Line 690 | Line 706 | serverinfo_network_name: NETWORK_NAME '=
706    {
707      char *p;
708  
709 <    if ((p = strchr(yylval.string, ' ')) != NULL)
710 <      p = '\0';
709 >    if ((p = strchr(yylval.string, ' ')))
710 >      *p = '\0';
711  
712 <    MyFree(ServerInfo.network_name);
713 <    ServerInfo.network_name = xstrdup(yylval.string);
712 >    MyFree(ConfigServerInfo.network_name);
713 >    ConfigServerInfo.network_name = xstrdup(yylval.string);
714    }
715   };
716  
# Line 703 | Line 719 | serverinfo_network_desc: NETWORK_DESC '=
719    if (conf_parser_ctx.pass != 2)
720      break;
721  
722 <  MyFree(ServerInfo.network_desc);
723 <  ServerInfo.network_desc = xstrdup(yylval.string);
722 >  MyFree(ConfigServerInfo.network_desc);
723 >  ConfigServerInfo.network_desc = xstrdup(yylval.string);
724   };
725  
726   serverinfo_vhost: VHOST '=' QSTRING ';'
# Line 723 | Line 739 | serverinfo_vhost: VHOST '=' QSTRING ';'
739        ilog(LOG_TYPE_IRCD, "Invalid netmask for server vhost(%s)", yylval.string);
740      else
741      {
742 <      assert(res != NULL);
742 >      assert(res);
743  
744 <      memcpy(&ServerInfo.ip, res->ai_addr, res->ai_addrlen);
745 <      ServerInfo.ip.ss.ss_family = res->ai_family;
746 <      ServerInfo.ip.ss_len = res->ai_addrlen;
744 >      memcpy(&ConfigServerInfo.ip, res->ai_addr, res->ai_addrlen);
745 >      ConfigServerInfo.ip.ss.ss_family = res->ai_family;
746 >      ConfigServerInfo.ip.ss_len = res->ai_addrlen;
747        freeaddrinfo(res);
748  
749 <      ServerInfo.specific_ipv4_vhost = 1;
749 >      ConfigServerInfo.specific_ipv4_vhost = 1;
750      }
751    }
752   };
753  
754   serverinfo_vhost6: VHOST6 '=' QSTRING ';'
755   {
740 #ifdef IPV6
756    if (conf_parser_ctx.pass == 2 && *yylval.string != '*')
757    {
758      struct addrinfo hints, *res;
# Line 752 | Line 767 | serverinfo_vhost6: VHOST6 '=' QSTRING ';
767        ilog(LOG_TYPE_IRCD, "Invalid netmask for server vhost6(%s)", yylval.string);
768      else
769      {
770 <      assert(res != NULL);
770 >      assert(res);
771  
772 <      memcpy(&ServerInfo.ip6, res->ai_addr, res->ai_addrlen);
773 <      ServerInfo.ip6.ss.ss_family = res->ai_family;
774 <      ServerInfo.ip6.ss_len = res->ai_addrlen;
772 >      memcpy(&ConfigServerInfo.ip6, res->ai_addr, res->ai_addrlen);
773 >      ConfigServerInfo.ip6.ss.ss_family = res->ai_family;
774 >      ConfigServerInfo.ip6.ss_len = res->ai_addrlen;
775        freeaddrinfo(res);
776  
777 <      ServerInfo.specific_ipv6_vhost = 1;
777 >      ConfigServerInfo.specific_ipv6_vhost = 1;
778      }
779    }
765 #endif
780   };
781  
782   serverinfo_max_clients: T_MAX_CLIENTS '=' NUMBER ';'
# Line 772 | Line 786 | serverinfo_max_clients: T_MAX_CLIENTS '=
786  
787    if ($3 < MAXCLIENTS_MIN)
788    {
789 <    char buf[IRCD_BUFSIZE];
789 >    char buf[IRCD_BUFSIZE] = "";
790  
791      snprintf(buf, sizeof(buf), "MAXCLIENTS too low, setting to %d", MAXCLIENTS_MIN);
792      conf_error_report(buf);
793 <    ServerInfo.max_clients = MAXCLIENTS_MIN;
793 >    ConfigServerInfo.max_clients = MAXCLIENTS_MIN;
794    }
795    else if ($3 > MAXCLIENTS_MAX)
796    {
797 <    char buf[IRCD_BUFSIZE];
797 >    char buf[IRCD_BUFSIZE] = "";
798  
799      snprintf(buf, sizeof(buf), "MAXCLIENTS too high, setting to %d", MAXCLIENTS_MAX);
800      conf_error_report(buf);
801 <    ServerInfo.max_clients = MAXCLIENTS_MAX;
801 >    ConfigServerInfo.max_clients = MAXCLIENTS_MAX;
802    }
803    else
804 <    ServerInfo.max_clients = $3;
804 >    ConfigServerInfo.max_clients = $3;
805   };
806  
807   serverinfo_max_nick_length: MAX_NICK_LENGTH '=' NUMBER ';'
# Line 798 | Line 812 | serverinfo_max_nick_length: MAX_NICK_LEN
812    if ($3 < 9)
813    {
814      conf_error_report("max_nick_length too low, setting to 9");
815 <    ServerInfo.max_nick_length = 9;
815 >    ConfigServerInfo.max_nick_length = 9;
816    }
817    else if ($3 > NICKLEN)
818    {
819 <    char buf[IRCD_BUFSIZE];
819 >    char buf[IRCD_BUFSIZE] = "";
820  
821      snprintf(buf, sizeof(buf), "max_nick_length too high, setting to %d", NICKLEN);
822      conf_error_report(buf);
823 <    ServerInfo.max_nick_length = NICKLEN;
823 >    ConfigServerInfo.max_nick_length = NICKLEN;
824    }
825    else
826 <    ServerInfo.max_nick_length = $3;
826 >    ConfigServerInfo.max_nick_length = $3;
827   };
828  
829   serverinfo_max_topic_length: MAX_TOPIC_LENGTH '=' NUMBER ';'
# Line 820 | Line 834 | serverinfo_max_topic_length: MAX_TOPIC_L
834    if ($3 < 80)
835    {
836      conf_error_report("max_topic_length too low, setting to 80");
837 <    ServerInfo.max_topic_length = 80;
837 >    ConfigServerInfo.max_topic_length = 80;
838    }
839    else if ($3 > TOPICLEN)
840    {
841 <    char buf[IRCD_BUFSIZE];
841 >    char buf[IRCD_BUFSIZE] = "";
842  
843      snprintf(buf, sizeof(buf), "max_topic_length too high, setting to %d", TOPICLEN);
844      conf_error_report(buf);
845 <    ServerInfo.max_topic_length = TOPICLEN;
845 >    ConfigServerInfo.max_topic_length = TOPICLEN;
846    }
847    else
848 <    ServerInfo.max_topic_length = $3;
848 >    ConfigServerInfo.max_topic_length = $3;
849   };
850  
851 < serverinfo_hub: HUB '=' TBOOL ';'
851 > serverinfo_hub: HUB '=' TBOOL ';'
852   {
853    if (conf_parser_ctx.pass == 2)
854 <    ServerInfo.hub = yylval.number;
854 >    ConfigServerInfo.hub = yylval.number;
855   };
856  
857   /***************************************************************************
# Line 846 | Line 860 | serverinfo_hub: HUB '=' TBOOL ';'
860   admin_entry: ADMIN  '{' admin_items '}' ';' ;
861  
862   admin_items: admin_items admin_item | admin_item;
863 < admin_item:  admin_name | admin_description |
864 <             admin_email | error ';' ;
863 > admin_item:  admin_name |
864 >             admin_description |
865 >             admin_email |
866 >             error ';' ;
867  
868 < admin_name: NAME '=' QSTRING ';'
868 > admin_name: NAME '=' QSTRING ';'
869   {
870    if (conf_parser_ctx.pass != 2)
871      break;
872  
873 <  MyFree(AdminInfo.name);
874 <  AdminInfo.name = xstrdup(yylval.string);
873 >  MyFree(ConfigAdminInfo.name);
874 >  ConfigAdminInfo.name = xstrdup(yylval.string);
875   };
876  
877   admin_email: EMAIL '=' QSTRING ';'
# Line 863 | Line 879 | admin_email: EMAIL '=' QSTRING ';'
879    if (conf_parser_ctx.pass != 2)
880      break;
881  
882 <  MyFree(AdminInfo.email);
883 <  AdminInfo.email = xstrdup(yylval.string);
882 >  MyFree(ConfigAdminInfo.email);
883 >  ConfigAdminInfo.email = xstrdup(yylval.string);
884   };
885  
886   admin_description: DESCRIPTION '=' QSTRING ';'
# Line 872 | Line 888 | admin_description: DESCRIPTION '=' QSTRI
888    if (conf_parser_ctx.pass != 2)
889      break;
890  
891 <  MyFree(AdminInfo.description);
892 <  AdminInfo.description = xstrdup(yylval.string);
891 >  MyFree(ConfigAdminInfo.description);
892 >  ConfigAdminInfo.description = xstrdup(yylval.string);
893   };
894  
895   /***************************************************************************
896   * motd section
897   ***************************************************************************/
898 < motd_entry: MOTD
898 > motd_entry: MOTD
899   {
900    if (conf_parser_ctx.pass == 2)
901      reset_block_state();
# Line 900 | Line 916 | motd_entry: MOTD
916   motd_items: motd_items motd_item | motd_item;
917   motd_item:  motd_mask | motd_file | error ';' ;
918  
919 < motd_mask: MASK '=' QSTRING ';'
919 > motd_mask: MASK '=' QSTRING ';'
920   {
921    if (conf_parser_ctx.pass == 2)
922      dlinkAdd(xstrdup(yylval.string), make_dlink_node(), &block_state.mask.list);
# Line 913 | Line 929 | motd_file: T_FILE '=' QSTRING ';'
929   };
930  
931   /***************************************************************************
932 + * pseudo section
933 + ***************************************************************************/
934 + pseudo_entry: T_PSEUDO
935 + {
936 +  if (conf_parser_ctx.pass == 2)
937 +    reset_block_state();
938 + } '{' pseudo_items '}' ';'
939 + {
940 +  if (conf_parser_ctx.pass != 2)
941 +    break;
942 +
943 +  if (!block_state.command.buf[0] ||
944 +      !block_state.name.buf[0] ||
945 +      !block_state.nick.buf[0] ||
946 +      !block_state.host.buf[0])
947 +    break;
948 +
949 +  pseudo_register(block_state.name.buf, block_state.nick.buf, block_state.host.buf,
950 +                  block_state.prepend.buf, block_state.command.buf);
951 + };
952 +
953 + pseudo_items: pseudo_items pseudo_item | pseudo_item;
954 + pseudo_item:  pseudo_command | pseudo_prepend | pseudo_name | pseudo_target | error ';' ;
955 +
956 + pseudo_command: T_COMMAND '=' QSTRING ';'
957 + {
958 +  if (conf_parser_ctx.pass == 2)
959 +    strlcpy(block_state.command.buf, yylval.string, sizeof(block_state.command.buf));
960 + };
961 +
962 + pseudo_name: NAME '=' QSTRING ';'
963 + {
964 +  if (conf_parser_ctx.pass == 2)
965 +    strlcpy(block_state.name.buf, yylval.string, sizeof(block_state.name.buf));
966 + };
967 +
968 + pseudo_prepend: T_PREPEND '=' QSTRING ';'
969 + {
970 +  if (conf_parser_ctx.pass == 2)
971 +    strlcpy(block_state.prepend.buf, yylval.string, sizeof(block_state.prepend.buf));
972 + };
973 +
974 + pseudo_target: T_TARGET '=' QSTRING ';'
975 + {
976 +  if (conf_parser_ctx.pass == 2)
977 +  {
978 +    struct split_nuh_item nuh;
979 +
980 +    nuh.nuhmask  = yylval.string;
981 +    nuh.nickptr  = NULL;
982 +    nuh.userptr  = block_state.user.buf;
983 +    nuh.hostptr  = block_state.host.buf;
984 +    nuh.nicksize = 0;
985 +    nuh.usersize = sizeof(block_state.nick.buf);
986 +    nuh.hostsize = sizeof(block_state.host.buf);
987 +    split_nuh(&nuh);
988 +
989 +    strlcpy(block_state.nick.buf, nuh.userptr, sizeof(block_state.nick.buf));
990 +    strlcpy(block_state.host.buf, nuh.hostptr, sizeof(block_state.host.buf));
991 +  }
992 + };
993 +
994 + /***************************************************************************
995   *  section logging
996   ***************************************************************************/
997   logging_entry:          T_LOG  '{' logging_items '}' ';' ;
998   logging_items:          logging_items logging_item | logging_item ;
999  
1000 < logging_item:           logging_use_logging | logging_file_entry |
1001 <                        error ';' ;
1000 > logging_item:           logging_use_logging | logging_file_entry |
1001 >                        error ';' ;
1002  
1003   logging_use_logging: USE_LOGGING '=' TBOOL ';'
1004   {
1005    if (conf_parser_ctx.pass == 2)
1006 <    ConfigLoggingEntry.use_logging = yylval.number;
1006 >    ConfigLog.use_logging = yylval.number;
1007   };
1008  
1009   logging_file_entry:
# Line 982 | Line 1061 | logging_file_type_item:  USER
1061   {
1062    if (conf_parser_ctx.pass == 2)
1063      block_state.type.value = LOG_TYPE_GLINE;
1064 + } | XLINE
1065 + {
1066 +  if (conf_parser_ctx.pass == 2)
1067 +    block_state.type.value = LOG_TYPE_XLINE;
1068 + } | RESV
1069 + {
1070 +  if (conf_parser_ctx.pass == 2)
1071 +    block_state.type.value = LOG_TYPE_RESV;
1072   } | T_DLINE
1073   {
1074    if (conf_parser_ctx.pass == 2)
# Line 1004 | Line 1091 | logging_file_type_item:  USER
1091   /***************************************************************************
1092   * section oper
1093   ***************************************************************************/
1094 < oper_entry: OPERATOR
1094 > oper_entry: OPERATOR
1095   {
1096    if (conf_parser_ctx.pass != 2)
1097      break;
# Line 1069 | Line 1156 | oper_entry: OPERATOR
1156  
1157        if ((file = BIO_new_file(block_state.file.buf, "r")) == NULL)
1158        {
1159 <        conf_error_report("Ignoring rsa_public_key_file -- file doesn't exist");
1159 >        ilog(LOG_TYPE_IRCD, "Ignoring rsa_public_key_file -- file doesn't exist");
1160          break;
1161        }
1162  
1163        if ((pkey = PEM_read_bio_RSA_PUBKEY(file, NULL, 0, NULL)) == NULL)
1164 <        conf_error_report("Ignoring rsa_public_key_file -- Key invalid; check key syntax.");
1164 >        ilog(LOG_TYPE_IRCD, "Ignoring rsa_public_key_file -- key invalid; check key syntax");
1165 >      else
1166 >      {
1167 >        if (RSA_size(pkey) > 128)
1168 >          ilog(LOG_TYPE_IRCD, "Ignoring rsa_public_key_file -- key size must be 1024 or below");
1169 >        else
1170 >          conf->rsa_public_key = pkey;
1171 >      }
1172  
1079      conf->rsa_public_key = pkey;
1173        BIO_set_close(file, BIO_CLOSE);
1174        BIO_free(file);
1175      }
# Line 1085 | Line 1178 | oper_entry: OPERATOR
1178   };
1179  
1180   oper_items:     oper_items oper_item | oper_item;
1181 < oper_item:      oper_name | oper_user | oper_password |
1182 <                oper_umodes | oper_class | oper_encrypted |
1183 <                oper_rsa_public_key_file | oper_ssl_certificate_fingerprint |
1184 <                oper_ssl_connection_required |
1185 <                oper_flags | error ';' ;
1181 > oper_item:      oper_name |
1182 >                oper_user |
1183 >                oper_password |
1184 >                oper_umodes |
1185 >                oper_class |
1186 >                oper_encrypted |
1187 >                oper_rsa_public_key_file |
1188 >                oper_ssl_certificate_fingerprint |
1189 >                oper_ssl_connection_required |
1190 >                oper_flags |
1191 >                error ';' ;
1192  
1193   oper_name: NAME '=' QSTRING ';'
1194   {
# Line 1180 | Line 1279 | oper_umodes_item:  T_BOTS
1279   {
1280    if (conf_parser_ctx.pass == 2)
1281      block_state.modes.value |= UMODE_HIDDEN;
1282 + } | HIDE_CHANS
1283 + {
1284 +  if (conf_parser_ctx.pass == 2)
1285 +    block_state.modes.value |= UMODE_HIDECHANS;
1286 + } | HIDE_IDLE
1287 + {
1288 +  if (conf_parser_ctx.pass == 2)
1289 +    block_state.modes.value |= UMODE_HIDEIDLE;
1290   } | T_SKILL
1291   {
1292    if (conf_parser_ctx.pass == 2)
# Line 1204 | Line 1311 | oper_umodes_item:  T_BOTS
1311   {
1312    if (conf_parser_ctx.pass == 2)
1313      block_state.modes.value |= UMODE_EXTERNAL;
1207 } | T_OPERWALL
1208 {
1209  if (conf_parser_ctx.pass == 2)
1210    block_state.modes.value |= UMODE_OPERWALL;
1314   } | T_SERVNOTICE
1315   {
1316    if (conf_parser_ctx.pass == 2)
# Line 1276 | Line 1379 | oper_flags_item: KILL ':' REMOTE
1379   } | KLINE
1380   {
1381    if (conf_parser_ctx.pass == 2)
1382 <    block_state.port.value |= OPER_FLAG_K;
1382 >    block_state.port.value |= OPER_FLAG_KLINE;
1383   } | UNKLINE
1384   {
1385    if (conf_parser_ctx.pass == 2)
# Line 1292 | Line 1395 | oper_flags_item: KILL ':' REMOTE
1395   } | XLINE
1396   {
1397    if (conf_parser_ctx.pass == 2)
1398 <    block_state.port.value |= OPER_FLAG_X;
1398 >    block_state.port.value |= OPER_FLAG_XLINE;
1399 > } | T_UNXLINE
1400 > {
1401 >  if (conf_parser_ctx.pass == 2)
1402 >    block_state.port.value |= OPER_FLAG_UNXLINE;
1403   } | GLINE
1404   {
1405    if (conf_parser_ctx.pass == 2)
# Line 1313 | Line 1420 | oper_flags_item: KILL ':' REMOTE
1420   {
1421    if (conf_parser_ctx.pass == 2)
1422      block_state.port.value |= OPER_FLAG_ADMIN;
1316 } | T_OPERWALL
1317 {
1318  if (conf_parser_ctx.pass == 2)
1319    block_state.port.value |= OPER_FLAG_OPERWALL;
1423   } | T_GLOBOPS
1424   {
1425    if (conf_parser_ctx.pass == 2)
# Line 1384 | Line 1487 | class_entry: CLASS
1487    class->max_ident = block_state.max_ident.value;
1488    class->max_sendq = block_state.max_sendq.value;
1489    class->max_recvq = block_state.max_recvq.value;
1490 +  class->max_channels = block_state.max_channels.value;
1491  
1492    if (block_state.min_idle.value > block_state.max_idle.value)
1493    {
# Line 1410 | Line 1514 | class_entry: CLASS
1514  
1515   class_items:    class_items class_item | class_item;
1516   class_item:     class_name |
1517 <                class_cidr_bitlen_ipv4 | class_cidr_bitlen_ipv6 |
1517 >                class_cidr_bitlen_ipv4 |
1518 >                class_cidr_bitlen_ipv6 |
1519                  class_ping_time |
1520 <                class_number_per_cidr |
1520 >                class_number_per_cidr |
1521                  class_number_per_ip |
1522                  class_connectfreq |
1523 +                class_max_channels |
1524                  class_max_number |
1525 <                class_max_global |
1526 <                class_max_local |
1527 <                class_max_ident |
1525 >                class_max_global |
1526 >                class_max_local |
1527 >                class_max_ident |
1528                  class_sendq | class_recvq |
1529                  class_min_idle |
1530                  class_max_idle |
1531                  class_flags |
1532 <                error ';' ;
1532 >                error ';' ;
1533  
1534 < class_name: NAME '=' QSTRING ';'
1534 > class_name: NAME '=' QSTRING ';'
1535   {
1536    if (conf_parser_ctx.pass == 1)
1537      strlcpy(block_state.class.buf, yylval.string, sizeof(block_state.class.buf));
# Line 1449 | Line 1555 | class_connectfreq: CONNECTFREQ '=' times
1555      block_state.con_freq.value = $3;
1556   };
1557  
1558 + class_max_channels: MAX_CHANNELS '=' NUMBER ';'
1559 + {
1560 +  if (conf_parser_ctx.pass == 1)
1561 +    block_state.max_channels.value = $3;
1562 + };
1563 +
1564   class_max_number: MAX_NUMBER '=' NUMBER ';'
1565   {
1566    if (conf_parser_ctx.pass == 1)
# Line 1580 | Line 1692 | port_item: NUMBER
1692   {
1693    if (conf_parser_ctx.pass == 2)
1694    {
1695 + #ifndef HAVE_LIBCRYPTO
1696      if (block_state.flags.value & LISTENER_SSL)
1697 < #ifdef HAVE_LIBCRYPTO
1698 <      if (!ServerInfo.server_ctx)
1697 >    {
1698 >      conf_error_report("SSL not available - port closed");
1699 >      break;
1700 >    }
1701   #endif
1587      {
1588        conf_error_report("SSL not available - port closed");
1589        break;
1590      }
1702      add_listener($1, block_state.addr.buf, block_state.flags.value);
1703    }
1704   } | NUMBER TWODOTS NUMBER
1705   {
1706    if (conf_parser_ctx.pass == 2)
1707    {
1708 <    int i;
1598 <
1708 > #ifndef HAVE_LIBCRYPTO
1709      if (block_state.flags.value & LISTENER_SSL)
1710 < #ifdef HAVE_LIBCRYPTO
1711 <      if (!ServerInfo.server_ctx)
1710 >    {
1711 >      conf_error_report("SSL not available - port closed");
1712 >      break;
1713 >    }
1714   #endif
1603      {
1604        conf_error_report("SSL not available - port closed");
1605        break;
1606      }
1715  
1716 <    for (i = $1; i <= $3; ++i)
1716 >    for (int i = $1; i <= $3; ++i)
1717        add_listener(i, block_state.addr.buf, block_state.flags.value);
1718    }
1719   };
# Line 1665 | Line 1773 | auth_entry: IRCD_AUTH
1773      conf_add_class_to_conf(conf, block_state.class.buf);
1774      add_conf_by_address(CONF_CLIENT, conf);
1775    }
1776 < };
1776 > };
1777  
1778   auth_items:     auth_items auth_item | auth_item;
1779 < auth_item:      auth_user | auth_passwd | auth_class | auth_flags |
1780 <                auth_spoof | auth_redir_serv | auth_redir_port |
1781 <                auth_encrypted | error ';' ;
1779 > auth_item:      auth_user |
1780 >                auth_passwd |
1781 >                auth_class |
1782 >                auth_flags |
1783 >                auth_spoof |
1784 >                auth_redir_serv |
1785 >                auth_redir_port |
1786 >                auth_encrypted |
1787 >                error ';' ;
1788  
1789   auth_user: USER '=' QSTRING ';'
1790   {
# Line 1750 | Line 1864 | auth_flags_item: SPOOF_NOTICE
1864      block_state.flags.value |= CONF_FLAGS_NEED_PASSWORD;
1865   };
1866  
1867 < auth_spoof: SPOOF '=' QSTRING ';'
1867 > auth_spoof: SPOOF '=' QSTRING ';'
1868   {
1869    if (conf_parser_ctx.pass != 2)
1870      break;
1871  
1872 <  if (strlen(yylval.string) <= HOSTLEN && valid_hostname(yylval.string))
1872 >  if (valid_hostname(yylval.string))
1873    {
1874      strlcpy(block_state.name.buf, yylval.string, sizeof(block_state.name.buf));
1875      block_state.flags.value |= CONF_FLAGS_SPOOF_IP;
# Line 1801 | Line 1915 | resv_entry: RESV
1915    create_resv(block_state.name.buf, block_state.rpass.buf, &block_state.mask.list);
1916   };
1917  
1918 < resv_items:     resv_items resv_item | resv_item;
1919 < resv_item:      resv_mask | resv_reason | resv_exempt | error ';' ;
1918 > resv_items:     resv_items resv_item | resv_item;
1919 > resv_item:      resv_mask | resv_reason | resv_exempt | error ';' ;
1920  
1921   resv_mask: MASK '=' QSTRING ';'
1922   {
# Line 1972 | Line 2086 | cluster_entry: T_CLUSTER
2086    conf->name = xstrdup(block_state.name.buf);
2087   };
2088  
2089 < cluster_items:  cluster_items cluster_item | cluster_item;
2090 < cluster_item:   cluster_name | cluster_type | error ';' ;
2089 > cluster_items:  cluster_items cluster_item | cluster_item;
2090 > cluster_item:   cluster_name | cluster_type | error ';' ;
2091  
2092   cluster_name: NAME '=' QSTRING ';'
2093   {
# Line 1987 | Line 2101 | cluster_type: TYPE
2101      block_state.flags.value = 0;
2102   } '=' cluster_types ';' ;
2103  
2104 < cluster_types:  cluster_types ',' cluster_type_item | cluster_type_item;
2104 > cluster_types:  cluster_types ',' cluster_type_item | cluster_type_item;
2105   cluster_type_item: KLINE
2106   {
2107    if (conf_parser_ctx.pass == 2)
# Line 2033 | Line 2147 | cluster_type_item: KLINE
2147   /***************************************************************************
2148   *  section connect
2149   ***************************************************************************/
2150 < connect_entry: CONNECT  
2150 > connect_entry: CONNECT
2151   {
2152  
2153    if (conf_parser_ctx.pass != 2)
2154      break;
2155  
2156    reset_block_state();
2157 +  block_state.aftype.value = AF_INET;
2158    block_state.port.value = PORTNUM;
2159   } '{' connect_items '}' ';'
2160   {
# Line 2091 | Line 2206 | connect_entry: CONNECT
2206        ilog(LOG_TYPE_IRCD, "Invalid netmask for server vhost(%s)", block_state.bind.buf);
2207      else
2208      {
2209 <      assert(res != NULL);
2209 >      assert(res);
2210  
2211        memcpy(&conf->bind, res->ai_addr, res->ai_addrlen);
2212        conf->bind.ss.ss_family = res->ai_family;
# Line 2105 | Line 2220 | connect_entry: CONNECT
2220   };
2221  
2222   connect_items:  connect_items connect_item | connect_item;
2223 < connect_item:   connect_name | connect_host | connect_vhost |
2224 <                connect_send_password | connect_accept_password |
2225 <                connect_ssl_certificate_fingerprint |
2226 <                connect_aftype | connect_port | connect_ssl_cipher_list |
2227 <                connect_flags | connect_hub_mask | connect_leaf_mask |
2228 <                connect_class | connect_encrypted |
2223 > connect_item:   connect_name |
2224 >                connect_host |
2225 >                connect_vhost |
2226 >                connect_send_password |
2227 >                connect_accept_password |
2228 >                connect_ssl_certificate_fingerprint |
2229 >                connect_aftype |
2230 >                connect_port |
2231 >                connect_ssl_cipher_list |
2232 >                connect_flags |
2233 >                connect_hub_mask |
2234 >                connect_leaf_mask |
2235 >                connect_class |
2236 >                connect_encrypted |
2237                  error ';' ;
2238  
2239   connect_name: NAME '=' QSTRING ';'
# Line 2119 | Line 2242 | connect_name: NAME '=' QSTRING ';'
2242      strlcpy(block_state.name.buf, yylval.string, sizeof(block_state.name.buf));
2243   };
2244  
2245 < connect_host: HOST '=' QSTRING ';'
2245 > connect_host: HOST '=' QSTRING ';'
2246   {
2247    if (conf_parser_ctx.pass == 2)
2248      strlcpy(block_state.host.buf, yylval.string, sizeof(block_state.host.buf));
2249   };
2250  
2251 < connect_vhost: VHOST '=' QSTRING ';'
2251 > connect_vhost: VHOST '=' QSTRING ';'
2252   {
2253    if (conf_parser_ctx.pass == 2)
2254      strlcpy(block_state.bind.buf, yylval.string, sizeof(block_state.bind.buf));
2255   };
2256 <
2256 >
2257   connect_send_password: SEND_PASSWORD '=' QSTRING ';'
2258   {
2259    if (conf_parser_ctx.pass != 2)
# Line 2138 | Line 2261 | connect_send_password: SEND_PASSWORD '='
2261  
2262    if ($3[0] == ':')
2263      conf_error_report("Server passwords cannot begin with a colon");
2264 <  else if (strchr($3, ' ') != NULL)
2264 >  else if (strchr($3, ' '))
2265      conf_error_report("Server passwords cannot contain spaces");
2266    else
2267      strlcpy(block_state.spass.buf, yylval.string, sizeof(block_state.spass.buf));
# Line 2151 | Line 2274 | connect_accept_password: ACCEPT_PASSWORD
2274  
2275    if ($3[0] == ':')
2276      conf_error_report("Server passwords cannot begin with a colon");
2277 <  else if (strchr($3, ' ') != NULL)
2277 >  else if (strchr($3, ' '))
2278      conf_error_report("Server passwords cannot contain spaces");
2279    else
2280      strlcpy(block_state.rpass.buf, yylval.string, sizeof(block_state.rpass.buf));
# Line 2175 | Line 2298 | connect_aftype: AFTYPE '=' T_IPV4 ';'
2298      block_state.aftype.value = AF_INET;
2299   } | AFTYPE '=' T_IPV6 ';'
2300   {
2178 #ifdef IPV6
2301    if (conf_parser_ctx.pass == 2)
2302      block_state.aftype.value = AF_INET6;
2181 #endif
2303   };
2304  
2305   connect_flags: IRCD_FLAGS
# Line 2208 | Line 2329 | connect_encrypted: ENCRYPTED '=' TBOOL '
2329    }
2330   };
2331  
2332 < connect_hub_mask: HUB_MASK '=' QSTRING ';'
2332 > connect_hub_mask: HUB_MASK '=' QSTRING ';'
2333   {
2334    if (conf_parser_ctx.pass == 2)
2335      dlinkAdd(xstrdup(yylval.string), make_dlink_node(), &block_state.hub.list);
2336   };
2337  
2338 < connect_leaf_mask: LEAF_MASK '=' QSTRING ';'
2338 > connect_leaf_mask: LEAF_MASK '=' QSTRING ';'
2339   {
2340    if (conf_parser_ctx.pass == 2)
2341      dlinkAdd(xstrdup(yylval.string), make_dlink_node(), &block_state.leaf.list);
# Line 2265 | Line 2386 | kill_entry: KILL
2386    else
2387      conf->reason = xstrdup(CONF_NOREASON);
2388    add_conf_by_address(CONF_KLINE, conf);
2389 < };
2389 > };
2390  
2391   kill_items:     kill_items kill_item | kill_item;
2392   kill_item:      kill_user | kill_reason | error;
# Line 2290 | Line 2411 | kill_user: USER '=' QSTRING ';'
2411    }
2412   };
2413  
2414 < kill_reason: REASON '=' QSTRING ';'
2414 > kill_reason: REASON '=' QSTRING ';'
2415   {
2416    if (conf_parser_ctx.pass == 2)
2417      strlcpy(block_state.rpass.buf, yylval.string, sizeof(block_state.rpass.buf));
# Line 2299 | Line 2420 | kill_reason: REASON '=' QSTRING ';'
2420   /***************************************************************************
2421   *  section deny
2422   ***************************************************************************/
2423 < deny_entry: DENY
2423 > deny_entry: DENY
2424   {
2425    if (conf_parser_ctx.pass == 2)
2426      reset_block_state();
# Line 2324 | Line 2445 | deny_entry: DENY
2445        conf->reason = xstrdup(CONF_NOREASON);
2446      add_conf_by_address(CONF_DLINE, conf);
2447    }
2448 < };
2448 > };
2449  
2450   deny_items:     deny_items deny_item | deny_item;
2451   deny_item:      deny_ip | deny_reason | error;
# Line 2335 | Line 2456 | deny_ip: IP '=' QSTRING ';'
2456      strlcpy(block_state.addr.buf, yylval.string, sizeof(block_state.addr.buf));
2457   };
2458  
2459 < deny_reason: REASON '=' QSTRING ';'
2459 > deny_reason: REASON '=' QSTRING ';'
2460   {
2461    if (conf_parser_ctx.pass == 2)
2462      strlcpy(block_state.rpass.buf, yylval.string, sizeof(block_state.rpass.buf));
# Line 2392 | Line 2513 | gecos_entry: GECOS
2513   gecos_items: gecos_items gecos_item | gecos_item;
2514   gecos_item:  gecos_name | gecos_reason | error;
2515  
2516 < gecos_name: NAME '=' QSTRING ';'
2516 > gecos_name: NAME '=' QSTRING ';'
2517   {
2518    if (conf_parser_ctx.pass == 2)
2519      strlcpy(block_state.name.buf, yylval.string, sizeof(block_state.name.buf));
2520   };
2521  
2522 < gecos_reason: REASON '=' QSTRING ';'
2522 > gecos_reason: REASON '=' QSTRING ';'
2523   {
2524    if (conf_parser_ctx.pass == 2)
2525      strlcpy(block_state.rpass.buf, yylval.string, sizeof(block_state.rpass.buf));
# Line 2411 | Line 2532 | general_entry: GENERAL
2532    '{' general_items '}' ';';
2533  
2534   general_items:      general_items general_item | general_item;
2535 < general_item:       general_hide_spoof_ips | general_ignore_bogus_ts |
2536 <                    general_failed_oper_notice | general_anti_nick_flood |
2537 <                    general_max_nick_time | general_max_nick_changes |
2538 <                    general_max_accept | general_anti_spam_exit_message_time |
2539 <                    general_ts_warn_delta | general_ts_max_delta |
2535 > general_item:       general_away_count |
2536 >                    general_away_time |
2537 >                    general_hide_spoof_ips |
2538 >                    general_ignore_bogus_ts |
2539 >                    general_failed_oper_notice |
2540 >                    general_anti_nick_flood |
2541 >                    general_max_nick_time |
2542 >                    general_max_nick_changes |
2543 >                    general_max_accept |
2544 >                    general_anti_spam_exit_message_time |
2545 >                    general_ts_warn_delta |
2546 >                    general_ts_max_delta |
2547                      general_kill_chase_time_limit |
2548                      general_invisible_on_connect |
2549 <                    general_warn_no_nline | general_dots_in_ident |
2550 <                    general_stats_o_oper_only | general_stats_k_oper_only |
2551 <                    general_pace_wait | general_stats_i_oper_only |
2552 <                    general_pace_wait_simple | general_stats_P_oper_only |
2553 <                    general_short_motd | general_no_oper_flood |
2554 <                    general_true_no_oper_flood | general_oper_pass_resv |
2555 <                    general_oper_only_umodes | general_max_targets |
2556 <                    general_use_egd | general_egdpool_path |
2557 <                    general_oper_umodes | general_caller_id_wait |
2558 <                    general_opers_bypass_callerid | general_default_floodcount |
2559 <                    general_min_nonwildcard | general_min_nonwildcard_simple |
2560 <                    general_throttle_time | general_havent_read_conf |
2549 >                    general_warn_no_connect_block |
2550 >                    general_dots_in_ident |
2551 >                    general_stats_o_oper_only |
2552 >                    general_stats_k_oper_only |
2553 >                    general_pace_wait |
2554 >                    general_stats_i_oper_only |
2555 >                    general_pace_wait_simple |
2556 >                    general_stats_P_oper_only |
2557 >                    general_stats_u_oper_only |
2558 >                    general_short_motd |
2559 >                    general_no_oper_flood |
2560 >                    general_true_no_oper_flood |
2561 >                    general_oper_pass_resv |
2562 >                    general_oper_only_umodes |
2563 >                    general_max_targets |
2564 >                    general_oper_umodes |
2565 >                    general_caller_id_wait |
2566 >                    general_opers_bypass_callerid |
2567 >                    general_default_floodcount |
2568 >                    general_min_nonwildcard |
2569 >                    general_min_nonwildcard_simple |
2570 >                    general_throttle_count |
2571 >                    general_throttle_time |
2572 >                    general_havent_read_conf |
2573                      general_ping_cookie |
2574 <                    general_disable_auth |
2575 <                    general_tkline_expire_notices | general_gline_enable |
2576 <                    general_gline_duration | general_gline_request_duration |
2574 >                    general_disable_auth |
2575 >                    general_tkline_expire_notices |
2576 >                    general_gline_enable |
2577 >                    general_gline_duration |
2578 >                    general_gline_request_duration |
2579                      general_gline_min_cidr |
2580                      general_gline_min_cidr6 |
2581 <                    general_stats_e_disabled |
2582 <                    general_max_watch | general_services_name |
2583 <                    error;
2581 >                    general_stats_e_disabled |
2582 >                    general_max_watch |
2583 >                    general_cycle_on_host_change |
2584 >                    error;
2585  
2586  
2587 + general_away_count: AWAY_COUNT '=' NUMBER ';'
2588 + {
2589 +  ConfigGeneral.away_count = $3;
2590 + };
2591 +
2592 + general_away_time: AWAY_TIME '=' timespec ';'
2593 + {
2594 +  ConfigGeneral.away_time = $3;
2595 + };
2596 +
2597   general_max_watch: MAX_WATCH '=' NUMBER ';'
2598   {
2599 <  ConfigFileEntry.max_watch = $3;
2599 >  ConfigGeneral.max_watch = $3;
2600 > };
2601 >
2602 > general_cycle_on_host_change: CYCLE_ON_HOST_CHANGE '=' TBOOL ';'
2603 > {
2604 >  if (conf_parser_ctx.pass == 2)
2605 >    ConfigGeneral.cycle_on_host_change = yylval.number;
2606   };
2607  
2608   general_gline_enable: GLINE_ENABLE '=' TBOOL ';'
2609   {
2610    if (conf_parser_ctx.pass == 2)
2611 <    ConfigFileEntry.glines = yylval.number;
2611 >    ConfigGeneral.glines = yylval.number;
2612   };
2613  
2614   general_gline_duration: GLINE_DURATION '=' timespec ';'
2615   {
2616    if (conf_parser_ctx.pass == 2)
2617 <    ConfigFileEntry.gline_time = $3;
2617 >    ConfigGeneral.gline_time = $3;
2618   };
2619  
2620   general_gline_request_duration: GLINE_REQUEST_DURATION '=' timespec ';'
2621   {
2622    if (conf_parser_ctx.pass == 2)
2623 <    ConfigFileEntry.gline_request_time = $3;
2623 >    ConfigGeneral.gline_request_time = $3;
2624   };
2625  
2626   general_gline_min_cidr: GLINE_MIN_CIDR '=' NUMBER ';'
2627   {
2628 <  ConfigFileEntry.gline_min_cidr = $3;
2628 >  ConfigGeneral.gline_min_cidr = $3;
2629   };
2630  
2631   general_gline_min_cidr6: GLINE_MIN_CIDR6 '=' NUMBER ';'
2632   {
2633 <  ConfigFileEntry.gline_min_cidr6 = $3;
2633 >  ConfigGeneral.gline_min_cidr6 = $3;
2634   };
2635  
2636   general_tkline_expire_notices: TKLINE_EXPIRE_NOTICES '=' TBOOL ';'
2637   {
2638 <  ConfigFileEntry.tkline_expire_notices = yylval.number;
2638 >  ConfigGeneral.tkline_expire_notices = yylval.number;
2639   };
2640  
2641   general_kill_chase_time_limit: KILL_CHASE_TIME_LIMIT '=' timespec ';'
2642   {
2643 <  ConfigFileEntry.kill_chase_time_limit = $3;
2643 >  ConfigGeneral.kill_chase_time_limit = $3;
2644   };
2645  
2646   general_hide_spoof_ips: HIDE_SPOOF_IPS '=' TBOOL ';'
2647   {
2648 <  ConfigFileEntry.hide_spoof_ips = yylval.number;
2648 >  ConfigGeneral.hide_spoof_ips = yylval.number;
2649   };
2650  
2651   general_ignore_bogus_ts: IGNORE_BOGUS_TS '=' TBOOL ';'
2652   {
2653 <  ConfigFileEntry.ignore_bogus_ts = yylval.number;
2653 >  ConfigGeneral.ignore_bogus_ts = yylval.number;
2654   };
2655  
2656   general_failed_oper_notice: FAILED_OPER_NOTICE '=' TBOOL ';'
2657   {
2658 <  ConfigFileEntry.failed_oper_notice = yylval.number;
2658 >  ConfigGeneral.failed_oper_notice = yylval.number;
2659   };
2660  
2661   general_anti_nick_flood: ANTI_NICK_FLOOD '=' TBOOL ';'
2662   {
2663 <  ConfigFileEntry.anti_nick_flood = yylval.number;
2663 >  ConfigGeneral.anti_nick_flood = yylval.number;
2664   };
2665  
2666   general_max_nick_time: MAX_NICK_TIME '=' timespec ';'
2667   {
2668 <  ConfigFileEntry.max_nick_time = $3;
2668 >  ConfigGeneral.max_nick_time = $3;
2669   };
2670  
2671   general_max_nick_changes: MAX_NICK_CHANGES '=' NUMBER ';'
2672   {
2673 <  ConfigFileEntry.max_nick_changes = $3;
2673 >  ConfigGeneral.max_nick_changes = $3;
2674   };
2675  
2676   general_max_accept: MAX_ACCEPT '=' NUMBER ';'
2677   {
2678 <  ConfigFileEntry.max_accept = $3;
2678 >  ConfigGeneral.max_accept = $3;
2679   };
2680  
2681   general_anti_spam_exit_message_time: ANTI_SPAM_EXIT_MESSAGE_TIME '=' timespec ';'
2682   {
2683 <  ConfigFileEntry.anti_spam_exit_message_time = $3;
2683 >  ConfigGeneral.anti_spam_exit_message_time = $3;
2684   };
2685  
2686   general_ts_warn_delta: TS_WARN_DELTA '=' timespec ';'
2687   {
2688 <  ConfigFileEntry.ts_warn_delta = $3;
2688 >  ConfigGeneral.ts_warn_delta = $3;
2689   };
2690  
2691   general_ts_max_delta: TS_MAX_DELTA '=' timespec ';'
2692   {
2693    if (conf_parser_ctx.pass == 2)
2694 <    ConfigFileEntry.ts_max_delta = $3;
2694 >    ConfigGeneral.ts_max_delta = $3;
2695   };
2696  
2697   general_havent_read_conf: HAVENT_READ_CONF '=' NUMBER ';'
# Line 2548 | Line 2707 | general_havent_read_conf: HAVENT_READ_CO
2707  
2708   general_invisible_on_connect: INVISIBLE_ON_CONNECT '=' TBOOL ';'
2709   {
2710 <  ConfigFileEntry.invisible_on_connect = yylval.number;
2710 >  ConfigGeneral.invisible_on_connect = yylval.number;
2711   };
2712  
2713 < general_warn_no_nline: WARN_NO_NLINE '=' TBOOL ';'
2713 > general_warn_no_connect_block: WARN_NO_CONNECT_BLOCK '=' TBOOL ';'
2714   {
2715 <  ConfigFileEntry.warn_no_nline = yylval.number;
2715 >  ConfigGeneral.warn_no_connect_block = yylval.number;
2716   };
2717  
2718   general_stats_e_disabled: STATS_E_DISABLED '=' TBOOL ';'
2719   {
2720 <  ConfigFileEntry.stats_e_disabled = yylval.number;
2720 >  ConfigGeneral.stats_e_disabled = yylval.number;
2721   };
2722  
2723   general_stats_o_oper_only: STATS_O_OPER_ONLY '=' TBOOL ';'
2724   {
2725 <  ConfigFileEntry.stats_o_oper_only = yylval.number;
2725 >  ConfigGeneral.stats_o_oper_only = yylval.number;
2726   };
2727  
2728   general_stats_P_oper_only: STATS_P_OPER_ONLY '=' TBOOL ';'
2729   {
2730 <  ConfigFileEntry.stats_P_oper_only = yylval.number;
2730 >  ConfigGeneral.stats_P_oper_only = yylval.number;
2731 > };
2732 >
2733 > general_stats_u_oper_only: STATS_U_OPER_ONLY '=' TBOOL ';'
2734 > {
2735 >  ConfigGeneral.stats_u_oper_only = yylval.number;
2736   };
2737  
2738   general_stats_k_oper_only: STATS_K_OPER_ONLY '=' TBOOL ';'
2739   {
2740 <  ConfigFileEntry.stats_k_oper_only = 2 * yylval.number;
2740 >  ConfigGeneral.stats_k_oper_only = 2 * yylval.number;
2741   } | STATS_K_OPER_ONLY '=' TMASKED ';'
2742   {
2743 <  ConfigFileEntry.stats_k_oper_only = 1;
2743 >  ConfigGeneral.stats_k_oper_only = 1;
2744   };
2745  
2746   general_stats_i_oper_only: STATS_I_OPER_ONLY '=' TBOOL ';'
2747   {
2748 <  ConfigFileEntry.stats_i_oper_only = 2 * yylval.number;
2748 >  ConfigGeneral.stats_i_oper_only = 2 * yylval.number;
2749   } | STATS_I_OPER_ONLY '=' TMASKED ';'
2750   {
2751 <  ConfigFileEntry.stats_i_oper_only = 1;
2751 >  ConfigGeneral.stats_i_oper_only = 1;
2752   };
2753  
2754   general_pace_wait: PACE_WAIT '=' timespec ';'
2755   {
2756 <  ConfigFileEntry.pace_wait = $3;
2756 >  ConfigGeneral.pace_wait = $3;
2757   };
2758  
2759   general_caller_id_wait: CALLER_ID_WAIT '=' timespec ';'
2760   {
2761 <  ConfigFileEntry.caller_id_wait = $3;
2761 >  ConfigGeneral.caller_id_wait = $3;
2762   };
2763  
2764   general_opers_bypass_callerid: OPERS_BYPASS_CALLERID '=' TBOOL ';'
2765   {
2766 <  ConfigFileEntry.opers_bypass_callerid = yylval.number;
2766 >  ConfigGeneral.opers_bypass_callerid = yylval.number;
2767   };
2768  
2769   general_pace_wait_simple: PACE_WAIT_SIMPLE '=' timespec ';'
2770   {
2771 <  ConfigFileEntry.pace_wait_simple = $3;
2771 >  ConfigGeneral.pace_wait_simple = $3;
2772   };
2773  
2774   general_short_motd: SHORT_MOTD '=' TBOOL ';'
2775   {
2776 <  ConfigFileEntry.short_motd = yylval.number;
2776 >  ConfigGeneral.short_motd = yylval.number;
2777   };
2778 <  
2778 >
2779   general_no_oper_flood: NO_OPER_FLOOD '=' TBOOL ';'
2780   {
2781 <  ConfigFileEntry.no_oper_flood = yylval.number;
2781 >  ConfigGeneral.no_oper_flood = yylval.number;
2782   };
2783  
2784   general_true_no_oper_flood: TRUE_NO_OPER_FLOOD '=' TBOOL ';'
2785   {
2786 <  ConfigFileEntry.true_no_oper_flood = yylval.number;
2786 >  ConfigGeneral.true_no_oper_flood = yylval.number;
2787   };
2788  
2789   general_oper_pass_resv: OPER_PASS_RESV '=' TBOOL ';'
2790   {
2791 <  ConfigFileEntry.oper_pass_resv = yylval.number;
2791 >  ConfigGeneral.oper_pass_resv = yylval.number;
2792   };
2793  
2794   general_dots_in_ident: DOTS_IN_IDENT '=' NUMBER ';'
2795   {
2796 <  ConfigFileEntry.dots_in_ident = $3;
2796 >  ConfigGeneral.dots_in_ident = $3;
2797   };
2798  
2799   general_max_targets: MAX_TARGETS '=' NUMBER ';'
2800   {
2801 <  ConfigFileEntry.max_targets = $3;
2638 < };
2639 <
2640 < general_use_egd: USE_EGD '=' TBOOL ';'
2641 < {
2642 <  ConfigFileEntry.use_egd = yylval.number;
2801 >  ConfigGeneral.max_targets = $3;
2802   };
2803  
2804 < general_egdpool_path: EGDPOOL_PATH '=' QSTRING ';'
2646 < {
2647 <  if (conf_parser_ctx.pass == 2)
2648 <  {
2649 <    MyFree(ConfigFileEntry.egdpool_path);
2650 <    ConfigFileEntry.egdpool_path = xstrdup(yylval.string);
2651 <  }
2652 < };
2653 <
2654 < general_services_name: T_SERVICES_NAME '=' QSTRING ';'
2804 > general_ping_cookie: PING_COOKIE '=' TBOOL ';'
2805   {
2806 <  if (conf_parser_ctx.pass == 2 && valid_servname(yylval.string))
2657 <  {
2658 <    MyFree(ConfigFileEntry.service_name);
2659 <    ConfigFileEntry.service_name = xstrdup(yylval.string);
2660 <  }
2806 >  ConfigGeneral.ping_cookie = yylval.number;
2807   };
2808  
2809 < general_ping_cookie: PING_COOKIE '=' TBOOL ';'
2809 > general_disable_auth: DISABLE_AUTH '=' TBOOL ';'
2810   {
2811 <  ConfigFileEntry.ping_cookie = yylval.number;
2811 >  ConfigGeneral.disable_auth = yylval.number;
2812   };
2813  
2814 < general_disable_auth: DISABLE_AUTH '=' TBOOL ';'
2814 > general_throttle_count: THROTTLE_COUNT '=' NUMBER ';'
2815   {
2816 <  ConfigFileEntry.disable_auth = yylval.number;
2816 >  ConfigGeneral.throttle_count = $3;
2817   };
2818  
2819   general_throttle_time: THROTTLE_TIME '=' timespec ';'
2820   {
2821 <  ConfigFileEntry.throttle_time = yylval.number;
2821 >  ConfigGeneral.throttle_time = $3;
2822   };
2823  
2824   general_oper_umodes: OPER_UMODES
2825   {
2826 <  ConfigFileEntry.oper_umodes = 0;
2826 >  ConfigGeneral.oper_umodes = 0;
2827   } '='  umode_oitems ';' ;
2828  
2829   umode_oitems:    umode_oitems ',' umode_oitem | umode_oitem;
2830   umode_oitem:     T_BOTS
2831   {
2832 <  ConfigFileEntry.oper_umodes |= UMODE_BOTS;
2832 >  ConfigGeneral.oper_umodes |= UMODE_BOTS;
2833   } | T_CCONN
2834   {
2835 <  ConfigFileEntry.oper_umodes |= UMODE_CCONN;
2835 >  ConfigGeneral.oper_umodes |= UMODE_CCONN;
2836   } | T_DEAF
2837   {
2838 <  ConfigFileEntry.oper_umodes |= UMODE_DEAF;
2838 >  ConfigGeneral.oper_umodes |= UMODE_DEAF;
2839   } | T_DEBUG
2840   {
2841 <  ConfigFileEntry.oper_umodes |= UMODE_DEBUG;
2841 >  ConfigGeneral.oper_umodes |= UMODE_DEBUG;
2842   } | T_FULL
2843   {
2844 <  ConfigFileEntry.oper_umodes |= UMODE_FULL;
2844 >  ConfigGeneral.oper_umodes |= UMODE_FULL;
2845   } | HIDDEN
2846   {
2847 <  ConfigFileEntry.oper_umodes |= UMODE_HIDDEN;
2847 >  ConfigGeneral.oper_umodes |= UMODE_HIDDEN;
2848 > } | HIDE_CHANS
2849 > {
2850 >  ConfigGeneral.oper_umodes |= UMODE_HIDECHANS;
2851 > } | HIDE_IDLE
2852 > {
2853 >  ConfigGeneral.oper_umodes |= UMODE_HIDEIDLE;
2854   } | T_SKILL
2855   {
2856 <  ConfigFileEntry.oper_umodes |= UMODE_SKILL;
2856 >  ConfigGeneral.oper_umodes |= UMODE_SKILL;
2857   } | T_NCHANGE
2858   {
2859 <  ConfigFileEntry.oper_umodes |= UMODE_NCHANGE;
2859 >  ConfigGeneral.oper_umodes |= UMODE_NCHANGE;
2860   } | T_REJ
2861   {
2862 <  ConfigFileEntry.oper_umodes |= UMODE_REJ;
2862 >  ConfigGeneral.oper_umodes |= UMODE_REJ;
2863   } | T_UNAUTH
2864   {
2865 <  ConfigFileEntry.oper_umodes |= UMODE_UNAUTH;
2865 >  ConfigGeneral.oper_umodes |= UMODE_UNAUTH;
2866   } | T_SPY
2867   {
2868 <  ConfigFileEntry.oper_umodes |= UMODE_SPY;
2868 >  ConfigGeneral.oper_umodes |= UMODE_SPY;
2869   } | T_EXTERNAL
2870   {
2871 <  ConfigFileEntry.oper_umodes |= UMODE_EXTERNAL;
2720 < } | T_OPERWALL
2721 < {
2722 <  ConfigFileEntry.oper_umodes |= UMODE_OPERWALL;
2871 >  ConfigGeneral.oper_umodes |= UMODE_EXTERNAL;
2872   } | T_SERVNOTICE
2873   {
2874 <  ConfigFileEntry.oper_umodes |= UMODE_SERVNOTICE;
2874 >  ConfigGeneral.oper_umodes |= UMODE_SERVNOTICE;
2875   } | T_INVISIBLE
2876   {
2877 <  ConfigFileEntry.oper_umodes |= UMODE_INVISIBLE;
2877 >  ConfigGeneral.oper_umodes |= UMODE_INVISIBLE;
2878   } | T_WALLOP
2879   {
2880 <  ConfigFileEntry.oper_umodes |= UMODE_WALLOP;
2880 >  ConfigGeneral.oper_umodes |= UMODE_WALLOP;
2881   } | T_SOFTCALLERID
2882   {
2883 <  ConfigFileEntry.oper_umodes |= UMODE_SOFTCALLERID;
2883 >  ConfigGeneral.oper_umodes |= UMODE_SOFTCALLERID;
2884   } | T_CALLERID
2885   {
2886 <  ConfigFileEntry.oper_umodes |= UMODE_CALLERID;
2886 >  ConfigGeneral.oper_umodes |= UMODE_CALLERID;
2887   } | T_LOCOPS
2888   {
2889 <  ConfigFileEntry.oper_umodes |= UMODE_LOCOPS;
2889 >  ConfigGeneral.oper_umodes |= UMODE_LOCOPS;
2890   } | T_NONONREG
2891   {
2892 <  ConfigFileEntry.oper_umodes |= UMODE_REGONLY;
2892 >  ConfigGeneral.oper_umodes |= UMODE_REGONLY;
2893   } | T_FARCONNECT
2894   {
2895 <  ConfigFileEntry.oper_umodes |= UMODE_FARCONNECT;
2895 >  ConfigGeneral.oper_umodes |= UMODE_FARCONNECT;
2896   };
2897  
2898 < general_oper_only_umodes: OPER_ONLY_UMODES
2898 > general_oper_only_umodes: OPER_ONLY_UMODES
2899   {
2900 <  ConfigFileEntry.oper_only_umodes = 0;
2900 >  ConfigGeneral.oper_only_umodes = 0;
2901   } '='  umode_items ';' ;
2902  
2903 < umode_items:    umode_items ',' umode_item | umode_item;
2904 < umode_item:     T_BOTS
2903 > umode_items:  umode_items ',' umode_item | umode_item;
2904 > umode_item:   T_BOTS
2905   {
2906 <  ConfigFileEntry.oper_only_umodes |= UMODE_BOTS;
2906 >  ConfigGeneral.oper_only_umodes |= UMODE_BOTS;
2907   } | T_CCONN
2908   {
2909 <  ConfigFileEntry.oper_only_umodes |= UMODE_CCONN;
2909 >  ConfigGeneral.oper_only_umodes |= UMODE_CCONN;
2910   } | T_DEAF
2911   {
2912 <  ConfigFileEntry.oper_only_umodes |= UMODE_DEAF;
2912 >  ConfigGeneral.oper_only_umodes |= UMODE_DEAF;
2913   } | T_DEBUG
2914   {
2915 <  ConfigFileEntry.oper_only_umodes |= UMODE_DEBUG;
2915 >  ConfigGeneral.oper_only_umodes |= UMODE_DEBUG;
2916   } | T_FULL
2917 < {
2918 <  ConfigFileEntry.oper_only_umodes |= UMODE_FULL;
2917 > {
2918 >  ConfigGeneral.oper_only_umodes |= UMODE_FULL;
2919   } | T_SKILL
2920   {
2921 <  ConfigFileEntry.oper_only_umodes |= UMODE_SKILL;
2921 >  ConfigGeneral.oper_only_umodes |= UMODE_SKILL;
2922   } | HIDDEN
2923   {
2924 <  ConfigFileEntry.oper_only_umodes |= UMODE_HIDDEN;
2924 >  ConfigGeneral.oper_only_umodes |= UMODE_HIDDEN;
2925   } | T_NCHANGE
2926   {
2927 <  ConfigFileEntry.oper_only_umodes |= UMODE_NCHANGE;
2927 >  ConfigGeneral.oper_only_umodes |= UMODE_NCHANGE;
2928   } | T_REJ
2929   {
2930 <  ConfigFileEntry.oper_only_umodes |= UMODE_REJ;
2930 >  ConfigGeneral.oper_only_umodes |= UMODE_REJ;
2931   } | T_UNAUTH
2932   {
2933 <  ConfigFileEntry.oper_only_umodes |= UMODE_UNAUTH;
2933 >  ConfigGeneral.oper_only_umodes |= UMODE_UNAUTH;
2934   } | T_SPY
2935   {
2936 <  ConfigFileEntry.oper_only_umodes |= UMODE_SPY;
2936 >  ConfigGeneral.oper_only_umodes |= UMODE_SPY;
2937   } | T_EXTERNAL
2938   {
2939 <  ConfigFileEntry.oper_only_umodes |= UMODE_EXTERNAL;
2791 < } | T_OPERWALL
2792 < {
2793 <  ConfigFileEntry.oper_only_umodes |= UMODE_OPERWALL;
2939 >  ConfigGeneral.oper_only_umodes |= UMODE_EXTERNAL;
2940   } | T_SERVNOTICE
2941   {
2942 <  ConfigFileEntry.oper_only_umodes |= UMODE_SERVNOTICE;
2942 >  ConfigGeneral.oper_only_umodes |= UMODE_SERVNOTICE;
2943   } | T_INVISIBLE
2944   {
2945 <  ConfigFileEntry.oper_only_umodes |= UMODE_INVISIBLE;
2945 >  ConfigGeneral.oper_only_umodes |= UMODE_INVISIBLE;
2946   } | T_WALLOP
2947   {
2948 <  ConfigFileEntry.oper_only_umodes |= UMODE_WALLOP;
2948 >  ConfigGeneral.oper_only_umodes |= UMODE_WALLOP;
2949   } | T_SOFTCALLERID
2950   {
2951 <  ConfigFileEntry.oper_only_umodes |= UMODE_SOFTCALLERID;
2951 >  ConfigGeneral.oper_only_umodes |= UMODE_SOFTCALLERID;
2952   } | T_CALLERID
2953   {
2954 <  ConfigFileEntry.oper_only_umodes |= UMODE_CALLERID;
2954 >  ConfigGeneral.oper_only_umodes |= UMODE_CALLERID;
2955   } | T_LOCOPS
2956   {
2957 <  ConfigFileEntry.oper_only_umodes |= UMODE_LOCOPS;
2957 >  ConfigGeneral.oper_only_umodes |= UMODE_LOCOPS;
2958   } | T_NONONREG
2959   {
2960 <  ConfigFileEntry.oper_only_umodes |= UMODE_REGONLY;
2960 >  ConfigGeneral.oper_only_umodes |= UMODE_REGONLY;
2961   } | T_FARCONNECT
2962   {
2963 <  ConfigFileEntry.oper_only_umodes |= UMODE_FARCONNECT;
2963 >  ConfigGeneral.oper_only_umodes |= UMODE_FARCONNECT;
2964   };
2965  
2966   general_min_nonwildcard: MIN_NONWILDCARD '=' NUMBER ';'
2967   {
2968 <  ConfigFileEntry.min_nonwildcard = $3;
2968 >  ConfigGeneral.min_nonwildcard = $3;
2969   };
2970  
2971   general_min_nonwildcard_simple: MIN_NONWILDCARD_SIMPLE '=' NUMBER ';'
2972   {
2973 <  ConfigFileEntry.min_nonwildcard_simple = $3;
2973 >  ConfigGeneral.min_nonwildcard_simple = $3;
2974   };
2975  
2976   general_default_floodcount: DEFAULT_FLOODCOUNT '=' NUMBER ';'
2977   {
2978 <  ConfigFileEntry.default_floodcount = $3;
2978 >  ConfigGeneral.default_floodcount = $3;
2979   };
2980  
2981  
# Line 2841 | Line 2987 | channel_entry: CHANNEL
2987  
2988   channel_items:      channel_items channel_item | channel_item;
2989   channel_item:       channel_max_bans |
2990 <                    channel_knock_delay | channel_knock_delay_channel |
2991 <                    channel_max_chans_per_user | channel_max_chans_per_oper |
2990 >                    channel_invite_client_count |
2991 >                    channel_invite_client_time |
2992 >                    channel_knock_client_count |
2993 >                    channel_knock_client_time |
2994 >                    channel_knock_delay_channel |
2995 >                    channel_max_channels |
2996                      channel_default_split_user_count |
2997                      channel_default_split_server_count |
2998                      channel_no_create_on_split |
2999                      channel_no_join_on_split |
3000 <                    channel_jflood_count | channel_jflood_time |
3001 <                    channel_disable_fake_channels | error;
3000 >                    channel_jflood_count |
3001 >                    channel_jflood_time |
3002 >                    channel_disable_fake_channels |
3003 >                    error;
3004  
3005   channel_disable_fake_channels: DISABLE_FAKE_CHANNELS '=' TBOOL ';'
3006   {
3007    ConfigChannel.disable_fake_channels = yylval.number;
3008   };
3009  
3010 < channel_knock_delay: KNOCK_DELAY '=' timespec ';'
3010 > channel_invite_client_count: INVITE_CLIENT_COUNT '=' NUMBER ';'
3011   {
3012 <  ConfigChannel.knock_delay = $3;
3012 >  ConfigChannel.invite_client_count = $3;
3013   };
3014  
3015 < channel_knock_delay_channel: KNOCK_DELAY_CHANNEL '=' timespec ';'
3015 > channel_invite_client_time: INVITE_CLIENT_TIME '=' timespec ';'
3016   {
3017 <  ConfigChannel.knock_delay_channel = $3;
3017 >  ConfigChannel.invite_client_time = $3;
3018 > };
3019 >
3020 > channel_knock_client_count: KNOCK_CLIENT_COUNT '=' NUMBER ';'
3021 > {
3022 >  ConfigChannel.knock_client_count = $3;
3023 > };
3024 >
3025 > channel_knock_client_time: KNOCK_CLIENT_TIME '=' timespec ';'
3026 > {
3027 >  ConfigChannel.knock_client_time = $3;
3028   };
3029  
3030 < channel_max_chans_per_user: MAX_CHANS_PER_USER '=' NUMBER ';'
3030 > channel_knock_delay_channel: KNOCK_DELAY_CHANNEL '=' timespec ';'
3031   {
3032 <  ConfigChannel.max_chans_per_user = $3;
3032 >  ConfigChannel.knock_delay_channel = $3;
3033   };
3034  
3035 < channel_max_chans_per_oper: MAX_CHANS_PER_OPER '=' NUMBER ';'
3035 > channel_max_channels: MAX_CHANNELS '=' NUMBER ';'
3036   {
3037 <  ConfigChannel.max_chans_per_oper = $3;
3037 >  ConfigChannel.max_channels = $3;
3038   };
3039  
3040   channel_max_bans: MAX_BANS '=' NUMBER ';'
# Line 2907 | Line 3069 | channel_jflood_count: JOIN_FLOOD_COUNT '
3069  
3070   channel_jflood_time: JOIN_FLOOD_TIME '=' timespec ';'
3071   {
3072 <  GlobalSetOptions.joinfloodtime = yylval.number;
3072 >  GlobalSetOptions.joinfloodtime = $3;
3073   };
3074  
3075   /***************************************************************************
# Line 2917 | Line 3079 | serverhide_entry: SERVERHIDE
3079    '{' serverhide_items '}' ';';
3080  
3081   serverhide_items:   serverhide_items serverhide_item | serverhide_item;
3082 < serverhide_item:    serverhide_flatten_links | serverhide_disable_remote_commands |
3082 > serverhide_item:    serverhide_flatten_links |
3083 >                    serverhide_disable_remote_commands |
3084                      serverhide_hide_servers |
3085 <                    serverhide_hide_services |
3086 <                    serverhide_links_delay |
3087 <                    serverhide_hidden | serverhide_hidden_name |
3088 <                    serverhide_hide_server_ips |
3085 >                    serverhide_hide_services |
3086 >                    serverhide_links_delay |
3087 >                    serverhide_hidden |
3088 >                    serverhide_hidden_name |
3089 >                    serverhide_hide_server_ips |
3090                      error;
3091  
3092   serverhide_flatten_links: FLATTEN_LINKS '=' TBOOL ';'
# Line 2964 | Line 3128 | serverhide_links_delay: LINKS_DELAY '='
3128    {
3129      if (($3 > 0) && ConfigServerHide.links_disabled == 1)
3130      {
3131 <      eventAddIsh("write_links_file", write_links_file, NULL, $3);
3131 >      event_write_links_file.when = $3;
3132 >      event_addish(&event_write_links_file, NULL);
3133        ConfigServerHide.links_disabled = 0;
3134      }
3135  

Diff Legend

Removed lines
+ Added lines
< Changed lines (old)
> Changed lines (new)