]> arthur.barton.de Git - ngircd-alex.git/blobdiff - src/ngircd/conf.c
Make configure[.ng] compatible with autoconf 1.10 again
[ngircd-alex.git] / src / ngircd / conf.c
index 4ac37ad4033331e11692ee0aee6b87e96b6846ee..e46dcfee43669644091285586fd956b9c9a6c94c 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * ngIRCd -- The Next Generation IRC Daemon
- * Copyright (c)2001-2012 Alexander Barton (alex@barton.de) and Contributors.
+ * Copyright (c)2001-2013 Alexander Barton (alex@barton.de) and Contributors.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -54,6 +54,7 @@ static CONF_SERVER New_Server;
 static int New_Server_Idx;
 
 static char Conf_MotdFile[FNAME_LEN];
+static char Conf_HelpFile[FNAME_LEN];
 
 static void Set_Defaults PARAMS(( bool InitServers ));
 static bool Read_Config PARAMS(( bool TestOnly, bool IsStarting ));
@@ -108,6 +109,28 @@ ConfSSL_Init(void)
        array_free(&Conf_SSLOptions.ListenPorts);
 }
 
+/**
+ * Check if the current configuration uses/requires SSL.
+ *
+ * @returns true if SSL is used and should be initialized.
+ */
+GLOBAL bool
+Conf_SSLInUse(void)
+{
+       int i;
+
+       /* SSL listen ports configured? */
+       if (array_bytes(&Conf_SSLOptions.ListenPorts))
+               return true;
+
+       for (i = 0; i < MAX_SERVERS; i++) {
+               if (Conf_Server[i].port > 0
+                   && Conf_Server[i].SSLConnect)
+                       return true;
+       }
+       return false;
+}
+
 /**
  * Make sure that a configured file is readable.
  *
@@ -316,6 +339,7 @@ Conf_Test( void )
        printf("  AdminInfo1 = %s\n", Conf_ServerAdmin1);
        printf("  AdminInfo2 = %s\n", Conf_ServerAdmin2);
        printf("  AdminEMail = %s\n", Conf_ServerAdminMail);
+       printf("  HelpFile = %s\n", Conf_HelpFile);
        printf("  Info = %s\n", Conf_ServerInfo);
        printf("  Listen = %s\n", Conf_ListenAddress);
        if (Using_MotdFile) {
@@ -346,10 +370,12 @@ Conf_Test( void )
 
        puts("[LIMITS]");
        printf("  ConnectRetry = %d\n", Conf_ConnectRetry);
+       printf("  IdleTimeout = %d\n", Conf_IdleTimeout);
        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("");
@@ -480,8 +506,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);
+                       }
                }
        }
 }
@@ -489,7 +519,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 );
@@ -497,13 +527,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;
 }
 
 /**
@@ -637,11 +669,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)
@@ -654,11 +686,11 @@ Conf_NickIsService(int ConfServer, const char *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)
@@ -694,18 +726,23 @@ Set_Defaults(bool InitServers)
        Conf_ListenAddress = NULL;
        array_free(&Conf_ListenPorts);
        array_free(&Conf_Motd);
+       array_free(&Conf_Helptext);
        strlcpy(Conf_MotdFile, SYSCONFDIR, sizeof(Conf_MotdFile));
        strlcat(Conf_MotdFile, MOTD_FILE, sizeof(Conf_MotdFile));
+       strlcpy(Conf_HelpFile, DOCDIR, sizeof(Conf_HelpFile));
+       strlcat(Conf_HelpFile, HELP_FILE, sizeof(Conf_HelpFile));
        strcpy(Conf_ServerPwd, "");
        strlcpy(Conf_PidFile, PID_FILE, sizeof(Conf_PidFile));
        Conf_UID = Conf_GID = 0;
 
        /* Limits */
        Conf_ConnectRetry = 60;
+       Conf_IdleTimeout = 0;
        Conf_MaxConnections = 0;
        Conf_MaxConnectionsIP = 5;
        Conf_MaxJoins = 10;
        Conf_MaxNickLength = CLIENT_NICK_LEN_DEFAULT;
+       Conf_MaxListSize = 100;
        Conf_PingTimeout = 120;
        Conf_PongTimeout = 20;
 
@@ -717,7 +754,8 @@ Set_Defaults(bool InitServers)
        strlcpy(Conf_Chroot, CHROOT_DIR, sizeof(Conf_Chroot));
        strcpy(Conf_CloakHost, "");
        strcpy(Conf_CloakHostModeX, "");
-       strcpy(Conf_CloakHostSalt, ngt_RandomStr(random, RANDOM_SALT_LEN));
+       strlcpy(Conf_CloakHostSalt, ngt_RandomStr(random, RANDOM_SALT_LEN),
+               sizeof(Conf_CloakHostSalt));
        Conf_CloakUserToNick = false;
        Conf_ConnectIPv4 = true;
 #ifdef WANT_IPV6
@@ -775,39 +813,44 @@ no_listenports(void)
 }
 
 /**
- * Read MOTD ("message of the day") file.
+ * Read contents of a text file into an array.
+ *
+ * This function is used to read the MOTD and help text file, for exampe.
  *
  * @param filename     Name of the file to read.
+ * @return             true, when the file has been read in.
  */
-static void
-Read_Motd(const char *filename)
+static bool
+Read_TextFile(const char *Filename, const char *Name, array *Destination)
 {
        char line[127];
        FILE *fp;
+       int line_no = 1;
 
-       if (*filename == '\0')
-               return;
+       if (*Filename == '\0')
+               return false;
 
-       fp = fopen(filename, "r");
+       fp = fopen(Filename, "r");
        if (!fp) {
-               Config_Error(LOG_WARNING, "Can't read MOTD file \"%s\": %s",
-                                       filename, strerror(errno));
-               return;
+               Config_Error(LOG_ERR, "Can't read %s file \"%s\": %s",
+                            Name, Filename, strerror(errno));
+               return false;
        }
 
-       array_free(&Conf_Motd);
-       Using_MotdFile = true;
-
+       array_free(Destination);
        while (fgets(line, (int)sizeof line, fp)) {
-               ngt_TrimLastChr( line, '\n');
+               ngt_TrimLastChr(line, '\n');
 
                /* add text including \0 */
-               if (!array_catb(&Conf_Motd, line, strlen(line) + 1)) {
-                       Log(LOG_WARNING, "Cannot add MOTD text: %s", strerror(errno));
+               if (!array_catb(Destination, line, strlen(line) + 1)) {
+                       Log(LOG_ERR, "Cannot read/add \"%s\", line %d: %s",
+                           Filename, line_no, strerror(errno));
                        break;
                }
+               line_no++;
        }
        fclose(fp);
+       return true;
 }
 
 /**
@@ -1028,8 +1071,16 @@ Read_Config(bool TestOnly, bool IsStarting)
        }
 
        /* No MOTD phrase configured? (re)try motd file. */
-       if (array_bytes(&Conf_Motd) == 0)
-               Read_Motd(Conf_MotdFile);
+       if (array_bytes(&Conf_Motd) == 0) {
+               if (Read_TextFile(Conf_MotdFile, "MOTD", &Conf_Motd))
+                       Using_MotdFile = true;
+       }
+
+       /* Try to read ngIRCd help text file. */
+       (void)Read_TextFile(Conf_HelpFile, "help text", &Conf_Helptext);
+       if (!array_bytes(&Conf_Helptext))
+               Config_Error(LOG_WARNING,
+                   "No help text available, HELP command will be of limited use.");
 
 #ifdef SSL_SUPPORT
        /* Make sure that all SSL-related files are readable */
@@ -1066,7 +1117,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)
@@ -1192,6 +1243,7 @@ CheckLegacyGlobalOption(int Line, char *Var, char *Arg)
                return "[Options]";
        }
        if (strcasecmp(Var, "ConnectRetry") == 0
+           || strcasecmp(Var, "IdleTimeout") == 0
            || strcasecmp(Var, "MaxConnections") == 0
            || strcasecmp(Var, "MaxConnectionsIP") == 0
            || strcasecmp(Var, "MaxJoins") == 0
@@ -1296,6 +1348,12 @@ Handle_GLOBAL( int Line, char *Var, char *Arg )
                        Config_Error_TooLong(Line, Var);
                return;
        }
+       if (strcasecmp(Var, "HelpFile") == 0) {
+               len = strlcpy(Conf_HelpFile, Arg, sizeof(Conf_HelpFile));
+               if (len >= sizeof(Conf_HelpFile))
+                       Config_Error_TooLong(Line, Var);
+               return;
+       }
        if (strcasecmp(Var, "Listen") == 0) {
                if (Conf_ListenAddress) {
                        Config_Error(LOG_ERR,
@@ -1435,6 +1493,12 @@ Handle_LIMITS(int Line, char *Var, char *Arg)
                }
                return;
        }
+       if (strcasecmp(Var, "IdleTimeout") == 0) {
+               Conf_IdleTimeout = atoi(Arg);
+               if (!Conf_IdleTimeout && strcmp(Arg, "0"))
+                       Config_Error_NaN(Line, Var);
+               return;
+       }
        if (strcasecmp(Var, "MaxConnections") == 0) {
                Conf_MaxConnections = atoi(Arg);
                if (!Conf_MaxConnections && strcmp(Arg, "0"))
@@ -1457,6 +1521,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) {