Skip to content

Commit

Permalink
Use a default "IncludeDir" only when no config file was specified
Browse files Browse the repository at this point in the history
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).
  • Loading branch information
alexbarton committed Jan 21, 2024
1 parent 3ab6c85 commit b4c8e74
Show file tree
Hide file tree
Showing 5 changed files with 69 additions and 22 deletions.
8 changes: 8 additions & 0 deletions ChangeLog
Expand Up @@ -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"),
Expand Down
9 changes: 7 additions & 2 deletions doc/sample-ngircd.conf.tmpl
Expand Up @@ -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
Expand All @@ -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.
Expand Down Expand Up @@ -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)
Expand Down
17 changes: 14 additions & 3 deletions man/ngircd.conf.5.tmpl
Expand Up @@ -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
Expand All @@ -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.
Expand Down Expand Up @@ -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
Expand Down
55 changes: 40 additions & 15 deletions src/ngircd/conf.c
Expand Up @@ -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 );
Expand Down Expand Up @@ -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);
Expand Down
2 changes: 0 additions & 2 deletions src/ngircd/ngircd.c
Expand Up @@ -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();

Expand Down

0 comments on commit b4c8e74

Please sign in to comment.