Commit Diff


commit - bcc5138518ccefbad2ca63941d6fef32c8d15fd2
commit + f86083a05743a7b7a22f711e250ced1435f657a7
blob - 9db611a1876975a6e0010f4c4421adad3f90c97b
blob + 6974196df2623b4872412788141f324d0fdd3625
--- src/ngircd/conf.c
+++ src/ngircd/conf.c
@@ -9,7 +9,7 @@
  * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
  * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
  *
- * $Id: conf.c,v 1.20 2002/03/25 19:11:01 alex Exp $
+ * $Id: conf.c,v 1.21 2002/03/27 16:39:22 alex Exp $
  *
  * conf.h: Konfiguration des ngircd
  */
@@ -20,10 +20,13 @@
 #include "imp.h"
 #include <assert.h>
 #include <errno.h>
+#include <stdarg.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <unistd.h>
 
+#include "ngircd.h"
 #include "client.h"
 #include "defines.h"
 #include "log.h"
@@ -33,22 +36,99 @@
 #include "conf.h"
 
 
+LOCAL BOOLEAN Use_Log = TRUE;
+
+
+LOCAL VOID Set_Defaults( VOID );
 LOCAL VOID Read_Config( VOID );
+LOCAL VOID Validate_Config( VOID );
 
 GLOBAL VOID Handle_GLOBAL( INT Line, CHAR *Var, CHAR *Arg );
 GLOBAL VOID Handle_OPERATOR( INT Line, CHAR *Var, CHAR *Arg );
 GLOBAL VOID Handle_SERVER( INT Line, CHAR *Var, CHAR *Arg );
 
-LOCAL VOID Validate_Config( VOID );
+LOCAL VOID Config_Error( CONST INT Level, CONST CHAR *Format, ... );
 
 
 GLOBAL VOID Conf_Init( VOID )
 {
-	/* Konfigurationsvariablen initialisieren: zunaechst Default-
-	 * Werte setzen, dann Konfigurationsdtaei einlesen. */
+	Set_Defaults( );
+	Read_Config( );
+	Validate_Config( );
+} /* Config_Init */
 
-	strcpy( Conf_File, CONFIG_FILE );
 
+GLOBAL INT Conf_Test( VOID )
+{
+	/* Konfiguration einlesen, ueberpruefen und ausgeben. */
+
+	INT i;
+
+	Use_Log = FALSE;
+	Set_Defaults( );
+
+	printf( "Using \"%s\" as configuration file ...\n", NGIRCd_ConfFile );
+	Read_Config( );
+
+	/* Wenn stdin ein ein TTY ist: auf Taste warten */
+	if( isatty( fileno( stdout )))
+	{
+		puts( "OK, press enter to see a dump of your service configuration ..." );
+		getchar( );
+	}
+	else puts( "Ok, dump of your server configuration follows:\n" );
+
+	puts( "[GLOBAL]" );
+	printf( "  ServerName = %s\n", Conf_ServerName );
+	printf( "  ServerInfo = %s\n", Conf_ServerInfo );
+	printf( "  ServerPwd = %s\n", Conf_ServerPwd );
+	printf( "  MotdFile = %s\n", Conf_MotdFile );
+	printf( "  ListenPorts = " );
+	for( i = 0; i < Conf_ListenPorts_Count; i++ )
+	{
+		if( i != 0 ) printf( ", " );
+		printf( "%d", Conf_ListenPorts[i] );
+	}
+	if( Conf_ListenPorts_Count < 1 ) puts( "<none>");
+	else puts( "" );
+	printf( "  PingTimeout = %d\n", Conf_PingTimeout );
+	printf( "  PongTimeout = %d\n", Conf_PongTimeout );
+	printf( "  ConnectRetry = %d\n", Conf_ConnectRetry );
+	puts( "" );
+
+	for( i = 0; i < Conf_Oper_Count; i++ )
+	{
+		puts( "[OPERATOR]" );
+		printf( "  Name = %s\n", Conf_Oper[i].name );
+		printf( "  Password = %s\n", Conf_Oper[i].pwd );
+		puts( "" );
+	}
+
+	for( i = 0; i < Conf_Server_Count; i++ )
+	{
+		puts( "[SERVER]" );
+		printf( "  Name = %s\n", Conf_Server[i].name );
+		printf( "  Host = %s\n", Conf_Server[i].host );
+		printf( "  Port = %d\n", Conf_Server[i].port );
+		printf( "  Password = %s\n", Conf_Server[i].pwd );
+		printf( "  Group = %d\n", Conf_Server[i].group );
+		puts( "" );
+	}
+	
+	return 0;
+} /* Conf_Test */
+
+
+GLOBAL VOID Conf_Exit( VOID )
+{
+	/* ... */
+} /* Config_Exit */
+
+
+LOCAL VOID Set_Defaults( VOID )
+{
+	/* Konfigurationsvariablen initialisieren, d.h. auf Default-Werte setzen. */
+
 	strcpy( Conf_ServerName, "" );
 	strcpy( Conf_ServerInfo, PACKAGE" "VERSION );
 	strcpy( Conf_ServerPwd, "" );
@@ -65,19 +145,9 @@ GLOBAL VOID Conf_Init( VOID )
 	Conf_Oper_Count = 0;
 
 	Conf_Server_Count = 0;
+} /* Set_Defaults */
 
-	/* Konfigurationsdatei einlesen und validieren */
-	Read_Config( );
-	Validate_Config( );
-} /* Config_Init */
 
-
-GLOBAL VOID Conf_Exit( VOID )
-{
-	/* ... */
-} /* Config_Exit */
-
-
 LOCAL VOID Read_Config( VOID )
 {
 	/* Konfigurationsdatei einlesen. */
@@ -86,12 +156,12 @@ LOCAL VOID Read_Config( VOID )
 	INT line;
 	FILE *fd;
 
-	fd = fopen( Conf_File, "r" );
+	fd = fopen( NGIRCd_ConfFile, "r" );
 	if( ! fd )
 	{
 		/* Keine Konfigurationsdatei gefunden */
-		Log( LOG_ALERT, "Can't read configuration \"%s\": %s", Conf_File, strerror( errno ));
-		Log( LOG_ALERT, PACKAGE" exiting due to fatal errors!" );
+		Config_Error( LOG_ALERT, "Can't read configuration \"%s\": %s", NGIRCd_ConfFile, strerror( errno ));
+		Config_Error( LOG_ALERT, PACKAGE" exiting due to fatal errors!" );
 		exit( 1 );
 	}
 
@@ -113,7 +183,7 @@ LOCAL VOID Read_Config( VOID )
 			if( strcasecmp( section, "[GLOBAL]" ) == 0 ) continue;
 			if( strcasecmp( section, "[OPERATOR]" ) == 0 )
 			{
-				if( Conf_Oper_Count + 1 > MAX_OPERATORS ) Log( LOG_ERR, "Too many operators configured." );
+				if( Conf_Oper_Count + 1 > MAX_OPERATORS ) Config_Error( LOG_ERR, "Too many operators configured." );
 				else
 				{
 					/* neuen Operator initialisieren */
@@ -125,7 +195,7 @@ LOCAL VOID Read_Config( VOID )
 			}
 			if( strcasecmp( section, "[SERVER]" ) == 0 )
 			{
-				if( Conf_Server_Count + 1 > MAX_SERVERS ) Log( LOG_ERR, "Too many servers configured." );
+				if( Conf_Server_Count + 1 > MAX_SERVERS ) Config_Error( LOG_ERR, "Too many servers configured." );
 				else
 				{
 					/* neuen Server ("Peer") initialisieren */
@@ -141,7 +211,7 @@ LOCAL VOID Read_Config( VOID )
 				}
 				continue;
 			}
-			Log( LOG_ERR, "%s, line %d: Unknown section \"%s\"!", Conf_File, line, section );
+			Config_Error( LOG_ERR, "%s, line %d: Unknown section \"%s\"!", NGIRCd_ConfFile, line, section );
 			section[0] = 0x1;
 		}
 		if( section[0] == 0x1 ) continue;
@@ -150,7 +220,7 @@ LOCAL VOID Read_Config( VOID )
 		ptr = strchr( str, '=' );
 		if( ! ptr )
 		{
-			Log( LOG_ERR, "%s, line %d: Syntax error!", Conf_File, line );
+			Config_Error( LOG_ERR, "%s, line %d: Syntax error!", NGIRCd_ConfFile, line );
 			continue;
 		}
 		*ptr = '\0';
@@ -160,7 +230,7 @@ LOCAL VOID Read_Config( VOID )
 		if( strcasecmp( section, "[GLOBAL]" ) == 0 ) Handle_GLOBAL( 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 Log( LOG_ERR, "%s, line %d: Variable \"%s\" outside section!", Conf_File, line, var );
+		else Config_Error( LOG_ERR, "%s, line %d: Variable \"%s\" outside section!", NGIRCd_ConfFile, line, var );
 	}
 	
 	fclose( fd );
@@ -206,11 +276,11 @@ GLOBAL VOID Handle_GLOBAL( INT Line, CHAR *Var, CHAR *
 		{
 			ngt_TrimStr( ptr );
 			port = atol( ptr );
-			if( Conf_ListenPorts_Count + 1 > MAX_LISTEN_PORTS ) Log( LOG_ERR, "Too many listen ports configured. Port %ld ignored.", port );
+			if( Conf_ListenPorts_Count + 1 > MAX_LISTEN_PORTS ) Config_Error( LOG_ERR, "Too many listen ports configured. Port %ld ignored.", port );
 			else
 			{
 				if( port > 0 && port < 0xFFFF ) Conf_ListenPorts[Conf_ListenPorts_Count++] = (INT)port;
-				else Log( LOG_ERR, "%s, line %d (section \"Global\"): Illegal port number %ld!", Conf_File, Line, port );
+				else Config_Error( LOG_ERR, "%s, line %d (section \"Global\"): Illegal port number %ld!", NGIRCd_ConfFile, Line, port );
 			}
 			ptr = strtok( NULL, "," );
 		}
@@ -245,7 +315,7 @@ GLOBAL VOID Handle_GLOBAL( INT Line, CHAR *Var, CHAR *
 		return;
 	}
 		
-	Log( LOG_ERR, "%s, line %d (section \"Global\"): Unknown variable \"%s\"!", Conf_File, Line, Var );
+	Config_Error( LOG_ERR, "%s, line %d (section \"Global\"): Unknown variable \"%s\"!", NGIRCd_ConfFile, Line, Var );
 } /* Handle_GLOBAL */
 
 
@@ -271,7 +341,7 @@ GLOBAL VOID Handle_OPERATOR( INT Line, CHAR *Var, CHAR
 		return;
 	}
 	
-	Log( LOG_ERR, "%s, line %d (section \"Operator\"): Unknown variable \"%s\"!", Conf_File, Line, Var );
+	Config_Error( LOG_ERR, "%s, line %d (section \"Operator\"): Unknown variable \"%s\"!", NGIRCd_ConfFile, Line, Var );
 } /* Handle_OPERATOR */
 
 
@@ -309,7 +379,7 @@ GLOBAL VOID Handle_SERVER( INT Line, CHAR *Var, CHAR *
 		/* Port, zu dem Verbunden werden soll */
 		port = atol( Arg );
 		if( port > 0 && port < 0xFFFF ) Conf_Server[Conf_Server_Count - 1].port = (INT)port;
-		else Log( LOG_ERR, "%s, line %d (section \"Server\"): Illegal port number %ld!", Conf_File, Line, port );
+		else Config_Error( LOG_ERR, "%s, line %d (section \"Server\"): Illegal port number %ld!", NGIRCd_ConfFile, Line, port );
 		return;
 	}
 	if( strcasecmp( Var, "Group" ) == 0 )
@@ -319,7 +389,7 @@ GLOBAL VOID Handle_SERVER( INT Line, CHAR *Var, CHAR *
 		return;
 	}
 	
-	Log( LOG_ERR, "%s, line %d (section \"Server\"): Unknown variable \"%s\"!", Conf_File, Line, Var );
+	Config_Error( LOG_ERR, "%s, line %d (section \"Server\"): Unknown variable \"%s\"!", NGIRCd_ConfFile, Line, Var );
 } /* Handle_SERVER */
 
 
@@ -330,10 +400,33 @@ LOCAL VOID Validate_Config( VOID )
 	if( ! Conf_ServerName[0] )
 	{
 		/* Kein Servername konfiguriert */
-		Log( LOG_ALERT, "No server name configured in \"%s\"!", Conf_File );
-		Log( LOG_ALERT, PACKAGE" exiting due to fatal errors!" );
+		Config_Error( LOG_ALERT, "No server name configured in \"%s\"!", NGIRCd_ConfFile );
+		Config_Error( LOG_ALERT, PACKAGE" exiting due to fatal errors!" );
 		exit( 1 );
 	}
 } /* Validate_Config */
 
+
+LOCAL VOID Config_Error( CONST INT Level, CONST CHAR *Format, ... )
+{
+	/* Fehler! Auf Console und/oder ins Log schreiben */
+
+	CHAR msg[MAX_LOG_MSG_LEN];
+	va_list ap;
+
+	assert( Format != NULL );
+
+	/* String mit variablen Argumenten zusammenbauen ... */
+	va_start( ap, Format );
+	vsnprintf( msg, MAX_LOG_MSG_LEN, Format, ap );
+	va_end( ap );
+
+	/* Im "normalen Betrieb" soll der Log-Mechanismus des ngIRCd verwendet
+	 * werden, beim Testen der Konfiguration jedoch nicht, hier sollen alle
+	 * Meldungen direkt auf die Konsole ausgegeben werden: */
+	if( Use_Log ) Log( Level, msg );
+	else puts( msg );
+} /* Config_Error */
+
+
 /* -eof- */
blob - 989dd742f912dac3cc39bd3953cd08043dbc909e
blob + a80ed64d9ca16b84ae9ca829b4ec899b9d9fc90e
--- src/ngircd/conf.h
+++ src/ngircd/conf.h
@@ -9,7 +9,7 @@
  * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
  * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
  *
- * $Id: conf.h,v 1.13 2002/03/12 14:37:52 alex Exp $
+ * $Id: conf.h,v 1.14 2002/03/27 16:39:22 alex Exp $
  *
  * conf.h: Konfiguration des ngircd (Header)
  */
@@ -43,9 +43,6 @@ typedef struct _Conf_Server
 } CONF_SERVER;
 
 
-/* Konfigurationsdatei */
-GLOBAL CHAR Conf_File[FNAME_LEN];
-
 /* Name ("Nick") des Servers */
 GLOBAL CHAR Conf_ServerName[CLIENT_ID_LEN];
 
@@ -79,6 +76,7 @@ GLOBAL INT Conf_Server_Count;
 
 
 GLOBAL VOID Conf_Init( VOID );
+GLOBAL INT Conf_Test( VOID );
 GLOBAL VOID Conf_Exit( VOID );