]> arthur.barton.de Git - ngircd-alex.git/blobdiff - src/ngircd/conf.c
Don't show the default config file name on config errors
[ngircd-alex.git] / src / ngircd / conf.c
index 860aea8f607f12aeecc849fdd1af68d0bb38bce8..b87979c3a76bcb27d0f6d4376054385edad7d7cf 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * ngIRCd -- The Next Generation IRC Daemon
- * Copyright (c)2001-2019 Alexander Barton (alex@barton.de) and Contributors.
+ * Copyright (c)2001-2024 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
@@ -33,6 +33,7 @@
 #include <grp.h>
 #include <sys/types.h>
 #include <dirent.h>
+#include <netdb.h>
 
 #include "ngircd.h"
 #include "conn.h"
@@ -408,7 +409,7 @@ Conf_Test( void )
 #endif
        printf("  DefaultUserModes = %s\n", Conf_DefaultUserModes);
        printf("  DNS = %s\n", yesno_to_str(Conf_DNS));
-#ifdef IDENT
+#ifdef IDENTAUTH
        printf("  Ident = %s\n", yesno_to_str(Conf_Ident));
 #endif
        printf("  IncludeDir = %s\n", Conf_IncludeDir);
@@ -464,13 +465,13 @@ Conf_Test( void )
                printf( "  Host = %s\n", Conf_Server[i].host );
                printf( "  Port = %u\n", (unsigned int)Conf_Server[i].port );
 #ifdef SSL_SUPPORT
-               printf( "  SSLConnect = %s\n", Conf_Server[i].SSLConnect?"yes":"no");
+               printf( "  SSLConnect = %s\n", yesno_to_str(Conf_Server[i].SSLConnect));
 #endif
                printf( "  MyPassword = %s\n", Conf_Server[i].pwd_in );
                printf( "  PeerPassword = %s\n", Conf_Server[i].pwd_out );
                printf( "  ServiceMask = %s\n", Conf_Server[i].svs_mask);
                printf( "  Group = %d\n", Conf_Server[i].group );
-               printf( "  Passive = %s\n\n", Conf_Server[i].flags & CONF_SFLAG_DISABLED ? "yes" : "no");
+               printf( "  Passive = %s\n\n", yesno_to_str(Conf_Server[i].flags & CONF_SFLAG_DISABLED));
        }
 
        predef_channel_count = array_length(&Conf_Channels, sizeof(*predef_chan));
@@ -488,6 +489,7 @@ Conf_Test( void )
                printf("  Key = %s\n", predef_chan->key);
                printf("  MaxUsers = %lu\n", predef_chan->maxusers);
                printf("  Topic = %s\n", predef_chan->topic);
+               printf("  Autojoin = %s\n", yesno_to_str(predef_chan->autojoin));
                printf("  KeyFile = %s\n\n", predef_chan->keyfile);
        }
 
@@ -901,26 +903,44 @@ Read_Config(bool TestOnly, bool IsStarting)
        struct dirent *entry;
        int i, n;
        FILE *fd;
-       DIR *dh;
+       DIR *dh = NULL;
+
+       if (!NGIRCd_ConfFile[0]) {
+               /* No configuration file name explicitly given on the command
+                * line, use defaults but ignore errors when this file can't be
+                * read later on. */
+               strlcpy(file, SYSCONFDIR, sizeof(file));
+               strlcat(file, CONFIG_FILE, sizeof(file));
+               ptr = file;
+       } else
+               ptr = NGIRCd_ConfFile;
 
-       Config_Error(LOG_INFO, "Using configuration file \"%s\" ...", NGIRCd_ConfFile);
+       Config_Error(LOG_INFO, "Using %s configuration file \"%s\" ...",
+                    !NGIRCd_ConfFile[0] ? "default" : "specified", ptr);
 
        /* Open configuration file */
-       fd = fopen( NGIRCd_ConfFile, "r" );
-       if( ! fd ) {
-               /* No configuration file found! */
-               Config_Error( LOG_ALERT, "Can't read configuration \"%s\": %s",
-                                       NGIRCd_ConfFile, strerror( errno ));
-               if (!IsStarting)
-                       return false;
-               Config_Error( LOG_ALERT, "%s exiting due to fatal errors!", PACKAGE_NAME );
-               exit( 1 );
+       fd = fopen(ptr, "r");
+       if (!fd) {
+               if (NGIRCd_ConfFile[0]) {
+                       Config_Error(LOG_ALERT,
+                                    "Can't read specified configuration file \"%s\": %s",
+                                    ptr, strerror(errno));
+                       if (IsStarting) {
+                               Config_Error(LOG_ALERT,
+                                            "%s exiting due to fatal errors!",
+                                            PACKAGE_NAME);
+                               exit(1);
+                       }
+               }
+               Config_Error(LOG_WARNING,
+                            "Can't read default configuration file \"%s\": %s - Ignored.",
+                            ptr, strerror(errno));
        }
 
        opers_free();
        Set_Defaults(IsStarting);
 
-       if (TestOnly)
+       if (TestOnly && fd)
                Config_Error(LOG_INFO,
                             "Reading configuration from \"%s\" ...",
                             NGIRCd_ConfFile );
@@ -960,16 +980,23 @@ Read_Config(bool TestOnly, bool IsStarting)
        ConfSSL_Init();
 #endif
 
-       Read_Config_File(NGIRCd_ConfFile, fd);
-       fclose(fd);
+       if (fd) {
+               Read_Config_File(NGIRCd_ConfFile, fd);
+               fclose(fd);
+       }
 
        if (Conf_IncludeDir[0]) {
+               /* Include directory was set in the main configuration file. So
+                * use it and show errors. */
                dh = opendir(Conf_IncludeDir);
                if (!dh)
                        Config_Error(LOG_ALERT,
                                     "Can't open include directory \"%s\": %s",
                                     Conf_IncludeDir, strerror(errno));
-       } else {
+       } else if (!NGIRCd_ConfFile[0]) {
+               /* No include dir set in the configuration file used (if any)
+                * but no config file explicitly specified either: so use the
+                * default include path here as well! */
                strlcpy(Conf_IncludeDir, SYSCONFDIR, sizeof(Conf_IncludeDir));
                strlcat(Conf_IncludeDir, CONFIG_DIR, sizeof(Conf_IncludeDir));
                dh = opendir(Conf_IncludeDir);
@@ -1291,7 +1318,7 @@ WarnPAM(const char UNUSED *File, int UNUSED Line)
 /**
  * Handle variable in [Global] configuration section.
  *
- * @param Line Line numer in configuration file.
+ * @param Line Line number in configuration file.
  * @param Var  Variable name.
  * @param Arg  Variable argument.
  */
@@ -1446,7 +1473,7 @@ Handle_GLOBAL(const char *File, int Line, char *Var, char *Arg )
 /**
  * Handle variable in [Limits] configuration section.
  *
- * @param Line Line numer in configuration file.
+ * @param Line Line number in configuration file.
  * @param Var  Variable name.
  * @param Arg  Variable argument.
  */
@@ -1535,7 +1562,7 @@ Handle_LIMITS(const char *File, int Line, char *Var, char *Arg)
 /**
  * Handle variable in [Options] configuration section.
  *
- * @param Line Line numer in configuration file.
+ * @param Line Line number in configuration file.
  * @param Var  Variable name.
  * @param Arg  Variable argument.
  */
@@ -1727,7 +1754,7 @@ Handle_OPTIONS(const char *File, int Line, char *Var, char *Arg)
 /**
  * Handle variable in [SSL] configuration section.
  *
- * @param Line Line numer in configuration file.
+ * @param Line Line number in configuration file.
  * @param Var  Variable name.
  * @param Arg  Variable argument.
  */
@@ -1780,7 +1807,7 @@ Handle_SSL(const char *File, int Line, char *Var, char *Arg)
 /**
  * Handle variable in [Operator] configuration section.
  *
- * @param Line Line numer in configuration file.
+ * @param Line Line number in configuration file.
  * @param Var  Variable name.
  * @param Arg  Variable argument.
  */
@@ -1827,7 +1854,7 @@ Handle_OPERATOR(const char *File, int Line, char *Var, char *Arg )
 /**
  * Handle variable in [Server] configuration section.
  *
- * @param Line Line numer in configuration file.
+ * @param Line Line number in configuration file.
  * @param Var  Variable name.
  * @param Arg  Variable argument.
  */
@@ -1957,7 +1984,7 @@ Handle_Channelname(struct Conf_Channel *new_chan, const char *name)
 /**
  * Handle variable in [Channel] configuration section.
  *
- * @param Line Line numer in configuration file.
+ * @param Line Line number in configuration file.
  * @param Var  Variable name.
  * @param Arg  Variable argument.
  */
@@ -2000,6 +2027,11 @@ Handle_CHANNEL(const char *File, int Line, char *Var, char *Arg)
                        Config_Error_TooLong(File, Line, Var);
                return;
        }
+       if( strcasecmp( Var, "Autojoin" ) == 0 ) {
+               /* Check autojoin */
+               chan->autojoin = Check_ArgIsTrue(Arg);
+               return;
+       }
        if( strcasecmp( Var, "Key" ) == 0 ) {
                /* Initial Channel Key (mode k) */
                len = strlcpy(chan->key, Arg, sizeof(chan->key));
@@ -2047,6 +2079,7 @@ Validate_Config(bool Configtest, bool Rehash)
        /* Validate configuration settings. */
 
        int i, servers, servers_once;
+       struct hostent *h;
        bool config_valid = true;
        char *ptr;
 
@@ -2057,6 +2090,28 @@ Validate_Config(bool Configtest, bool Rehash)
                        NGIRCd_ConfFile);
        }
 
+       if (!Conf_ServerName[0]) {
+               /* No server name configured, try to get a sane name from the
+                * host name. Note: the IRC server name MUST contain
+                * at least one dot, so the "node name" is not sufficient! */
+               gethostname(Conf_ServerName, sizeof(Conf_ServerName));
+               if (Conf_DNS) {
+                       /* Try to get a proper host name ... */
+                       h = gethostbyname(Conf_ServerName);
+                       if (h)
+                               strlcpy(Conf_ServerName, h->h_name,
+                                       sizeof(Conf_ServerName));
+               }
+               if (!strchr(Conf_ServerName, '.')) {
+                       /* (Still) No dot in the name! */
+                       strlcat(Conf_ServerName, ".host",
+                               sizeof(Conf_ServerName));
+               }
+               Config_Error(LOG_WARNING,
+                            "No server name configured, using host name \"%s\".",
+                            Conf_ServerName);
+       }
+
        /* Validate configured server name, see RFC 2812 section 2.3.1 */
        ptr = Conf_ServerName;
        do {
@@ -2071,13 +2126,10 @@ Validate_Config(bool Configtest, bool Rehash)
                break;
        } while (*(++ptr));
 
-       if (!Conf_ServerName[0] || !strchr(Conf_ServerName, '.'))
-       {
-               /* No server name configured! */
+       if (!Conf_ServerName[0] || !strchr(Conf_ServerName, '.')) {
                config_valid = false;
                Config_Error(LOG_ALERT,
-                            "No (valid) server name configured in \"%s\" (section 'Global': 'Name')!",
-                            NGIRCd_ConfFile);
+                            "No (valid) server name configured (section 'Global': 'Name')!");
                if (!Configtest && !Rehash) {
                        Config_Error(LOG_ALERT,
                                     "%s exiting due to fatal errors!",
@@ -2091,8 +2143,7 @@ Validate_Config(bool Configtest, bool Rehash)
                /* No administrative contact configured! */
                config_valid = false;
                Config_Error(LOG_ALERT,
-                            "No administrator email address configured in \"%s\" ('AdminEMail')!",
-                            NGIRCd_ConfFile);
+                            "No administrator email address configured ('AdminEMail')!");
                if (!Configtest) {
                        Config_Error(LOG_ALERT,
                                     "%s exiting due to fatal errors!",