commit 7ea3864a9369086024a2d541b053963958b19899 from: Alexander Barton date: Fri May 24 22:25:38 2013 UTC IncludeDir: default to "$SYSCONFDIR/ngircd.conf.d" Now "IncludeDir" defaults to "$SYSCONFDIR/ngircd.conf.d" instead of no directory, but a missing directory is only reported as an error if it has explicitely configured in the main configuration file and simply ignored otherwise. Therefore it is now possible not to touch the default (sample) configuration file at all, and set all distribution and/or system specific configuration options in "*.conf" files stored in "$SYSCONFDIF/ngircd.conf.d/". Thanks to "Elmasloco" for the idea! commit - 891dbd2acc59a6d9ff6dd8a5b12e91f5a8fa20ed commit + 7ea3864a9369086024a2d541b053963958b19899 blob - c08183de9c1c94861b6f646bdbf341615391a652 blob + aad64b3e380444dff3e7769feef02cff684f33c2 --- src/ngircd/conf.c +++ src/ngircd/conf.c @@ -947,35 +947,41 @@ Read_Config(bool TestOnly, bool IsStarting) fclose(fd); if (Conf_IncludeDir[0]) { - /* Include further configuration files, if any */ dh = opendir(Conf_IncludeDir); - if (dh) { - while ((entry = readdir(dh)) != NULL) { - ptr = strrchr(entry->d_name, '.'); - if (!ptr || strcasecmp(ptr, ".conf") != 0) - continue; - snprintf(file, sizeof(file), "%s/%s", - Conf_IncludeDir, entry->d_name); - if (TestOnly) - Config_Error(LOG_INFO, - "Reading configuration from \"%s\" ...", - file); - fd = fopen(file, "r"); - if (fd) { - Read_Config_File(file, fd); - fclose(fd); - } else - Config_Error(LOG_ALERT, - "Can't read configuration \"%s\": %s", - file, strerror(errno)); - } - closedir(dh); - } else + if (!dh) Config_Error(LOG_ALERT, "Can't open include directory \"%s\": %s", Conf_IncludeDir, strerror(errno)); + } else { + strlcpy(Conf_IncludeDir, SYSCONFDIR, sizeof(Conf_IncludeDir)); + strlcat(Conf_IncludeDir, CONFIG_DIR, sizeof(Conf_IncludeDir)); + dh = opendir(Conf_IncludeDir); } + /* Include further configuration files, if IncludeDir is available */ + if (dh) { + while ((entry = readdir(dh)) != NULL) { + ptr = strrchr(entry->d_name, '.'); + if (!ptr || strcasecmp(ptr, ".conf") != 0) + continue; + snprintf(file, sizeof(file), "%s/%s", + Conf_IncludeDir, entry->d_name); + if (TestOnly) + Config_Error(LOG_INFO, + "Reading configuration from \"%s\" ...", + file); + fd = fopen(file, "r"); + if (fd) { + Read_Config_File(file, fd); + fclose(fd); + } else + Config_Error(LOG_ALERT, + "Can't read configuration \"%s\": %s", + file, strerror(errno)); + } + closedir(dh); + } + /* Check if there is still a server to add */ if( New_Server.name[0] ) { /* Copy data to "real" server structure */ blob - cffbfadfa10cdb8ecca525c8d1c787bd650ee71c blob + 7784c17470434ee7d3997767239c1b2bfe6c8d6c --- src/ngircd/defines.h +++ src/ngircd/defines.h @@ -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 @@ -73,6 +73,9 @@ /** Configuration file name. */ #define CONFIG_FILE "/ngircd.conf" +/** Directory containing optional configuration snippets. */ +#define CONFIG_DIR "/ngircd.conf.d" + /** Name of the MOTD file. */ #define MOTD_FILE "/ngircd.motd" blob - 1e40fd3cb63c45ebaef003f4248618bee344b088 blob + 0d0cccc9ce3b669b280cb0a26dd9f1d78df6d72e --- src/testsuite/ngircd-test1.conf +++ src/testsuite/ngircd-test1.conf @@ -16,6 +16,7 @@ [Options] OperCanUseMode = yes Ident = no + IncludeDir = /var/empty PAM = no [Operator] blob - e3f88672c39bd5f71091e79236d89e93fab4ad3a blob + c9d7f6c5b4b02f44144318b8e4f67cc2790e874b --- src/testsuite/ngircd-test2.conf +++ src/testsuite/ngircd-test2.conf @@ -16,6 +16,7 @@ [Options] OperCanUseMode = yes Ident = no + IncludeDir = /var/empty PAM = no [Operator]