X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=ngircd-alex.git;a=blobdiff_plain;f=src%2Fngircd%2Fconf.c;h=12a84d696a24ad06f3a6059078a1590c6b969395;hp=aab8f068b11168fac0aaff7d582c9b9c491fdae2;hb=f86bbd718d4a439509c290b62722f4aa96c00abb;hpb=c23535bc96d1bfc367c054973e019350d041c180 diff --git a/src/ngircd/conf.c b/src/ngircd/conf.c index aab8f068..12a84d69 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.25 2002/05/22 11:14:36 alex Exp $ + * $Id: conf.c,v 1.39 2002/11/22 17:57:40 alex Exp $ * * conf.h: Konfiguration des ngircd */ @@ -25,11 +25,16 @@ #include #include #include +#include +#include +#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 +44,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 +65,14 @@ GLOBAL VOID Conf_Init( VOID ) } /* Config_Init */ -GLOBAL INT Conf_Test( VOID ) +GLOBAL INT +Conf_Test( VOID ) { /* Konfiguration einlesen, ueberpruefen und ausgeben. */ - UINT i; + struct passwd *pwd; + struct group *grp; + INT i; Use_Log = FALSE; Set_Defaults( ); @@ -83,19 +92,29 @@ 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 = " ); + printf( " Ports = " ); for( i = 0; i < Conf_ListenPorts_Count; i++ ) { if( i != 0 ) printf( ", " ); printf( "%u", Conf_ListenPorts[i] ); } puts( "" ); - printf( " ServerUID = %ld\n", (INT32)Conf_UID ); - printf( " ServerGID = %ld\n", (INT32)Conf_GID ); + pwd = getpwuid( Conf_UID ); + if( pwd ) printf( " ServerUID = %s\n", pwd->pw_name ); + else printf( " ServerUID = %ld\n", (LONG)Conf_UID ); + grp = getgrgid( Conf_GID ); + if( grp ) printf( " ServerGID = %s\n", grp->gr_name ); + else 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" ); + if( Conf_MaxConnections > 0 ) printf( " MaxConnections = %ld\n", Conf_MaxConnections ); + else printf( " MaxConnections = -1\n" ); puts( "" ); for( i = 0; i < Conf_Oper_Count; i++ ) @@ -119,7 +138,8 @@ GLOBAL INT Conf_Test( VOID ) 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( " MyPassword = %s\n", Conf_Server[i].pwd_in ); + printf( " PeerPassword = %s\n", Conf_Server[i].pwd_out ); printf( " Group = %d\n", Conf_Server[i].group ); puts( "" ); } @@ -140,20 +160,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; @@ -168,10 +187,15 @@ LOCAL VOID Set_Defaults( VOID ) Conf_Oper_Count = 0; Conf_Server_Count = 0; Conf_Channel_Count = 0; + + Conf_OperCanMode = FALSE; + + Conf_MaxConnections = 0; } /* Set_Defaults */ -LOCAL VOID Read_Config( VOID ) +LOCAL VOID +Read_Config( VOID ) { /* Konfigurationsdatei einlesen. */ @@ -184,10 +208,12 @@ 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 ); } + Config_Error( LOG_INFO, "Reading configuration from \"%s\" ...", NGIRCd_ConfFile ); + line = 0; strcpy( section, "" ); while( TRUE ) @@ -225,7 +251,8 @@ LOCAL VOID Read_Config( VOID ) strcpy( Conf_Server[Conf_Server_Count].host, "" ); strcpy( Conf_Server[Conf_Server_Count].ip, "" ); strcpy( Conf_Server[Conf_Server_Count].name, "" ); - strcpy( Conf_Server[Conf_Server_Count].pwd, "" ); + strcpy( Conf_Server[Conf_Server_Count].pwd_in, "" ); + strcpy( Conf_Server[Conf_Server_Count].pwd_out, "" ); Conf_Server[Conf_Server_Count].port = 0; Conf_Server[Conf_Server_Count].group = -1; Conf_Server[Conf_Server_Count].lasttry = time( NULL ) - Conf_ConnectRetry + STARTUP_DELAY; @@ -281,10 +308,13 @@ 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 ) { + struct passwd *pwd; + struct group *grp; CHAR *ptr; - INT32 port; + LONG port; assert( Line > 0 ); assert( Var != NULL ); @@ -311,6 +341,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 @@ -340,13 +391,17 @@ GLOBAL VOID Handle_GLOBAL( INT Line, CHAR *Var, CHAR *Arg ) if( strcasecmp( Var, "ServerUID" ) == 0 ) { /* UID, mit der der Daemon laufen soll */ - Conf_UID = (UINT)atoi( Arg ); + pwd = getpwnam( Arg ); + if( pwd ) Conf_UID = pwd->pw_uid; + else Conf_UID = (UINT)atoi( Arg ); return; } if( strcasecmp( Var, "ServerGID" ) == 0 ) { /* GID, mit der der Daemon laufen soll */ - Conf_GID = (UINT)atoi( Arg ); + grp = getgrnam( Arg ); + if( grp ) Conf_GID = grp->gr_gid; + else Conf_GID = (UINT)atoi( Arg ); return; } if( strcasecmp( Var, "PingTimeout" ) == 0 ) @@ -370,12 +425,29 @@ 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; + } + if( strcasecmp( Var, "MaxConnections" ) == 0 ) + { + /* Maximale Anzahl von Verbindungen. Werte <= 0 stehen + * fuer "kein Limit". */ + Conf_MaxConnections = atol( Arg ); + 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 ); @@ -385,8 +457,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 ) @@ -401,9 +473,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 ); @@ -423,11 +496,18 @@ GLOBAL VOID Handle_SERVER( INT Line, CHAR *Var, CHAR *Arg ) Conf_Server[Conf_Server_Count - 1].name[CLIENT_ID_LEN - 1] = '\0'; return; } - if( strcasecmp( Var, "Password" ) == 0 ) + if( strcasecmp( Var, "MyPassword" ) == 0 ) { - /* Passwort des Servers */ - strncpy( Conf_Server[Conf_Server_Count - 1].pwd, Arg, CLIENT_PASS_LEN - 1 ); - Conf_Server[Conf_Server_Count - 1].pwd[CLIENT_PASS_LEN - 1] = '\0'; + /* Passwort dieses Servers, welches empfangen werden muss */ + strncpy( Conf_Server[Conf_Server_Count - 1].pwd_in, Arg, CLIENT_PASS_LEN - 1 ); + Conf_Server[Conf_Server_Count - 1].pwd_in[CLIENT_PASS_LEN - 1] = '\0'; + return; + } + if( strcasecmp( Var, "PeerPassword" ) == 0 ) + { + /* Passwort des anderen Servers, welches gesendet werden muss */ + strncpy( Conf_Server[Conf_Server_Count - 1].pwd_out, Arg, CLIENT_PASS_LEN - 1 ); + Conf_Server[Conf_Server_Count - 1].pwd_out[CLIENT_PASS_LEN - 1] = '\0'; return; } if( strcasecmp( Var, "Port" ) == 0 ) @@ -449,7 +529,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 ); @@ -481,21 +562,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( ! Conf_ServerAdminMail[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 administrative 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 */ @@ -505,14 +610,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 */