diff options
| author | Alexander Barton <alex@barton.de> | 2013-05-24 22:29:41 +0200 |
|---|---|---|
| committer | Alexander Barton <alex@barton.de> | 2013-05-24 22:34:53 +0200 |
| commit | f206fda8ae14e9c76e3dca6aa67412d5ae9ee9f7 (patch) | |
| tree | eed275603ecb2aebe720c4b7375b98b91e3d69fa /src | |
| parent | 6beb0fad3ff09ae92a7aea0e4b8ad7b00fe2e26d (diff) | |
| download | ngircd-f206fda8ae14e9c76e3dca6aa67412d5ae9ee9f7.tar.gz ngircd-f206fda8ae14e9c76e3dca6aa67412d5ae9ee9f7.zip | |
Implement new configuration option "IncludeDir"
The option "IncludeDir" in the [Options] section can be used
to specify a directory which can contain further configuration
files and configuration file snippets matching the pattern
"*.conf" that should be read in after the main configuration
file ("ngircd.conf" by default) has been parsed.
Closes bug #157.
Diffstat (limited to 'src')
| -rw-r--r-- | src/ngircd/conf.c | 49 |
1 files changed, 45 insertions, 4 deletions
diff --git a/src/ngircd/conf.c b/src/ngircd/conf.c index eee19255..d7e1a154 100644 --- a/src/ngircd/conf.c +++ b/src/ngircd/conf.c @@ -34,7 +34,7 @@ #include <grp.h> #include <sys/types.h> #include <unistd.h> - +#include <dirent.h> #include "array.h" #include "ngircd.h" @@ -55,6 +55,7 @@ static int New_Server_Idx; static char Conf_MotdFile[FNAME_LEN]; static char Conf_HelpFile[FNAME_LEN]; +static char Conf_IncludeDir[FNAME_LEN]; static void Set_Defaults PARAMS(( bool InitServers )); static bool Read_Config PARAMS(( bool TestOnly, bool IsStarting )); @@ -404,6 +405,7 @@ Conf_Test( void ) #ifdef IDENT printf(" Ident = %s\n", yesno_to_str(Conf_Ident)); #endif + printf(" IncludeDir = %s\n", Conf_IncludeDir); 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)); @@ -778,6 +780,7 @@ Set_Defaults(bool InitServers) #else Conf_Ident = false; #endif + strcpy(Conf_IncludeDir, ""); Conf_MorePrivacy = false; Conf_NoticeAuth = false; Conf_OperCanMode = false; @@ -876,8 +879,11 @@ static bool Read_Config(bool TestOnly, bool IsStarting) { const UINT16 defaultport = 6667; + char *ptr, file[FNAME_LEN]; + struct dirent *entry; int i, n; FILE *fd; + DIR *dh; /* Open configuration file */ fd = fopen( NGIRCd_ConfFile, "r" ); @@ -938,9 +944,37 @@ Read_Config(bool TestOnly, bool IsStarting) #endif Read_Config_File(NGIRCd_ConfFile, fd); - - /* Close configuration file */ - fclose( fd ); + 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 + Config_Error(LOG_ALERT, + "Can't open include directory \"%s\": %s", + Conf_IncludeDir, strerror(errno)); + } /* Check if there is still a server to add */ if( New_Server.name[0] ) { @@ -999,6 +1033,7 @@ static void Read_Config_File(const char *File, FILE *fd) size_t count; /* Read configuration file */ + section[0] = '\0'; while (true) { if (!fgets(str, LINE_LEN, fd)) break; @@ -1648,6 +1683,12 @@ Handle_OPTIONS(const char *File, int Line, char *Var, char *Arg) WarnIdent(Line); return; } + if (strcasecmp(Var, "IncludeDir") == 0) { + len = strlcpy(Conf_IncludeDir, Arg, sizeof(Conf_IncludeDir)); + if (len >= sizeof(Conf_IncludeDir)) + Config_Error_TooLong(File, Line, Var); + return; + } if (strcasecmp(Var, "MorePrivacy") == 0) { Conf_MorePrivacy = Check_ArgIsTrue(Arg); return; |