X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fngircd%2Fconf.c;h=373ea6b1ed7bf6709038f84d3b08be11eefffa3b;hb=a3072ce698873d3732160b1cee63a35ccb75d5b4;hp=01ec3c09510ae18324900d4fd3651ea63865b401;hpb=e84000f7b8b8fb8ae29f53f66dea488f904e0838;p=ngircd.git diff --git a/src/ngircd/conf.c b/src/ngircd/conf.c index 01ec3c09..373ea6b1 100644 --- a/src/ngircd/conf.c +++ b/src/ngircd/conf.c @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2014 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 @@ -328,7 +328,7 @@ Conf_Test( void ) { 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; @@ -388,6 +388,7 @@ Conf_Test( void ) 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(" MaxListSize = %d\n", Conf_MaxListSize); printf(" PingTimeout = %d\n", Conf_PingTimeout); printf(" PongTimeout = %d\n", Conf_PongTimeout); @@ -482,7 +483,8 @@ Conf_Test( void ) /* 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); @@ -711,7 +713,6 @@ Conf_NickIsService(int ConfServer, const char *Nick) /** * Check if the given nickname is blocked for "normal client" use. * - * @param ConfServer The server index or NONE to check all configured servers. * @param Nick The nickname to check. * @returns true if the given nickname belongs to an "IRC service". */ @@ -766,6 +767,7 @@ Set_Defaults(bool InitServers) Conf_MaxConnectionsIP = 5; Conf_MaxJoins = 10; Conf_MaxNickLength = CLIENT_NICK_LEN_DEFAULT; + Conf_MaxPenaltyTime = -1; Conf_MaxListSize = 100; Conf_PingTimeout = 120; Conf_PongTimeout = 20; @@ -845,7 +847,7 @@ no_listenports(void) * * This function is used to read the MOTD and help text file, for example. * - * @param filename Name of the file to read. + * @param Filename Name of the file to read. * @return true, when the file has been read in. */ static bool @@ -887,9 +889,9 @@ Read_TextFile(const char *Filename, const char *Name, array *Destination) * Please note that this function uses exit(1) on fatal errors and therefore * can result in ngIRCd terminating! * - * @param ngircd_starting Flag indicating if ngIRCd is starting or not. - * @returns true when the configuration file has been read - * successfully; false otherwise. + * @param IsStarting Flag indicating if ngIRCd is starting or not. + * @returns true when the configuration file has been read + * successfully; false otherwise. */ static bool Read_Config(bool TestOnly, bool IsStarting) @@ -901,6 +903,8 @@ Read_Config(bool TestOnly, bool IsStarting) FILE *fd; DIR *dh; + Log(LOG_INFO, "Using configuration file \"%s\" ...", NGIRCd_ConfFile); + /* Open configuration file */ fd = fopen( NGIRCd_ConfFile, "r" ); if( ! fd ) { @@ -1642,6 +1646,12 @@ Handle_LIMITS(const char *File, int Line, char *Var, char *Arg) Config_Error_NaN(File, Line, Var); return; } + if (strcasecmp(Var, "MaxPenaltyTime") == 0) { + Conf_MaxPenaltyTime = atol(Arg); + if (Conf_MaxPenaltyTime < -1) + Conf_MaxPenaltyTime = -1; /* "unlimited" */ + return; + } if (strcasecmp(Var, "PingTimeout") == 0) { Conf_PingTimeout = atoi(Arg); if (Conf_PingTimeout < 5) { @@ -2146,8 +2156,12 @@ Handle_CHANNEL(const char *File, int Line, char *Var, char *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; } @@ -2225,7 +2239,8 @@ Validate_Config(bool Configtest, bool Rehash) 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, @@ -2239,20 +2254,6 @@ Validate_Config(bool Configtest, bool Rehash) } } - 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! */ @@ -2282,6 +2283,11 @@ Validate_Config(bool Configtest, bool Rehash) "This server uses PAM, \"Password\" in [Global] section will be ignored!"); #endif + if (Conf_MaxPenaltyTime != -1) + Config_Error(LOG_WARNING, + "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++) {