X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fngircd%2Fconf.c;h=40859888d217b19eb1bcb6e86853d3027b4ec593;hb=c7b55aa6f45b75b52fb67419b7ca5af3940016a4;hp=73d1cf49519a183070882b299edfc8c40097948b;hpb=040f5422f2c8262ab19832f1e9d0e269afad8ec1;p=ngircd.git diff --git a/src/ngircd/conf.c b/src/ngircd/conf.c index 73d1cf49..40859888 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.24 2002/05/21 00:10:16 alex Exp $ + * $Id: conf.c,v 1.33 2002/10/09 16:53:02 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,19 +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 ); -GLOBAL VOID Handle_CHANNEL( 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( ); @@ -59,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. */ - UINT i; + INT i; Use_Log = FALSE; Set_Defaults( ); @@ -83,6 +87,9 @@ GLOBAL INT Conf_Test( VOID ) printf( " ServerName = %s\n", Conf_ServerName ); printf( " ServerInfo = %s\n", Conf_ServerInfo ); printf( " ServerPwd = %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( " ListenPorts = " ); for( i = 0; i < Conf_ListenPorts_Count; i++ ) @@ -91,15 +98,19 @@ GLOBAL INT Conf_Test( VOID ) printf( "%u", Conf_ListenPorts[i] ); } puts( "" ); - printf( " ServerUID = %ld\n", (INT32)Conf_UID ); - printf( " ServerGID = %ld\n", (INT32)Conf_GID ); + printf( " ServerUID = %ld\n", (LONG)Conf_UID ); + printf( " ServerGID = %ld\n", (LONG)Conf_GID ); printf( " PingTimeout = %d\n", Conf_PingTimeout ); printf( " PongTimeout = %d\n", Conf_PongTimeout ); printf( " ConnectRetry = %d\n", Conf_ConnectRetry ); + printf( " OperCanUseMode = %s\n", Conf_OperCanMode == TRUE ? "yes" : "no" ); puts( "" ); 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 ); @@ -108,6 +119,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 ); @@ -119,6 +134,9 @@ GLOBAL INT Conf_Test( VOID ) 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 ); @@ -130,20 +148,19 @@ GLOBAL INT Conf_Test( VOID ) } /* 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_ServerAdmin1, "" ); + strcpy( Conf_ServerAdmin2, "" ); + strcpy( Conf_ServerAdminMail, "" ); + strcpy( Conf_MotdFile, MOTD_FILE ); Conf_ListenPorts_Count = 0; @@ -158,10 +175,13 @@ LOCAL VOID Set_Defaults( VOID ) Conf_Oper_Count = 0; Conf_Server_Count = 0; Conf_Channel_Count = 0; + + Conf_OperCanMode = FALSE; } /* Set_Defaults */ -LOCAL VOID Read_Config( VOID ) +LOCAL VOID +Read_Config( VOID ) { /* Konfigurationsdatei einlesen. */ @@ -174,7 +194,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 ); } @@ -271,10 +291,11 @@ LOCAL VOID Read_Config( VOID ) } /* 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; + LONG port; assert( Line > 0 ); assert( Var != NULL ); @@ -301,6 +322,27 @@ GLOBAL VOID Handle_GLOBAL( INT Line, CHAR *Var, CHAR *Arg ) Conf_ServerPwd[CLIENT_PASS_LEN - 1] = '\0'; return; } + if( strcasecmp( Var, "AdminInfo1" ) == 0 ) + { + /* Server-Info-Text */ + strncpy( Conf_ServerAdmin1, Arg, CLIENT_INFO_LEN - 1 ); + Conf_ServerAdmin1[CLIENT_INFO_LEN - 1] = '\0'; + return; + } + if( strcasecmp( Var, "AdminInfo2" ) == 0 ) + { + /* Server-Info-Text */ + strncpy( Conf_ServerAdmin2, Arg, CLIENT_INFO_LEN - 1 ); + Conf_ServerAdmin2[CLIENT_INFO_LEN - 1] = '\0'; + return; + } + if( strcasecmp( Var, "AdminEMail" ) == 0 ) + { + /* Server-Info-Text */ + strncpy( Conf_ServerAdminMail, Arg, CLIENT_INFO_LEN - 1 ); + Conf_ServerAdminMail[CLIENT_INFO_LEN - 1] = '\0'; + return; + } if( strcasecmp( Var, "Ports" ) == 0 ) { /* Ports, durch "," getrennt, auf denen der Server @@ -360,12 +402,22 @@ GLOBAL VOID Handle_GLOBAL( INT Line, CHAR *Var, CHAR *Arg ) if(( Conf_ConnectRetry ) < 5 ) Conf_ConnectRetry = 5; return; } + if( strcasecmp( Var, "OperCanUseMode" ) == 0 ) + { + /* Koennen IRC-Operatoren immer MODE benutzen? */ + if( strcasecmp( Arg, "yes" ) == 0 ) Conf_OperCanMode = TRUE; + else if( strcasecmp( Arg, "true" ) == 0 ) Conf_OperCanMode = TRUE; + else if( atoi( Arg ) != 0 ) Conf_OperCanMode = TRUE; + else Conf_OperCanMode = FALSE; + return; + } Config_Error( LOG_ERR, "%s, line %d (section \"Global\"): Unknown variable \"%s\"!", NGIRCd_ConfFile, Line, Var ); } /* 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 ); @@ -375,8 +427,8 @@ GLOBAL VOID Handle_OPERATOR( INT Line, CHAR *Var, CHAR *Arg ) if( strcasecmp( Var, "Name" ) == 0 ) { /* Name des IRC Operator */ - strncpy( Conf_Oper[Conf_Oper_Count - 1].name, Arg, CLIENT_ID_LEN - 1 ); - Conf_Oper[Conf_Oper_Count - 1].name[CLIENT_ID_LEN - 1] = '\0'; + strncpy( Conf_Oper[Conf_Oper_Count - 1].name, Arg, CLIENT_PASS_LEN - 1 ); + Conf_Oper[Conf_Oper_Count - 1].name[CLIENT_PASS_LEN - 1] = '\0'; return; } if( strcasecmp( Var, "Password" ) == 0 ) @@ -391,9 +443,10 @@ 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; + LONG port; assert( Line > 0 ); assert( Var != NULL ); @@ -439,7 +492,8 @@ GLOBAL VOID Handle_SERVER( INT Line, CHAR *Var, CHAR *Arg ) } /* Handle_SERVER */ -GLOBAL VOID Handle_CHANNEL( INT Line, CHAR *Var, CHAR *Arg ) +LOCAL VOID +Handle_CHANNEL( INT Line, CHAR *Var, CHAR *Arg ) { assert( Line > 0 ); assert( Var != NULL ); @@ -471,21 +525,45 @@ GLOBAL VOID Handle_CHANNEL( INT Line, CHAR *Var, CHAR *Arg ) } /* Handle_CHANNEL */ -LOCAL VOID Validate_Config( VOID ) +LOCAL VOID +Validate_Config( VOID ) { /* Konfiguration ueberpruefen */ if( ! Conf_ServerName[0] ) { /* 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, "No server name configured in \"%s\" ('ServerName')!", NGIRCd_ConfFile ); + Config_Error( LOG_ALERT, "%s exiting due to fatal errors!", PACKAGE ); exit( 1 ); } + +#ifdef STRICT_RFC + if( ! ConfAdminMail[0] ) + { + /* Keine Server-Information konfiguriert */ + Config_Error( LOG_ALERT, "No administrator email address configured in \"%s\" ('AdminEMail')!", NGIRCd_ConfFile ); + Config_Error( LOG_ALERT, "%s exiting due to fatal errors!", PACKAGE ); + exit( 1 ); + } +#endif + + if( ! Conf_ServerAdmin1[0] && ! Conf_ServerAdmin2[0] && ! Conf_ServerAdminMail[0] ) + { + /* Keine Server-Information konfiguriert */ + Log( LOG_WARNING, "No server information configured but required by RFC!" ); + } } /* 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 */ @@ -495,14 +573,18 @@ 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 ); /* 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 ); + if( Use_Log ) Log( Level, "%s", msg ); else puts( msg ); } /* Config_Error */