]> arthur.barton.de Git - ngircd-alex.git/blobdiff - src/ngircd/conf.c
Spelling fix: "nick name" -> "nickname"
[ngircd-alex.git] / src / ngircd / conf.c
index 41b5469a8140f4c5a07d1874dd6d048fcbf6ae3b..da7ff844b50c14d1a17a21c9687aae9534d4a185 100644 (file)
@@ -18,6 +18,7 @@
 
 #include "imp.h"
 #include <assert.h>
+#include <ctype.h>
 #include <errno.h>
 #ifdef PROTOTYPES
 #      include <stdarg.h>
@@ -34,9 +35,6 @@
 #include <sys/types.h>
 #include <unistd.h>
 
-#ifdef HAVE_CTYPE_H
-# include <ctype.h>
-#endif
 
 #include "array.h"
 #include "ngircd.h"
@@ -106,6 +104,8 @@ ConfSSL_Init(void)
        free(Conf_SSLOptions.DHFile);
        Conf_SSLOptions.DHFile = NULL;
        array_free_wipe(&Conf_SSLOptions.KeyFilePassword);
+
+       array_free(&Conf_SSLOptions.ListenPorts);
 }
 
 /**
@@ -346,10 +346,11 @@ Conf_Test( void )
 
        puts("[LIMITS]");
        printf("  ConnectRetry = %d\n", Conf_ConnectRetry);
-       printf("  MaxConnections = %ld\n", Conf_MaxConnections);
+       printf("  MaxConnections = %d\n", Conf_MaxConnections);
        printf("  MaxConnectionsIP = %d\n", Conf_MaxConnectionsIP);
        printf("  MaxJoins = %d\n", Conf_MaxJoins > 0 ? Conf_MaxJoins : -1);
        printf("  MaxNickLength = %u\n", Conf_MaxNickLength - 1);
+       printf("  MaxListSize = %d\n", Conf_MaxListSize);
        printf("  PingTimeout = %d\n", Conf_PingTimeout);
        printf("  PongTimeout = %d\n", Conf_PongTimeout);
        puts("");
@@ -372,6 +373,7 @@ Conf_Test( void )
        printf("  MorePrivacy = %s\n", yesno_to_str(Conf_MorePrivacy));
        printf("  NoticeAuth = %s\n", yesno_to_str(Conf_NoticeAuth));
        printf("  OperCanUseMode = %s\n", yesno_to_str(Conf_OperCanMode));
+       printf("  OperChanPAutoOp = %s\n", yesno_to_str(Conf_OperChanPAutoOp));
        printf("  OperServerMode = %s\n", yesno_to_str(Conf_OperServerMode));
 #ifdef PAM
        printf("  PAM = %s\n", yesno_to_str(Conf_PAM));
@@ -479,8 +481,12 @@ Conf_UnsetServer( CONN_ID Idx )
                                 * require the next attempt to be delayed. */
                                Conf_Server[i].lasttry =
                                        t - Conf_ConnectRetry + RECONNECT_DELAY;
-                       } else
-                               Conf_Server[i].lasttry = t;
+                       } else {
+                               /* "Short" connection, enforce "ConnectRetry"
+                                * but randomize it a little bit: 15 seconds. */
+                               Conf_Server[i].lasttry =
+                                       t + rand() / (RAND_MAX / 15);
+                       }
                }
        }
 }
@@ -488,7 +494,7 @@ Conf_UnsetServer( CONN_ID Idx )
 /**
  * Set connection information for specified configured server.
  */
-GLOBAL void
+GLOBAL bool
 Conf_SetServer( int ConfServer, CONN_ID Idx )
 {
        assert( ConfServer > NONE );
@@ -496,13 +502,15 @@ Conf_SetServer( int ConfServer, CONN_ID Idx )
 
        if (Conf_Server[ConfServer].conn_id > NONE &&
            Conf_Server[ConfServer].conn_id != Idx) {
-               Log(LOG_ALERT,
-                       "Trying to update connection index for already registered server \"%s\": %d/%d - ignored.",
-                       Conf_Server[ConfServer].name,
-                       Conf_Server[ConfServer].conn_id, Idx);
-               return;
+               Log(LOG_ERR,
+                   "Connection %d: Server configuration of \"%s\" already in use by connection %d!",
+                   Idx, Conf_Server[ConfServer].name,
+                   Conf_Server[ConfServer].conn_id);
+               Conn_Close(Idx, NULL, "Server configuration already in use", true);
+               return false;
        }
        Conf_Server[ConfServer].conn_id = Idx;
+       return true;
 }
 
 /**
@@ -636,11 +644,11 @@ Conf_AddServer(const char *Name, UINT16 Port, const char *Host,
 }
 
 /**
- * Check if the given nick name is reserved for services on a particular server.
+ * Check if the given nickname is reserved for services on a particular server.
  *
  * @param ConfServer The server index to check.
- * @param Nick The nick name to check.
- * @returns true if the given nick name belongs to an "IRC service".
+ * @param Nick The nickname to check.
+ * @returns true if the given nickname belongs to an "IRC service".
  */
 GLOBAL bool
 Conf_NickIsService(int ConfServer, const char *Nick)
@@ -648,15 +656,16 @@ Conf_NickIsService(int ConfServer, const char *Nick)
        assert (ConfServer >= 0);
        assert (ConfServer < MAX_SERVERS);
 
-       return MatchCaseInsensitive(Conf_Server[ConfServer].svs_mask, Nick);
+       return MatchCaseInsensitiveList(Conf_Server[ConfServer].svs_mask,
+                                       Nick, ",");
 }
 
 /**
- * Check if the given nick name is blocked for "normal client" use.
+ * Check if the given nickname is blocked for "normal client" use.
  *
  * @param ConfServer The server index or NONE to check all configured servers.
- * @param Nick The nick name to check.
- * @returns true if the given nick name belongs to an "IRC service".
+ * @param Nick The nickname to check.
+ * @returns true if the given nickname belongs to an "IRC service".
  */
 GLOBAL bool
 Conf_NickIsBlocked(const char *Nick)
@@ -690,6 +699,7 @@ Set_Defaults(bool InitServers)
                 PACKAGE_NAME, PACKAGE_VERSION);
        free(Conf_ListenAddress);
        Conf_ListenAddress = NULL;
+       array_free(&Conf_ListenPorts);
        array_free(&Conf_Motd);
        strlcpy(Conf_MotdFile, SYSCONFDIR, sizeof(Conf_MotdFile));
        strlcat(Conf_MotdFile, MOTD_FILE, sizeof(Conf_MotdFile));
@@ -703,6 +713,7 @@ Set_Defaults(bool InitServers)
        Conf_MaxConnectionsIP = 5;
        Conf_MaxJoins = 10;
        Conf_MaxNickLength = CLIENT_NICK_LEN_DEFAULT;
+       Conf_MaxListSize = 100;
        Conf_PingTimeout = 120;
        Conf_PongTimeout = 20;
 
@@ -731,6 +742,7 @@ Set_Defaults(bool InitServers)
        Conf_MorePrivacy = false;
        Conf_NoticeAuth = false;
        Conf_OperCanMode = false;
+       Conf_OperChanPAutoOp = true;
        Conf_OperServerMode = false;
 #ifdef PAM
        Conf_PAM = true;
@@ -1062,7 +1074,7 @@ Check_ArgIsTrue(const char *Arg)
  *
  * @param Line Line number in configuration file.
  * @raram Arg  Input string.
- * @returns    New configured maximum nick name length.
+ * @returns    New configured maximum nickname length.
  */
 static unsigned int
 Handle_MaxNickLength(int Line, const char *Arg)
@@ -1179,6 +1191,7 @@ CheckLegacyGlobalOption(int Line, char *Var, char *Arg)
            || strcasecmp(Var, "ConnectIPv4") == 0
            || strcasecmp(Var, "ConnectIPv6") == 0
            || strcasecmp(Var, "OperCanUseMode") == 0
+           || strcasecmp(Var, "OperChanPAutoOp") == 0
            || strcasecmp(Var, "OperServerMode") == 0
            || strcasecmp(Var, "PredefChannelsOnly") == 0
            || strcasecmp(Var, "SyslogFacility") == 0
@@ -1431,7 +1444,7 @@ Handle_LIMITS(int Line, char *Var, char *Arg)
                return;
        }
        if (strcasecmp(Var, "MaxConnections") == 0) {
-               Conf_MaxConnections = atol(Arg);
+               Conf_MaxConnections = atoi(Arg);
                if (!Conf_MaxConnections && strcmp(Arg, "0"))
                        Config_Error_NaN(Line, Var);
                return;
@@ -1452,6 +1465,12 @@ Handle_LIMITS(int Line, char *Var, char *Arg)
                Conf_MaxNickLength = Handle_MaxNickLength(Line, Arg);
                return;
        }
+       if (strcasecmp(Var, "MaxListSize") == 0) {
+               Conf_MaxListSize = atoi(Arg);
+               if (!Conf_MaxListSize && strcmp(Arg, "0"))
+                       Config_Error_NaN(Line, Var);
+               return;
+       }
        if (strcasecmp(Var, "PingTimeout") == 0) {
                Conf_PingTimeout = atoi(Arg);
                if (Conf_PingTimeout < 5) {
@@ -1554,6 +1573,10 @@ Handle_OPTIONS(int Line, char *Var, char *Arg)
                Conf_OperCanMode = Check_ArgIsTrue(Arg);
                return;
        }
+       if (strcasecmp(Var, "OperChanPAutoOp") == 0) {
+               Conf_OperChanPAutoOp = Check_ArgIsTrue(Arg);
+               return;
+       }
        if (strcasecmp(Var, "OperServerMode") == 0) {
                Conf_OperServerMode = Check_ArgIsTrue(Arg);
                return;
@@ -1910,6 +1933,13 @@ Validate_Config(bool Configtest, bool Rehash)
        bool config_valid = true;
        char *ptr;
 
+       /* Emit a warning when the config file is not a full path name */
+       if (NGIRCd_ConfFile[0] && NGIRCd_ConfFile[0] != '/') {
+               Config_Error(LOG_WARNING,
+                       "Not specifying a full path name to \"%s\" can cause problems when rehashing the server!",
+                       NGIRCd_ConfFile);
+       }
+
        /* Validate configured server name, see RFC 2812 section 2.3.1 */
        ptr = Conf_ServerName;
        do {