summary refs log tree commit diff
diff options
context:
space:
mode:
authorAlexander Barton <alex@barton.de>2024-01-21 19:41:39 +0100
committerAlexander Barton <alex@barton.de>2024-01-21 20:15:47 +0100
commitb4c8e74ccb2cb95e492323b8b39950b203e0262f (patch)
treee2297f118a0ad85cdd8daa1215962247ae773059
parent3ab6c85284b6b6ba9eae8ee30cadcc545bf02178 (diff)
downloadngircd-b4c8e74ccb2cb95e492323b8b39950b203e0262f.tar.gz
ngircd-b4c8e74ccb2cb95e492323b8b39950b203e0262f.zip
Use a default "IncludeDir" only when no config file was specified
No longer use a default built-in value for the "IncludeDir" directive
when a configuration file was explicitly specified on the command line
using "--config"/"-f": This way no default include directory is scanned
when a possibly non-default configuration file is used which
(intentionally) did not specify an "IncludeDir" directive.

With this patch you now can use "-f /dev/null" for checking all built-in
defaults, regardless of any local configuration files in the default
drop-in directory (which would have been read in until this change).
-rw-r--r--ChangeLog8
-rw-r--r--doc/sample-ngircd.conf.tmpl9
-rw-r--r--man/ngircd.conf.5.tmpl17
-rw-r--r--src/ngircd/conf.c55
-rw-r--r--src/ngircd/ngircd.c2
5 files changed, 69 insertions, 22 deletions
diff --git a/ChangeLog b/ChangeLog
index bd82b1ed..1472e98b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -10,6 +10,14 @@
 
 ngIRCd 27
 
+  - No longer use a default built-in value for the "IncludeDir" directive when
+    a configuration file was explicitly specified on the command line using
+    "--config"/"-f": This way no default include directory is scanned when a
+    possibly non-default configuration file is used which (intentionally) did
+    not specify an "IncludeDir" directive. So now you can use "-f /dev/null"
+    for checking all built-in defaults, regardless of any local configuration
+    files in the default drop-in directory (which would have been read in
+    until this change).
   - The server "Name" in the "[Global]" section of the configuration file no
     longer needs to be set: When not set (or empty), ngIRCd now tries to
     deduce a valid IRC server name from the local host name ("node name"),
diff --git a/doc/sample-ngircd.conf.tmpl b/doc/sample-ngircd.conf.tmpl
index 79360869..d59b139b 100644
--- a/doc/sample-ngircd.conf.tmpl
+++ b/doc/sample-ngircd.conf.tmpl
@@ -35,7 +35,8 @@
 	;AdminEMail = admin@irc.server
 
 	# Text file which contains the ngIRCd help text. This file is required
-	# to display help texts when using the "HELP <cmd>" command.
+	# to display help texts when using the "HELP <cmd>" command. Default: a
+	# built-in standard path (check "ngircd --configtest").
 	;HelpFile = :DOCDIR:/Commands.txt
 
 	# Info text of the server. This will be shown by WHOIS and
@@ -50,7 +51,8 @@
 	;Listen = 127.0.0.1,192.168.0.1
 
 	# Text file with the "message of the day" (MOTD). This message will
-	# be shown to all users connecting to the server:
+	# be shown to all users connecting to the server: Default: a built-in
+	# standard path (check "ngircd --configtest").
 	;MotdFile = :ETCDIR:/ngircd.motd
 
 	# A simple Phrase (<127 chars) if you don't want to use a motd file.
@@ -194,6 +196,9 @@
 
 	# Directory containing configuration snippets (*.conf), that should
 	# be read in after parsing this configuration file.
+	# Default: a built-in directory name when no configuration file was
+	# explicitly given on the command line (check "ngircd --configtest"),
+	# none (empty) otherwise.
 	;IncludeDir = :ETCDIR:/conf.d
 
 	# Enhance user privacy slightly (useful for IRC server on TOR or I2P)
diff --git a/man/ngircd.conf.5.tmpl b/man/ngircd.conf.5.tmpl
index 01e5408e..9d37e5fa 100644
--- a/man/ngircd.conf.5.tmpl
+++ b/man/ngircd.conf.5.tmpl
@@ -107,7 +107,8 @@ command. This information is not required by the server but by RFC!
 Text file which contains the ngIRCd help text. This file is required
 to display help texts when using the "HELP <cmd>" command.
 Please note: Changes made to this file take effect when ngircd starts up
-or is instructed to re-read its configuration file.
+or is instructed to re-read its configuration file. Default: a built-in
+standard path.
 .TP
 \fBInfo\fR (string)
 Info text of the server. This will be shown by WHOIS and LINKS requests for
@@ -123,7 +124,7 @@ IP addresses and interfaces by default.
 Text file with the "message of the day" (MOTD). This message will be shown to
 all users connecting to the server. Please note: Changes made to this file
 take effect when ngircd starts up or is instructed to re-read its
-configuration file.
+configuration file. Default: a built-in standard path.
 .TP
 \fBMotdPhrase\fR (string)
 A simple Phrase (<127 chars) if you don't want to use a MOTD file.
@@ -294,7 +295,17 @@ Default: yes.
 \fBIncludeDir\fR (string)
 Directory containing configuration snippets (*.conf), that should be read in
 after parsing the current configuration file.
-Default: none.
+Default: a built-in directory name when no configuration file was explicitly
+given on the command line (check "ngircd --configtest"), none (empty)
+otherwise.
+.PP
+.RS
+This way no default include directory is used when a possibly non-default
+configuration file was explicitly specified using "--config"/"-f" on the
+command line which (intentionally) did not specify an
+.I "IncludeDir"
+directive.
+.RE
 .TP
 \fBMorePrivacy\fR (boolean)
 This will cause ngIRCd to censor user idle time, logon time as well as the
diff --git a/src/ngircd/conf.c b/src/ngircd/conf.c
index ec323837..eaa5e932 100644
--- a/src/ngircd/conf.c
+++ b/src/ngircd/conf.c
@@ -903,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 );
@@ -962,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);
diff --git a/src/ngircd/ngircd.c b/src/ngircd/ngircd.c
index 04462a6d..b0610392 100644
--- a/src/ngircd/ngircd.c
+++ b/src/ngircd/ngircd.c
@@ -92,8 +92,6 @@ main(int argc, const char *argv[])
 #ifdef SNIFFER
 	NGIRCd_Sniffer = false;
 #endif
-	strlcpy(NGIRCd_ConfFile, SYSCONFDIR, sizeof(NGIRCd_ConfFile));
-	strlcat(NGIRCd_ConfFile, CONFIG_FILE, sizeof(NGIRCd_ConfFile));
 
 	Fill_Version();