X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=ngircd-alex.git;a=blobdiff_plain;f=src%2Fngircd%2Fconf.c;h=fb8db2c4c3842b8f0c1b58f4466c317e634b79a8;hp=db5286938c1760c88c944d1d9a481ac54114fa09;hb=ae7470ceb546d87cbd366d508641276313ec9130;hpb=9402bcaa73a9365f861108f1b53eec1c09837eef diff --git a/src/ngircd/conf.c b/src/ngircd/conf.c index db528693..fb8db2c4 100644 --- a/src/ngircd/conf.c +++ b/src/ngircd/conf.c @@ -7,13 +7,15 @@ * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * Please read the file COPYING, README and AUTHORS for more information. - * - * Configuration management (reading, parsing & validation) */ - #include "portab.h" +/** + * @file + * Configuration management (reading, parsing & validation) + */ + #include "imp.h" #include #include @@ -62,6 +64,7 @@ static bool Read_Config PARAMS(( bool ngircd_starting )); static bool Validate_Config PARAMS(( bool TestOnly, bool Rehash )); static void Handle_GLOBAL PARAMS(( int Line, char *Var, char *Arg )); +static void Handle_FEATURES PARAMS(( int Line, char *Var, char *Arg )); static void Handle_OPERATOR PARAMS(( int Line, char *Var, char *Arg )); static void Handle_SERVER PARAMS(( int Line, char *Var, char *Arg )); static void Handle_CHANNEL PARAMS(( int Line, char *Var, char *Arg )); @@ -232,7 +235,7 @@ opers_free(void) { struct Conf_Oper *op; size_t len; - + len = array_length(&Conf_Opers, sizeof(*op)); op = array_start(&Conf_Opers); while (len--) { @@ -247,7 +250,7 @@ opers_puts(void) { struct Conf_Oper *op; size_t len; - + len = array_length(&Conf_Opers, sizeof(*op)); op = array_start(&Conf_Opers); while (len--) { @@ -341,11 +344,6 @@ Conf_Test( void ) printf(" OperServerMode = %s\n", yesno_to_str(Conf_OperServerMode)); printf(" AllowRemoteOper = %s\n", yesno_to_str(Conf_AllowRemoteOper)); printf(" PredefChannelsOnly = %s\n", yesno_to_str(Conf_PredefChannelsOnly)); - printf(" DNS = %s\n", yesno_to_str(Conf_DNS)); - printf(" Ident = %s\n", yesno_to_str(Conf_Ident)); - printf(" PAM = %s\n", yesno_to_str(Conf_PAM)); - printf(" ZeroConf = %s\n", yesno_to_str(Conf_ZeroConf)); - #ifdef WANT_IPV6 printf(" ConnectIPv4 = %s\n", yesno_to_str(Conf_ConnectIPv6)); printf(" ConnectIPv6 = %s\n", yesno_to_str(Conf_ConnectIPv4)); @@ -353,7 +351,15 @@ Conf_Test( void ) printf(" MaxConnections = %ld\n", Conf_MaxConnections); printf(" MaxConnectionsIP = %d\n", Conf_MaxConnectionsIP); printf(" MaxJoins = %d\n", Conf_MaxJoins > 0 ? Conf_MaxJoins : -1); - printf(" MaxNickLength = %u\n\n", Conf_MaxNickLength - 1); + printf(" MaxNickLength = %u\n", Conf_MaxNickLength - 1); + printf(" CloakHost = %s\n", Conf_CloakHost); + printf(" CloakUserToNick = %s\n\n", yesno_to_str(Conf_CloakUserToNick)); + + puts("[FEATURES]"); + printf(" DNS = %s\n", yesno_to_str(Conf_DNS)); + printf(" Ident = %s\n", yesno_to_str(Conf_Ident)); + printf(" PAM = %s\n", yesno_to_str(Conf_PAM)); + puts(""); opers_puts(); @@ -574,11 +580,6 @@ Set_Defaults_Optional(void) #else Conf_PAM = false; #endif -#ifdef ZEROCONF - Conf_ZeroConf = true; -#else - Conf_ZeroConf = false; -#endif } @@ -630,6 +631,9 @@ Set_Defaults(bool InitServers) Conf_MaxJoins = 10; Conf_MaxNickLength = CLIENT_NICK_LEN_DEFAULT; + strcpy(Conf_CloakHost, ""); + Conf_CloakUserToNick = false; + #ifdef SYSLOG #ifdef LOG_LOCAL5 Conf_SyslogFacility = LOG_LOCAL5; @@ -644,6 +648,9 @@ Set_Defaults(bool InitServers) for (i = 0; i < MAX_SERVERS; Init_Server_Struct(&Conf_Server[i++])); } + + /* Free MOTD; this is important when reloading the configuration */ + array_free(&Conf_Motd); } /* Set_Defaults */ @@ -668,7 +675,7 @@ Read_Motd(const char *filename) fp = fopen(filename, "r"); if (!fp) { - Log(LOG_WARNING, "Can't read MOTD file \"%s\": %s", + Config_Error(LOG_WARNING, "Can't read MOTD file \"%s\": %s", filename, strerror(errno)); return; } @@ -766,7 +773,8 @@ Read_Config( bool ngircd_starting ) /* Is this the beginning of a new section? */ if(( str[0] == '[' ) && ( str[strlen( str ) - 1] == ']' )) { strlcpy( section, str, sizeof( section )); - if( strcasecmp( section, "[GLOBAL]" ) == 0 ) + if (strcasecmp( section, "[GLOBAL]" ) == 0 || + strcasecmp( section, "[FEATURES]") == 0) continue; if( strcasecmp( section, "[SERVER]" ) == 0 ) { @@ -818,6 +826,7 @@ Read_Config( bool ngircd_starting ) arg = ptr + 1; ngt_TrimStr( arg ); if( strcasecmp( section, "[GLOBAL]" ) == 0 ) Handle_GLOBAL( line, var, arg ); + else if( strcasecmp( section, "[FEATURES]" ) == 0 ) Handle_FEATURES( line, var, arg ); else if( strcasecmp( section, "[OPERATOR]" ) == 0 ) Handle_OPERATOR( line, var, arg ); else if( strcasecmp( section, "[SERVER]" ) == 0 ) Handle_SERVER( line, var, arg ); else if( strcasecmp( section, "[CHANNEL]" ) == 0 ) Handle_CHANNEL( line, var, arg ); @@ -899,8 +908,20 @@ WarnIdent(int UNUSED Line) if (Conf_Ident) { /* user has enabled ident lookups explicitly, but ... */ Config_Error(LOG_WARNING, - "%s: line %d: Ident=True, but ngircd was built without IDENT support", - NGIRCd_ConfFile, Line); + "%s: line %d: %s=True, but ngircd was built without support", + NGIRCd_ConfFile, Line, "Ident"); + } +#endif +} + +static void +WarnPAM(int UNUSED Line) +{ +#ifndef PAM + if (Conf_PAM) { + Config_Error(LOG_WARNING, + "%s: line %d: %s=True, but ngircd was built without support", + NGIRCd_ConfFile, Line, "PAM"); } #endif } @@ -920,10 +941,6 @@ CheckLegacyNoOption(const char *Var, const char *Arg) Conf_PAM = !Check_ArgIsTrue(Arg); return true; } - if(strcasecmp(Var, "NoZeroConf") == 0) { - Conf_ZeroConf = !Check_ArgIsTrue(Arg); - return true; - } return false; } @@ -958,6 +975,18 @@ Handle_GLOBAL( int Line, char *Var, char *Arg ) Config_Error_TooLong( Line, Var ); return; } + if( strcasecmp( Var, "CloakHost" ) == 0 ) { + /* Client hostname */ + len = strlcpy( Conf_CloakHost, Arg, sizeof( Conf_CloakHost )); + if (len >= sizeof( Conf_CloakHost )) + Config_Error_TooLong( Line, Var ); + return; + } + if( strcasecmp( Var, "CloakUserToNick" ) == 0 ) { + /* Use client nick name as user name */ + Conf_CloakUserToNick = Check_ArgIsTrue( Arg ); + return; + } if( strcasecmp( Var, "Info" ) == 0 ) { /* Info text of server */ len = strlcpy( Conf_ServerInfo, Arg, sizeof( Conf_ServerInfo )); @@ -1009,7 +1038,6 @@ Handle_GLOBAL( int Line, char *Var, char *Arg ) len = strlcpy( Conf_MotdFile, Arg, sizeof( Conf_MotdFile )); if (len >= sizeof( Conf_MotdFile )) Config_Error_TooLong( Line, Var ); - Read_Motd(Arg); return; } if( strcasecmp( Var, "MotdPhrase" ) == 0 ) { @@ -1046,11 +1074,9 @@ Handle_GLOBAL( int Line, char *Var, char *Arg ) pwd = getpwnam( Arg ); if( pwd ) Conf_UID = pwd->pw_uid; else { -#ifdef HAVE_ISDIGIT - if( ! isdigit( (int)*Arg )) Config_Error_NaN( Line, Var ); - else -#endif Conf_UID = (unsigned int)atoi( Arg ); + if (!Conf_UID && strcmp(Arg, "0")) + Config_Error_NaN(Line, Var); } return; } @@ -1059,11 +1085,9 @@ Handle_GLOBAL( int Line, char *Var, char *Arg ) grp = getgrnam( Arg ); if( grp ) Conf_GID = grp->gr_gid; else { -#ifdef HAVE_ISDIGIT - if( ! isdigit( (int)*Arg )) Config_Error_NaN( Line, Var ); - else -#endif - Conf_GID = (unsigned int)atoi( Arg ); + Conf_GID = (unsigned int)atoi(Arg); + if (!Conf_GID && strcmp(Arg, "0")) + Config_Error_NaN( Line, Var ); } return; } @@ -1105,31 +1129,12 @@ Handle_GLOBAL( int Line, char *Var, char *Arg ) if (CheckLegacyNoOption(Var, Arg)) { Config_Error(LOG_WARNING, "%s, line %d: \"No\"-Prefix has been removed, use " - "\"%s = %s\" instead", + "\"%s = %s\" in [FEATURES] section instead", NGIRCd_ConfFile, Line, NoNo(Var), InvertArg(Arg)); if (strcasecmp(Var, "NoIdent") == 0) WarnIdent(Line); - return; - } - if( strcasecmp( Var, "DNS" ) == 0 ) { - /* do reverse dns lookups when clients connect? */ - Conf_DNS = Check_ArgIsTrue( Arg ); - return; - } - if (strcasecmp(Var, "Ident") == 0) { - /* do IDENT lookups when clients connect? */ - Conf_Ident = Check_ArgIsTrue(Arg); - WarnIdent(Line); - return; - } - if(strcasecmp(Var, "PAM") == 0) { - /* use PAM library to authenticate users */ - Conf_PAM = Check_ArgIsTrue(Arg); - return; - } - if(strcasecmp(Var, "ZeroConf") == 0) { - /* register services using ZeroConf */ - Conf_ZeroConf = Check_ArgIsTrue(Arg); + else if (strcasecmp(Var, "NoPam") == 0) + WarnPAM(Line); return; } #ifdef WANT_IPV6 @@ -1163,29 +1168,23 @@ Handle_GLOBAL( int Line, char *Var, char *Arg ) } if( strcasecmp( Var, "MaxConnections" ) == 0 ) { /* Maximum number of connections. 0 -> "no limit". */ -#ifdef HAVE_ISDIGIT - if( ! isdigit( (int)*Arg )) Config_Error_NaN( Line, Var); - else -#endif Conf_MaxConnections = atol( Arg ); + if (!Conf_MaxConnections && strcmp(Arg, "0")) + Config_Error_NaN(Line, Var); return; } if( strcasecmp( Var, "MaxConnectionsIP" ) == 0 ) { /* Maximum number of simultaneous connections from one IP. 0 -> "no limit" */ -#ifdef HAVE_ISDIGIT - if( ! isdigit( (int)*Arg )) Config_Error_NaN( Line, Var ); - else -#endif Conf_MaxConnectionsIP = atoi( Arg ); + if (!Conf_MaxConnectionsIP && strcmp(Arg, "0")) + Config_Error_NaN(Line, Var); return; } if( strcasecmp( Var, "MaxJoins" ) == 0 ) { /* Maximum number of channels a user can join. 0 -> "no limit". */ -#ifdef HAVE_ISDIGIT - if( ! isdigit( (int)*Arg )) Config_Error_NaN( Line, Var ); - else -#endif Conf_MaxJoins = atoi( Arg ); + if (!Conf_MaxJoins && strcmp(Arg, "0")) + Config_Error_NaN(Line, Var); return; } if( strcasecmp( Var, "MaxNickLength" ) == 0 ) { @@ -1256,6 +1255,32 @@ Handle_GLOBAL( int Line, char *Var, char *Arg ) } /* Handle_GLOBAL */ +static void +Handle_FEATURES(int Line, char *Var, char *Arg) +{ + assert( Line > 0 ); + assert( Var != NULL ); + assert( Arg != NULL ); + + if( strcasecmp( Var, "DNS" ) == 0 ) { + /* do reverse dns lookups when clients connect? */ + Conf_DNS = Check_ArgIsTrue( Arg ); + return; + } + if (strcasecmp(Var, "Ident") == 0) { + /* do IDENT lookups when clients connect? */ + Conf_Ident = Check_ArgIsTrue(Arg); + WarnIdent(Line); + return; + } + if(strcasecmp(Var, "PAM") == 0) { + /* use PAM library to authenticate users */ + Conf_PAM = Check_ArgIsTrue(Arg); + WarnPAM(Line); + return; + } +} + static void Handle_OPERATOR( int Line, char *Var, char *Arg ) { @@ -1355,11 +1380,12 @@ Handle_SERVER( int Line, char *Var, char *Arg ) if( strcasecmp( Var, "Port" ) == 0 ) { /* Port to which this server should connect */ port = atol( Arg ); - if( port > 0 && port < 0xFFFF ) + if (port >= 0 && port < 0xFFFF) New_Server.port = (UINT16)port; else - Config_Error( LOG_ERR, "%s, line %d (section \"Server\"): Illegal port number %ld!", - NGIRCd_ConfFile, Line, port ); + Config_Error(LOG_ERR, + "%s, line %d (section \"Server\"): Illegal port number %ld!", + NGIRCd_ConfFile, Line, port ); return; } #ifdef SSL_SUPPORT @@ -1370,12 +1396,9 @@ Handle_SERVER( int Line, char *Var, char *Arg ) #endif if( strcasecmp( Var, "Group" ) == 0 ) { /* Server group */ -#ifdef HAVE_ISDIGIT - if( ! isdigit( (int)*Arg )) - Config_Error_NaN( Line, Var ); - else -#endif New_Server.group = atoi( Arg ); + if (!New_Server.group && strcmp(Arg, "0")) + Config_Error_NaN(Line, Var); return; } if( strcasecmp( Var, "Passive" ) == 0 ) { @@ -1463,7 +1486,7 @@ Handle_CHANNEL(int Line, char *Var, char *Arg) if( strcasecmp( Var, "MaxUsers" ) == 0 ) { /* maximum user limit, mode l */ chan->maxusers = (unsigned long) atol(Arg); - if (chan->maxusers == 0) + if (!chan->maxusers && strcmp(Arg, "0")) Config_Error_NaN(Line, Var); return; }