X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fngircd%2Fconf.c;h=1ea1fe741ef3397c35a6d151c1bac575c4c1eec7;hb=7281b8dd4d917f8b7f7c36460b78b686427ce973;hp=9d6071e1e5c165c90a535b42450329a754e0dab3;hpb=0b91df05e0b85980292956973b339ecce31e28ed;p=ngircd-alex.git diff --git a/src/ngircd/conf.c b/src/ngircd/conf.c index 9d6071e1..1ea1fe74 100644 --- a/src/ngircd/conf.c +++ b/src/ngircd/conf.c @@ -14,7 +14,7 @@ #include "portab.h" -static char UNUSED id[] = "$Id: conf.c,v 1.56 2003/04/20 23:09:43 alex Exp $"; +static char UNUSED id[] = "$Id: conf.c,v 1.64 2004/05/07 11:19:21 alex Exp $"; #include "imp.h" #include @@ -23,6 +23,7 @@ static char UNUSED id[] = "$Id: conf.c,v 1.56 2003/04/20 23:09:43 alex Exp $"; #include #include #include +#include #include #include #include @@ -108,11 +109,13 @@ Conf_Test( VOID ) puts( "[GLOBAL]" ); printf( " ServerName = %s\n", Conf_ServerName ); printf( " ServerInfo = %s\n", Conf_ServerInfo ); - printf( " ServerPwd = %s\n", Conf_ServerPwd ); + printf( " Password = %s\n", Conf_ServerPwd ); printf( " AdminInfo1 = %s\n", Conf_ServerAdmin1 ); printf( " AdminInfo2 = %s\n", Conf_ServerAdmin2 ); printf( " AdminEMail = %s\n", Conf_ServerAdminMail ); printf( " MotdFile = %s\n", Conf_MotdFile ); + printf( " MotdPhrase = %s\n", Conf_MotdPhrase ); + printf( " ChrootDir= %s\n", Conf_Chroot ); printf( " Ports = " ); for( i = 0; i < Conf_ListenPorts_Count; i++ ) { @@ -120,6 +123,7 @@ Conf_Test( VOID ) printf( "%u", Conf_ListenPorts[i] ); } puts( "" ); + printf( " Listen = %s\n", Conf_ListenAddress ); pwd = getpwuid( Conf_UID ); if( pwd ) printf( " ServerUID = %s\n", pwd->pw_name ); else printf( " ServerUID = %ld\n", (LONG)Conf_UID ); @@ -132,6 +136,8 @@ Conf_Test( VOID ) printf( " OperCanUseMode = %s\n", Conf_OperCanMode == TRUE ? "yes" : "no" ); if( Conf_MaxConnections > 0 ) printf( " MaxConnections = %ld\n", Conf_MaxConnections ); else printf( " MaxConnections = -1\n" ); + if( Conf_MaxConnectionsIP > 0 ) printf( " MaxConnectionsIP = %d\n", Conf_MaxConnectionsIP ); + else printf( " MaxConnectionsIP = -1\n" ); if( Conf_MaxJoins > 0 ) printf( " MaxJoins = %d\n", Conf_MaxJoins ); else printf( " MaxJoins = -1\n" ); puts( "" ); @@ -230,9 +236,9 @@ GLOBAL INT Conf_GetServer( CONN_ID Idx ) { /* Get index of server in configuration structure */ - - INT i; - + + INT i = 0; + assert( Idx > NONE ); for( i = 0; i < MAX_SERVERS; i++ ) @@ -339,7 +345,12 @@ Set_Defaults( BOOLEAN InitServers ) strlcpy( Conf_MotdFile, SYSCONFDIR, sizeof( Conf_MotdFile )); strlcat( Conf_MotdFile, MOTD_FILE, sizeof( Conf_MotdFile )); + strlcpy( Conf_MotdPhrase, MOTD_PHRASE, sizeof( Conf_MotdPhrase )); + + strlcpy( Conf_Chroot, CHROOT_DIR, sizeof( Conf_Chroot )); + Conf_ListenPorts_Count = 0; + strcpy( Conf_ListenAddress, "" ); Conf_UID = Conf_GID = 0; @@ -354,6 +365,7 @@ Set_Defaults( BOOLEAN InitServers ) Conf_OperCanMode = FALSE; Conf_MaxConnections = -1; + Conf_MaxConnectionsIP = 5; Conf_MaxJoins = 10; /* Initialize server configuration structures */ @@ -607,6 +619,18 @@ Handle_GLOBAL( INT Line, CHAR *Var, CHAR *Arg ) if( strlcpy( Conf_MotdFile, Arg, sizeof( Conf_MotdFile )) >= sizeof( Conf_MotdFile )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"MotdFile\" too long!", NGIRCd_ConfFile, Line ); return; } + if( strcasecmp( Var, "MotdPhrase" ) == 0 ) + { + /* "Message of the day" phrase (instead of file) */ + if( strlcpy( Conf_MotdPhrase, Arg, sizeof( Conf_MotdPhrase )) >= sizeof( Conf_MotdPhrase )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"MotdPhrase\" too long!", NGIRCd_ConfFile, Line ); + return; + } + if( strcasecmp( Var, "ChrootDir" ) == 0 ) + { + /* directory for chroot() */ + if( strlcpy( Conf_Chroot, Arg, sizeof( Conf_Chroot )) >= sizeof( Conf_Chroot )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"ChrootDir\" too long!", NGIRCd_ConfFile, Line ); + return; + } if( strcasecmp( Var, "ServerUID" ) == 0 ) { /* UID the daemon should switch to */ @@ -615,7 +639,7 @@ Handle_GLOBAL( INT Line, CHAR *Var, CHAR *Arg ) else { #ifdef HAVE_ISDIGIT - if( ! isdigit( *Arg )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"ServerUID\" is not a number!", NGIRCd_ConfFile, Line ); + if( ! isdigit( (INT)*Arg )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"ServerUID\" is not a number!", NGIRCd_ConfFile, Line ); else #endif Conf_UID = (UINT)atoi( Arg ); @@ -630,7 +654,7 @@ Handle_GLOBAL( INT Line, CHAR *Var, CHAR *Arg ) else { #ifdef HAVE_ISDIGIT - if( ! isdigit( *Arg )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"ServerGID\" is not a number!", NGIRCd_ConfFile, Line ); + if( ! isdigit( (INT)*Arg )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"ServerGID\" is not a number!", NGIRCd_ConfFile, Line ); else #endif Conf_GID = (UINT)atoi( Arg ); @@ -683,22 +707,41 @@ Handle_GLOBAL( INT Line, CHAR *Var, CHAR *Arg ) { /* Maximum number of connections. Values <= 0 are equal to "no limit". */ #ifdef HAVE_ISDIGIT - if( ! isdigit( *Arg )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"MaxConnections\" is not a number!", NGIRCd_ConfFile, Line ); + if( ! isdigit( (INT)*Arg )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"MaxConnections\" is not a number!", NGIRCd_ConfFile, Line ); else #endif Conf_MaxConnections = atol( Arg ); return; } + if( strcasecmp( Var, "MaxConnectionsIP" ) == 0 ) + { + /* Maximum number of simoultanous connections from one IP. Values <= 0 are equal to "no limit". */ +#ifdef HAVE_ISDIGIT + if( ! isdigit( (INT)*Arg )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"MaxConnectionsIP\" is not a number!", NGIRCd_ConfFile, Line ); + else +#endif + Conf_MaxConnectionsIP = atoi( Arg ); + return; + } if( strcasecmp( Var, "MaxJoins" ) == 0 ) { /* Maximum number of channels a user can join. Values <= 0 are equal to "no limit". */ #ifdef HAVE_ISDIGIT - if( ! isdigit( *Arg )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"MaxJoins\" is not a number!", NGIRCd_ConfFile, Line ); + if( ! isdigit( (INT)*Arg )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"MaxJoins\" is not a number!", NGIRCd_ConfFile, Line ); else #endif Conf_MaxJoins = atoi( Arg ); return; } + if( strcasecmp( Var, "Listen" ) == 0 ) + { + /* IP-Address to bind sockets */ + if( strlcpy( Conf_ListenAddress, Arg, sizeof( Conf_ListenAddress )) >= sizeof( Conf_ListenAddress )) + { + Config_Error( LOG_WARNING, "%s, line %d: Value of \"Listen\" too long!", NGIRCd_ConfFile, Line ); + } + return; + } Config_Error( LOG_ERR, "%s, line %d (section \"Global\"): Unknown variable \"%s\"!", NGIRCd_ConfFile, Line, Var ); } /* Handle_GLOBAL */ @@ -777,7 +820,7 @@ Handle_SERVER( INT Line, CHAR *Var, CHAR *Arg ) { /* Server group */ #ifdef HAVE_ISDIGIT - if( ! isdigit( *Arg )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"Group\" is not a number!", NGIRCd_ConfFile, Line ); + if( ! isdigit( (INT)*Arg )) Config_Error( LOG_WARNING, "%s, line %d: Value of \"Group\" is not a number!", NGIRCd_ConfFile, Line ); else #endif New_Server.group = atoi( Arg ); @@ -830,7 +873,18 @@ Validate_Config( BOOLEAN Configtest ) if( ! Conf_ServerName[0] ) { /* No server name configured! */ - Config_Error( LOG_ALERT, "No server name configured in \"%s\" ('ServerName')!", NGIRCd_ConfFile ); + Config_Error( LOG_ALERT, "No server name configured in \"%s\" (section 'Global': 'Name')!", NGIRCd_ConfFile ); + if( ! Configtest ) + { + Config_Error( LOG_ALERT, "%s exiting due to fatal errors!", PACKAGE_NAME ); + exit( 1 ); + } + } + + if( Conf_ServerName[0] && ! strchr( Conf_ServerName, '.' )) + { + /* No dot in server name! */ + 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 );