]> arthur.barton.de Git - ngircd-alex.git/blobdiff - src/ngircd/conf.c
Allow multiple "Modes =" lines per [Channel] section
[ngircd-alex.git] / src / ngircd / conf.c
index 3f2e01546dc69779d4cf8d22b748a9d45e0993ba..373ea6b1ed7bf6709038f84d3b08be11eefffa3b 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * ngIRCd -- The Next Generation IRC Daemon
- * Copyright (c)2001-2018 Alexander Barton (alex@barton.de) and Contributors.
+ * Copyright (c)2001-2019 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
@@ -328,7 +328,7 @@ Conf_Test( void )
 {
        struct passwd *pwd;
        struct group *grp;
-       unsigned int i;
+       unsigned int i, j;
        bool config_valid;
        size_t predef_channel_count;
        struct Conf_Channel *predef_chan;
@@ -483,7 +483,8 @@ Conf_Test( void )
                /* Valid "Channel" section */
                puts( "[CHANNEL]" );
                printf("  Name = %s\n", predef_chan->name);
-               printf("  Modes = %s\n", predef_chan->modes);
+               for(j = 0; j < predef_chan->modes_num; j++)
+                       printf("  Modes = %s\n", predef_chan->modes[j]);
                printf("  Key = %s\n", predef_chan->key);
                printf("  MaxUsers = %lu\n", predef_chan->maxusers);
                printf("  Topic = %s\n", predef_chan->topic);
@@ -902,6 +903,8 @@ Read_Config(bool TestOnly, bool IsStarting)
        FILE *fd;
        DIR *dh;
 
+       Log(LOG_INFO, "Using configuration file \"%s\" ...", NGIRCd_ConfFile);
+
        /* Open configuration file */
        fd = fopen( NGIRCd_ConfFile, "r" );
        if( ! fd ) {
@@ -2153,8 +2156,12 @@ Handle_CHANNEL(const char *File, int Line, char *Var, char *Arg)
        }
        if (strcasecmp(Var, "Modes") == 0) {
                /* Initial modes */
-               len = strlcpy(chan->modes, Arg, sizeof(chan->modes));
-               if (len >= sizeof(chan->modes))
+               if(chan->modes_num >= sizeof(chan->modes)) {
+                       Config_Error(LOG_ERR, "Too many Modes, option ignored.");
+                       return;
+               }
+               chan->modes[chan->modes_num++] = strndup(Arg, COMMAND_LEN);
+               if(strlen(Arg) >= COMMAND_LEN)
                        Config_Error_TooLong(File, Line, Var);
                return;
        }
@@ -2232,7 +2239,8 @@ Validate_Config(bool Configtest, bool Rehash)
                break;
        } while (*(++ptr));
 
-       if (!Conf_ServerName[0]) {
+       if (!Conf_ServerName[0] || !strchr(Conf_ServerName, '.'))
+       {
                /* No server name configured! */
                config_valid = false;
                Config_Error(LOG_ALERT,
@@ -2246,20 +2254,6 @@ Validate_Config(bool Configtest, bool Rehash)
                }
        }
 
-       if (Conf_ServerName[0] && !strchr(Conf_ServerName, '.')) {
-               /* No dot in server name! */
-               config_valid = false;
-               Config_Error(LOG_ALERT,
-                            "Invalid server name configured in \"%s\" (section 'Global': 'Name'): Dot missing!",
-                            NGIRCd_ConfFile);
-               if (!Configtest) {
-                       Config_Error(LOG_ALERT,
-                                    "%s exiting due to fatal errors!",
-                                    PACKAGE_NAME);
-                       exit(1);
-               }
-       }
-
 #ifdef STRICT_RFC
        if (!Conf_ServerAdminMail[0]) {
                /* No administrative contact configured! */