X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=ngircd-alex.git;a=blobdiff_plain;f=src%2Fngircd%2Fconf.c;h=d4410325c9d682bab1672858eeaf637ea1b911ce;hp=6974196df2623b4872412788141f324d0fdd3625;hb=f7567db01f1a9b1e0f0dbef0ee28438c8ece7892;hpb=f86083a05743a7b7a22f711e250ced1435f657a7 diff --git a/src/ngircd/conf.c b/src/ngircd/conf.c index 6974196d..d4410325 100644 --- a/src/ngircd/conf.c +++ b/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.21 2002/03/27 16:39:22 alex Exp $ + * $Id: conf.c,v 1.27 2002/05/30 16:52:21 alex Exp $ * * conf.h: Konfiguration des ngircd */ @@ -27,9 +27,11 @@ #include #include "ngircd.h" +#include "conn.h" #include "client.h" #include "defines.h" #include "log.h" +#include "resolve.h" #include "tool.h" #include "exp.h" @@ -39,18 +41,20 @@ LOCAL BOOLEAN Use_Log = TRUE; -LOCAL VOID Set_Defaults( VOID ); -LOCAL VOID Read_Config( VOID ); -LOCAL VOID Validate_Config( VOID ); +LOCAL VOID Set_Defaults PARAMS(( VOID )); +LOCAL VOID Read_Config PARAMS(( VOID )); +LOCAL VOID Validate_Config PARAMS(( 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 Handle_GLOBAL PARAMS(( INT Line, CHAR *Var, CHAR *Arg )); +LOCAL VOID Handle_OPERATOR PARAMS(( INT Line, CHAR *Var, CHAR *Arg )); +LOCAL VOID Handle_SERVER PARAMS(( INT Line, CHAR *Var, CHAR *Arg )); +LOCAL VOID Handle_CHANNEL PARAMS(( INT Line, CHAR *Var, CHAR *Arg )); -LOCAL VOID Config_Error( CONST INT Level, CONST CHAR *Format, ... ); +LOCAL VOID Config_Error PARAMS(( CONST INT Level, CONST CHAR *Format, ... )); -GLOBAL VOID Conf_Init( VOID ) +GLOBAL VOID +Conf_Init( VOID ) { Set_Defaults( ); Read_Config( ); @@ -58,11 +62,12 @@ GLOBAL VOID Conf_Init( VOID ) } /* Config_Init */ -GLOBAL INT Conf_Test( VOID ) +GLOBAL INT +Conf_Test( VOID ) { /* Konfiguration einlesen, ueberpruefen und ausgeben. */ - INT i; + UINT i; Use_Log = FALSE; Set_Defaults( ); @@ -87,10 +92,11 @@ GLOBAL INT Conf_Test( VOID ) for( i = 0; i < Conf_ListenPorts_Count; i++ ) { if( i != 0 ) printf( ", " ); - printf( "%d", Conf_ListenPorts[i] ); + printf( "%u", Conf_ListenPorts[i] ); } - if( Conf_ListenPorts_Count < 1 ) puts( ""); - else puts( "" ); + puts( "" ); + printf( " ServerUID = %ld\n", (INT32)Conf_UID ); + printf( " ServerGID = %ld\n", (INT32)Conf_GID ); printf( " PingTimeout = %d\n", Conf_PingTimeout ); printf( " PongTimeout = %d\n", Conf_PongTimeout ); printf( " ConnectRetry = %d\n", Conf_ConnectRetry ); @@ -98,6 +104,9 @@ GLOBAL INT Conf_Test( VOID ) for( i = 0; i < Conf_Oper_Count; i++ ) { + if( ! Conf_Oper[i].name[0] ) continue; + + /* gueltiger Operator-Block: ausgeben */ puts( "[OPERATOR]" ); printf( " Name = %s\n", Conf_Oper[i].name ); printf( " Password = %s\n", Conf_Oper[i].pwd ); @@ -106,6 +115,10 @@ GLOBAL INT Conf_Test( VOID ) for( i = 0; i < Conf_Server_Count; i++ ) { + if( ! Conf_Server[i].name[0] ) continue; + if( ! Conf_Server[i].host[0] ) continue; + + /* gueltiger Server-Block: ausgeben */ puts( "[SERVER]" ); printf( " Name = %s\n", Conf_Server[i].name ); printf( " Host = %s\n", Conf_Server[i].host ); @@ -114,28 +127,37 @@ GLOBAL INT Conf_Test( VOID ) printf( " Group = %d\n", Conf_Server[i].group ); puts( "" ); } + + for( i = 0; i < Conf_Channel_Count; i++ ) + { + if( ! Conf_Channel[i].name[0] ) continue; + + /* gueltiger Channel-Block: ausgeben */ + puts( "[CHANNEL]" ); + printf( " Name = %s\n", Conf_Channel[i].name ); + printf( " Modes = %s\n", Conf_Channel[i].modes ); + printf( " Topic = %s\n", Conf_Channel[i].topic ); + puts( "" ); + } return 0; } /* Conf_Test */ -GLOBAL VOID Conf_Exit( VOID ) -{ - /* ... */ -} /* Config_Exit */ - - -LOCAL VOID Set_Defaults( VOID ) +LOCAL VOID +Set_Defaults( VOID ) { /* Konfigurationsvariablen initialisieren, d.h. auf Default-Werte setzen. */ strcpy( Conf_ServerName, "" ); - strcpy( Conf_ServerInfo, PACKAGE" "VERSION ); + sprintf( Conf_ServerInfo, "%s %s", PACKAGE, VERSION ); strcpy( Conf_ServerPwd, "" ); strcpy( Conf_MotdFile, MOTD_FILE ); Conf_ListenPorts_Count = 0; + + Conf_UID = Conf_GID = 0; Conf_PingTimeout = 120; Conf_PongTimeout = 20; @@ -143,12 +165,13 @@ LOCAL VOID Set_Defaults( VOID ) Conf_ConnectRetry = 60; Conf_Oper_Count = 0; - Conf_Server_Count = 0; + Conf_Channel_Count = 0; } /* Set_Defaults */ -LOCAL VOID Read_Config( VOID ) +LOCAL VOID +Read_Config( VOID ) { /* Konfigurationsdatei einlesen. */ @@ -161,7 +184,7 @@ LOCAL VOID Read_Config( VOID ) { /* Keine Konfigurationsdatei gefunden */ Config_Error( LOG_ALERT, "Can't read configuration \"%s\": %s", NGIRCd_ConfFile, strerror( errno )); - Config_Error( LOG_ALERT, PACKAGE" exiting due to fatal errors!" ); + Config_Error( LOG_ALERT, "%s exiting due to fatal errors!", PACKAGE ); exit( 1 ); } @@ -211,6 +234,19 @@ LOCAL VOID Read_Config( VOID ) } continue; } + if( strcasecmp( section, "[CHANNEL]" ) == 0 ) + { + if( Conf_Channel_Count + 1 > MAX_DEFCHANNELS ) Config_Error( LOG_ERR, "Too many pre-defined channels configured." ); + else + { + /* neuen vordefinierten Channel initialisieren */ + strcpy( Conf_Channel[Conf_Channel_Count].name, "" ); + strcpy( Conf_Channel[Conf_Channel_Count].modes, "" ); + strcpy( Conf_Channel[Conf_Channel_Count].topic, "" ); + Conf_Channel_Count++; + } + continue; + } Config_Error( LOG_ERR, "%s, line %d: Unknown section \"%s\"!", NGIRCd_ConfFile, line, section ); section[0] = 0x1; } @@ -230,14 +266,23 @@ 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 if( strcasecmp( section, "[CHANNEL]" ) == 0 ) Handle_CHANNEL( line, var, arg ); else Config_Error( LOG_ERR, "%s, line %d: Variable \"%s\" outside section!", NGIRCd_ConfFile, line, var ); } fclose( fd ); + + /* Wenn kein Port definiert wurde, Port 6667 als Default benutzen */ + if( Conf_ListenPorts_Count < 1 ) + { + Conf_ListenPorts_Count = 1; + Conf_ListenPorts[0] = 6667; + } } /* Read_Config */ -GLOBAL VOID Handle_GLOBAL( INT Line, CHAR *Var, CHAR *Arg ) +LOCAL VOID +Handle_GLOBAL( INT Line, CHAR *Var, CHAR *Arg ) { CHAR *ptr; INT32 port; @@ -279,7 +324,7 @@ GLOBAL VOID Handle_GLOBAL( INT Line, CHAR *Var, CHAR *Arg ) 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; + if( port > 0 && port < 0xFFFF ) Conf_ListenPorts[Conf_ListenPorts_Count++] = (UINT)port; else Config_Error( LOG_ERR, "%s, line %d (section \"Global\"): Illegal port number %ld!", NGIRCd_ConfFile, Line, port ); } ptr = strtok( NULL, "," ); @@ -293,6 +338,18 @@ GLOBAL VOID Handle_GLOBAL( INT Line, CHAR *Var, CHAR *Arg ) Conf_MotdFile[FNAME_LEN - 1] = '\0'; return; } + if( strcasecmp( Var, "ServerUID" ) == 0 ) + { + /* UID, mit der der Daemon laufen soll */ + Conf_UID = (UINT)atoi( Arg ); + return; + } + if( strcasecmp( Var, "ServerGID" ) == 0 ) + { + /* GID, mit der der Daemon laufen soll */ + Conf_GID = (UINT)atoi( Arg ); + return; + } if( strcasecmp( Var, "PingTimeout" ) == 0 ) { /* PING-Timeout */ @@ -319,7 +376,8 @@ GLOBAL VOID Handle_GLOBAL( INT Line, CHAR *Var, CHAR *Arg ) } /* Handle_GLOBAL */ -GLOBAL VOID Handle_OPERATOR( INT Line, CHAR *Var, CHAR *Arg ) +LOCAL VOID +Handle_OPERATOR( INT Line, CHAR *Var, CHAR *Arg ) { assert( Line > 0 ); assert( Var != NULL ); @@ -345,7 +403,8 @@ GLOBAL VOID Handle_OPERATOR( INT Line, CHAR *Var, CHAR *Arg ) } /* Handle_OPERATOR */ -GLOBAL VOID Handle_SERVER( INT Line, CHAR *Var, CHAR *Arg ) +LOCAL VOID +Handle_SERVER( INT Line, CHAR *Var, CHAR *Arg ) { INT32 port; @@ -393,7 +452,41 @@ GLOBAL VOID Handle_SERVER( INT Line, CHAR *Var, CHAR *Arg ) } /* Handle_SERVER */ -LOCAL VOID Validate_Config( VOID ) +LOCAL VOID +Handle_CHANNEL( INT Line, CHAR *Var, CHAR *Arg ) +{ + assert( Line > 0 ); + assert( Var != NULL ); + assert( Arg != NULL ); + + if( strcasecmp( Var, "Name" ) == 0 ) + { + /* Hostname des Servers */ + strncpy( Conf_Channel[Conf_Channel_Count - 1].name, Arg, CHANNEL_NAME_LEN - 1 ); + Conf_Channel[Conf_Channel_Count - 1].name[CHANNEL_NAME_LEN - 1] = '\0'; + return; + } + if( strcasecmp( Var, "Modes" ) == 0 ) + { + /* Name des Servers ("Nick") */ + strncpy( Conf_Channel[Conf_Channel_Count - 1].modes, Arg, CHANNEL_MODE_LEN - 1 ); + Conf_Channel[Conf_Channel_Count - 1].modes[CHANNEL_MODE_LEN - 1] = '\0'; + return; + } + if( strcasecmp( Var, "Topic" ) == 0 ) + { + /* Passwort des Servers */ + strncpy( Conf_Channel[Conf_Channel_Count - 1].topic, Arg, CHANNEL_TOPIC_LEN - 1 ); + Conf_Channel[Conf_Channel_Count - 1].topic[CHANNEL_TOPIC_LEN - 1] = '\0'; + return; + } + + Config_Error( LOG_ERR, "%s, line %d (section \"Channel\"): Unknown variable \"%s\"!", NGIRCd_ConfFile, Line, Var ); +} /* Handle_CHANNEL */ + + +LOCAL VOID +Validate_Config( VOID ) { /* Konfiguration ueberpruefen */ @@ -401,13 +494,20 @@ LOCAL VOID Validate_Config( VOID ) { /* Kein Servername konfiguriert */ Config_Error( LOG_ALERT, "No server name configured in \"%s\"!", NGIRCd_ConfFile ); - Config_Error( LOG_ALERT, PACKAGE" exiting due to fatal errors!" ); + Config_Error( LOG_ALERT, "%s exiting due to fatal errors!", PACKAGE ); exit( 1 ); } } /* Validate_Config */ +#ifdef PROTOTYPES LOCAL VOID Config_Error( CONST INT Level, CONST CHAR *Format, ... ) +#else +LOCAL VOID Config_Error( Level, Format, va_alist ) +CONST INT Level; +CONST CHAR *Format; +va_dcl +#endif { /* Fehler! Auf Console und/oder ins Log schreiben */ @@ -417,7 +517,11 @@ LOCAL VOID Config_Error( CONST INT Level, CONST CHAR *Format, ... ) assert( Format != NULL ); /* String mit variablen Argumenten zusammenbauen ... */ +#ifdef PROTOTYPES va_start( ap, Format ); +#else + va_start( ap ); +#endif vsnprintf( msg, MAX_LOG_MSG_LEN, Format, ap ); va_end( ap );