/*
* 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
{
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;
printf(" MaxConnectionsIP = %d\n", Conf_MaxConnectionsIP);
printf(" MaxJoins = %d\n", Conf_MaxJoins > 0 ? Conf_MaxJoins : -1);
printf(" MaxNickLength = %u\n", Conf_MaxNickLength - 1);
- printf(" MaxPenaltyTime = %ld\n", Conf_MaxPenaltyTime);
+ printf(" MaxPenaltyTime = %ld\n", (long)Conf_MaxPenaltyTime);
printf(" MaxListSize = %d\n", Conf_MaxListSize);
printf(" PingTimeout = %d\n", Conf_PingTimeout);
printf(" PongTimeout = %d\n", Conf_PongTimeout);
/* 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);
static bool
Read_TextFile(const char *Filename, const char *Name, array *Destination)
{
- char line[127];
+ char line[COMMAND_LEN];
FILE *fp;
int line_no = 1;
FILE *fd;
DIR *dh;
+ Config_Error(LOG_INFO, "Using configuration file \"%s\" ...", NGIRCd_ConfFile);
+
/* Open configuration file */
fd = fopen( NGIRCd_ConfFile, "r" );
if( ! fd ) {
if( Conf_Server[i].conn_id == Conf_Server[n].conn_id ) {
Init_Server_Struct( &Conf_Server[n] );
-#ifdef DEBUG
- Log(LOG_DEBUG,"Deleted unused duplicate server %d (kept %d).",
- n, i );
-#endif
+ LogDebug("Deleted unused duplicate server %d (kept %d).", n, i);
}
}
} else {
/* Mark server as "once" */
Conf_Server[i].flags |= CONF_SFLAG_ONCE;
- Log( LOG_DEBUG, "Marked server %d as \"once\"", i );
+ LogDebug("Marked server %d as \"once\"", i);
}
}
}
#endif
}
-/**
- * Handle legacy "NoXXX" options in [GLOBAL] section.
- *
- * TODO: This function and support for "NoXXX" could be removed starting
- * with ngIRCd release 19 (one release after marking it "deprecated").
- *
- * @param Var Variable name.
- * @param Arg Argument string.
- * @returns true if a NoXXX option has been processed; false otherwise.
- */
-static bool
-CheckLegacyNoOption(const char *Var, const char *Arg)
-{
- if(strcasecmp(Var, "NoDNS") == 0) {
- Conf_DNS = !Check_ArgIsTrue( Arg );
- return true;
- }
- if (strcasecmp(Var, "NoIdent") == 0) {
- Conf_Ident = !Check_ArgIsTrue(Arg);
- return true;
- }
- if(strcasecmp(Var, "NoPAM") == 0) {
- Conf_PAM = !Check_ArgIsTrue(Arg);
- return true;
- }
- return false;
-}
-
-/**
- * Handle deprecated legacy options in [GLOBAL] section.
- *
- * TODO: This function and support for these options in the [Global] section
- * could be removed starting with ngIRCd release 19 (one release after
- * marking it "deprecated").
- *
- * @param Var Variable name.
- * @param Arg Argument string.
- * @returns true if a legacy option has been processed; false otherwise.
- */
-static const char*
-CheckLegacyGlobalOption(const char *File, int Line, char *Var, char *Arg)
-{
- if (strcasecmp(Var, "AllowRemoteOper") == 0
- || strcasecmp(Var, "ChrootDir") == 0
- || strcasecmp(Var, "ConnectIPv4") == 0
- || strcasecmp(Var, "ConnectIPv6") == 0
- || strcasecmp(Var, "OperCanUseMode") == 0
- || strcasecmp(Var, "OperChanPAutoOp") == 0
- || strcasecmp(Var, "OperServerMode") == 0
- || strcasecmp(Var, "PredefChannelsOnly") == 0
- || strcasecmp(Var, "SyslogFacility") == 0
- || strcasecmp(Var, "WebircPassword") == 0) {
- Handle_OPTIONS(File, Line, Var, Arg);
- return "[Options]";
- }
- if (strcasecmp(Var, "ConnectRetry") == 0
- || strcasecmp(Var, "IdleTimeout") == 0
- || strcasecmp(Var, "MaxConnections") == 0
- || strcasecmp(Var, "MaxConnectionsIP") == 0
- || strcasecmp(Var, "MaxJoins") == 0
- || strcasecmp(Var, "MaxNickLength") == 0
- || strcasecmp(Var, "PingTimeout") == 0
- || strcasecmp(Var, "PongTimeout") == 0) {
- Handle_LIMITS(File, Line, Var, Arg);
- return "[Limits]";
- }
-#ifdef SSL_SUPPORT
- if (strcasecmp(Var, "SSLCertFile") == 0
- || strcasecmp(Var, "SSLDHFile") == 0
- || strcasecmp(Var, "SSLKeyFile") == 0
- || strcasecmp(Var, "SSLKeyFilePassword") == 0
- || strcasecmp(Var, "SSLPorts") == 0) {
- Handle_SSL(File, Line, Var + 3, Arg);
- return "[SSL]";
- }
-#endif
-
- return NULL;
-}
-
-/**
- * Strip "no" prefix of a string.
- *
- * TODO: This function and support for "NoXXX" should be removed starting
- * with ngIRCd release 19! (One release after marking it "deprecated").
- *
- * @param str Pointer to input string starting with "no".
- * @returns New pointer to string without "no" prefix.
- */
-static const char *
-NoNo(const char *str)
-{
- assert(strncasecmp("no", str, 2) == 0 && str[2]);
- return str + 2;
-}
-
-/**
- * Invert "boolean" string.
- *
- * TODO: This function and support for "NoXXX" should be removed starting
- * with ngIRCd release 19! (One release after marking it "deprecated").
- *
- * @param arg "Boolean" input string.
- * @returns Pointer to inverted "boolean string".
- */
-static const char *
-InvertArg(const char *arg)
-{
- return yesno_to_str(!Check_ArgIsTrue(arg));
-}
/**
* Handle variable in [Global] configuration section.
struct passwd *pwd;
struct group *grp;
size_t len;
- const char *section;
char *ptr;
assert(File != NULL);
return;
}
- if (CheckLegacyNoOption(Var, Arg)) {
- /* TODO: This function and support for "NoXXX" could be
- * be removed starting with ngIRCd release 19 (one release
- * after marking it "deprecated"). */
- Config_Error(LOG_WARNING,
- "%s, line %d (section \"Global\"): \"No\"-Prefix is deprecated, use \"%s = %s\" in [Options] section!",
- File, Line, NoNo(Var), InvertArg(Arg));
- if (strcasecmp(Var, "NoIdent") == 0)
- WarnIdent(File, Line);
- else if (strcasecmp(Var, "NoPam") == 0)
- WarnPAM(File, Line);
- return;
- }
- if ((section = CheckLegacyGlobalOption(File, Line, Var, Arg))) {
- /** TODO: This function and support for these options in the
- * [Global] section could be removed starting with ngIRCd
- * release 19 (one release after marking it "deprecated"). */
- if (strncasecmp(Var, "SSL", 3) == 0) {
- Config_Error(LOG_WARNING,
- "%s, line %d (section \"Global\"): \"%s\" is deprecated here, move it to %s and rename to \"%s\"!",
- File, Line, Var, section,
- Var + 3);
- } else {
- Config_Error(LOG_WARNING,
- "%s, line %d (section \"Global\"): \"%s\" is deprecated here, move it to %s!",
- File, Line, Var, section);
- }
- return;
- }
-
Config_Error_Section(File, Line, Var, "Global");
}
Conf_MorePrivacy = Check_ArgIsTrue(Arg);
return;
}
- if (strcasecmp(Var, "NoticeAuth") == 0) {
- /*
- * TODO: This section and support for "NoticeAuth" variable
- * could be removed starting with ngIRCd release 24 (one
- * release after marking it "deprecated") ...
- */
- Config_Error(LOG_WARNING,
- "%s, line %d (section \"Options\"): \"%s\" is deprecated, please use \"NoticeBeforeRegistration\"!",
- File, Line, Var);
- Conf_NoticeBeforeRegistration = Check_ArgIsTrue(Arg);
- return;
- }
if (strcasecmp(Var, "NoticeBeforeRegistration") == 0) {
Conf_NoticeBeforeRegistration = Check_ArgIsTrue(Arg);
return;
Config_Error_TooLong(File, Line, Var);
return;
}
- if (strcasecmp(Var, "PredefChannelsOnly") == 0) {
- /*
- * TODO: This section and support for "PredefChannelsOnly"
- * could be removed starting with ngIRCd release 22 (one
- * release after marking it "deprecated") ...
- */
- Config_Error(LOG_WARNING,
- "%s, line %d (section \"Options\"): \"%s\" is deprecated, please use \"AllowedChannelTypes\"!",
- File, Line, Var);
- if (Check_ArgIsTrue(Arg))
- Conf_AllowedChannelTypes[0] = '\0';
- else
- strlcpy(Conf_AllowedChannelTypes, CHANTYPES,
- sizeof(Conf_AllowedChannelTypes));
- return;
- }
#ifndef STRICT_RFC
if (strcasecmp(Var, "RequireAuthPing") == 0) {
Conf_AuthPing = Check_ArgIsTrue(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;
}
len = strlcpy(chan->key, Arg, sizeof(chan->key));
if (len >= sizeof(chan->key))
Config_Error_TooLong(File, Line, Var);
+ Config_Error(LOG_WARNING,
+ "%s, line %d (section \"Channel\"): \"%s\" is deprecated here, use \"Modes = +k <key>\"!",
+ File, Line, Var);
return;
}
if( strcasecmp( Var, "MaxUsers" ) == 0 ) {
chan->maxusers = (unsigned long) atol(Arg);
if (!chan->maxusers && strcmp(Arg, "0"))
Config_Error_NaN(File, Line, Var);
+ Config_Error(LOG_WARNING,
+ "%s, line %d (section \"Channel\"): \"%s\" is deprecated here, use \"Modes = +l <limit>\"!",
+ File, Line, Var);
return;
}
if (strcasecmp(Var, "KeyFile") == 0) {
{
/* Validate configuration settings. */
-#ifdef DEBUG
int i, servers, servers_once;
-#endif
bool config_valid = true;
char *ptr;
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,
}
}
- 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! */
"Maximum penalty increase ('MaxPenaltyTime') is set to %ld, this is not recommended!",
Conf_MaxPenaltyTime);
-#ifdef DEBUG
servers = servers_once = 0;
for (i = 0; i < MAX_SERVERS; i++) {
if (Conf_Server[i].name[0]) {
servers_once++;
}
}
- Log(LOG_DEBUG,
- "Configuration: Operators=%ld, Servers=%d[%d], Channels=%ld",
+ LogDebug("Configuration: Operators=%ld, Servers=%d[%d], Channels=%ld",
array_length(&Conf_Opers, sizeof(struct Conf_Oper)),
servers, servers_once,
array_length(&Conf_Channels, sizeof(struct Conf_Channel)));
-#endif
return config_valid;
}
Log(Level, "%s", msg);
}
-#ifdef DEBUG
/**
* Dump internal state of the "configuration module".
{
int i;
- Log(LOG_DEBUG, "Configured servers:");
+ LogDebug("Configured servers:");
for (i = 0; i < MAX_SERVERS; i++) {
if (! Conf_Server[i].name[0])
continue;
- Log(LOG_DEBUG,
+ LogDebug(
" - %s: %s:%d, last=%ld, group=%d, flags=%d, conn=%d",
Conf_Server[i].name, Conf_Server[i].host,
Conf_Server[i].port, Conf_Server[i].lasttry,
}
}
-#endif
/**
* Initialize server configuration structure to default values.