mirror of
				https://github.com/osmarks/ngircd.git
				synced 2025-10-31 14:02:59 +00:00 
			
		
		
		
	- Unterstuetzung fuer die Konfigurationsdatei eingebaut.
This commit is contained in:
		| @@ -9,7 +9,7 @@ | ||||
|  * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste | ||||
|  * der an comBase beteiligten Autoren finden Sie in der Datei AUTHORS. | ||||
|  * | ||||
|  * $Id: client.c,v 1.12 2001/12/29 20:18:18 alex Exp $ | ||||
|  * $Id: client.c,v 1.13 2001/12/30 19:26:11 alex Exp $ | ||||
|  * | ||||
|  * client.c: Management aller Clients | ||||
|  * | ||||
| @@ -21,6 +21,9 @@ | ||||
|  * Server gewesen, so existiert eine entsprechende CONNECTION-Struktur. | ||||
|  * | ||||
|  * $Log: client.c,v $ | ||||
|  * Revision 1.13  2001/12/30 19:26:11  alex | ||||
|  * - Unterstuetzung fuer die Konfigurationsdatei eingebaut. | ||||
|  * | ||||
|  * Revision 1.12  2001/12/29 20:18:18  alex | ||||
|  * - neue Funktion Client_SetHostname(). | ||||
|  * | ||||
| @@ -75,6 +78,7 @@ | ||||
|  | ||||
| #include <imp.h> | ||||
| #include "channel.h" | ||||
| #include "conf.h" | ||||
| #include "conn.h" | ||||
| #include "irc.h" | ||||
| #include "log.h" | ||||
| @@ -98,6 +102,7 @@ GLOBAL VOID Client_Init( VOID ) | ||||
| 	if( ! This_Server ) | ||||
| 	{ | ||||
| 		Log( LOG_EMERG, "Can't allocate client structure for server! Going down." ); | ||||
| 		Log( LOG_ALERT, PACKAGE" exiting due to fatal errors!" ); | ||||
| 		exit( 1 ); | ||||
| 	} | ||||
|  | ||||
| @@ -111,7 +116,7 @@ GLOBAL VOID Client_Init( VOID ) | ||||
| 	h = gethostbyname( This_Server->host ); | ||||
| 	if( h ) strcpy( This_Server->host, h->h_name ); | ||||
|  | ||||
| 	strcpy( This_Server->nick, This_Server->host ); | ||||
| 	strcpy( This_Server->nick, Conf_ServerName ); | ||||
|  | ||||
| 	My_Clients = This_Server; | ||||
| } /* Client_Init */ | ||||
| @@ -264,7 +269,7 @@ GLOBAL CHAR *Client_GetID( CLIENT *Client ) | ||||
|  | ||||
| 	assert( Client != NULL ); | ||||
| 	 | ||||
| 	if( Client->type == CLIENT_SERVER ) return Client->host; | ||||
| 	if( Client->type == CLIENT_SERVER ) return Client->nick; | ||||
|  | ||||
| 	sprintf( GetID_Buffer, "%s!%s@%s", Client->nick, Client->user, Client->host ); | ||||
| 	return GetID_Buffer; | ||||
|   | ||||
| @@ -9,11 +9,14 @@ | ||||
|  * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste | ||||
|  * der an comBase beteiligten Autoren finden Sie in der Datei AUTHORS. | ||||
|  * | ||||
|  * $Id: conf.c,v 1.4 2001/12/26 22:48:53 alex Exp $ | ||||
|  * $Id: conf.c,v 1.5 2001/12/30 19:26:11 alex Exp $ | ||||
|  * | ||||
|  * conf.h: Konfiguration des ngircd | ||||
|  * | ||||
|  * $Log: conf.c,v $ | ||||
|  * Revision 1.5  2001/12/30 19:26:11  alex | ||||
|  * - Unterstuetzung fuer die Konfigurationsdatei eingebaut. | ||||
|  * | ||||
|  * Revision 1.4  2001/12/26 22:48:53  alex | ||||
|  * - MOTD-Datei ist nun konfigurierbar und wird gelesen. | ||||
|  * | ||||
| @@ -33,28 +36,44 @@ | ||||
|  | ||||
| #include <imp.h> | ||||
| #include <assert.h> | ||||
| #include <errno.h> | ||||
| #include <stdio.h> | ||||
| #include <string.h> | ||||
|  | ||||
| #include "client.h" | ||||
| #include "log.h" | ||||
| #include "tool.h" | ||||
|  | ||||
| #include <exp.h> | ||||
| #include "conf.h" | ||||
|  | ||||
|  | ||||
| #define MAX_LINE_LEN 246		/* max. Laenge einer Konfigurationszeile */ | ||||
|  | ||||
|  | ||||
| LOCAL VOID Read_Config( VOID ); | ||||
| LOCAL VOID Validate_Config( VOID ); | ||||
|  | ||||
|  | ||||
| GLOBAL VOID Conf_Init( VOID ) | ||||
| { | ||||
| 	/* Konfigurationsvariablen initialisieren: zunaechst Default- | ||||
| 	 * Werte setzen, dann Konfigurationsdtaei einlesen. */ | ||||
| 	 | ||||
|  | ||||
| 	strcpy( Conf_File, "/usr/local/etc/ngircd.conf" ); | ||||
|  | ||||
| 	strcpy( Conf_ServerName, "" ); | ||||
|  | ||||
| 	strcpy( Conf_MotdFile, "/usr/local/etc/ngircd.motd" ); | ||||
|  | ||||
| 	Conf_ListenPorts_Count = 0; | ||||
| 	 | ||||
| 	Conf_PingTimeout = 120; | ||||
| 	Conf_PongTimeout = 10; | ||||
|  | ||||
| 	strcpy( Conf_MotdFile, "/usr/local/etc/ngircd.motd" ); | ||||
|  | ||||
| 	/* Konfigurationsdatei einlesen */ | ||||
| 	/* Konfigurationsdatei einlesen und validieren */ | ||||
| 	Read_Config( ); | ||||
| 	Validate_Config( ); | ||||
| } /* Config_Init */ | ||||
|  | ||||
|  | ||||
| @@ -67,9 +86,108 @@ GLOBAL VOID Conf_Exit( VOID ) | ||||
| LOCAL VOID Read_Config( VOID ) | ||||
| { | ||||
| 	/* Konfigurationsdatei einlesen. */ | ||||
|  | ||||
| 	CHAR str[MAX_LINE_LEN], *var, *arg, *ptr; | ||||
| 	BOOLEAN ok; | ||||
| 	INT32 port; | ||||
| 	INT line; | ||||
| 	FILE *fd; | ||||
|  | ||||
| 	fd = fopen( Conf_File, "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!" ); | ||||
| 		exit( 1 ); | ||||
| 	} | ||||
|  | ||||
| 	line = 0; | ||||
| 	while( TRUE ) | ||||
| 	{ | ||||
| 		if( ! fgets( str, MAX_LINE_LEN, fd )) break; | ||||
| 		ngt_TrimStr( str ); | ||||
| 		line++; | ||||
|  | ||||
| 		/* Kommentarzeilen und leere Zeilen ueberspringen */ | ||||
| 		if( str[0] == ';' || str[0] == '#' || str[0] == '\0' ) continue; | ||||
|  | ||||
| 		ok = FALSE; | ||||
|  | ||||
| 		ptr = strchr( str, '=' ); | ||||
| 		if( ! ptr ) | ||||
| 		{ | ||||
| 			Log( LOG_ERR, "%s, line %d: Syntax error!", Conf_File, line ); | ||||
| 			continue; | ||||
| 		} | ||||
| 		*ptr = '\0'; | ||||
|  | ||||
| 		var = str; ngt_TrimStr( var ); | ||||
| 		arg = ptr + 1; ngt_TrimStr( arg ); | ||||
| 		 | ||||
| 		if( strcasecmp( str, "ServerName" ) == 0 ) | ||||
| 		{ | ||||
| 			/* Der Server-Name */ | ||||
| 			strncpy( Conf_ServerName, arg, CLIENT_ID_LEN ); | ||||
| 			Conf_ServerName[CLIENT_ID_LEN] = '\0'; | ||||
| 			ok = TRUE; | ||||
| 		} | ||||
| 		else if( strcasecmp( str, "ListenPorts" ) == 0 ) | ||||
| 		{ | ||||
| 			/* Ports, durch "," getrennt, auf denen der Server | ||||
| 			 * Verbindungen annehmen soll */ | ||||
| 			ptr = strtok( arg, "," ); | ||||
| 			while( ptr ) | ||||
| 			{ | ||||
| 				ngt_TrimStr( ptr ); | ||||
| 				port = atol( ptr ); | ||||
| 				if( Conf_ListenPorts_Count + 1 > LISTEN_PORTS )	Log( LOG_ERR, "Too many listen ports configured. Port %ld ignored.", port ); | ||||
| 				if( port > 0 && port < 0xFFFF ) Conf_ListenPorts[Conf_ListenPorts_Count++] = port; | ||||
| 				else Log( LOG_ERR, "Illegal port number: %ld. Ignored.", port ); | ||||
| 				ptr = strtok( NULL, "," ); | ||||
| 			} | ||||
| 			ok = TRUE; | ||||
| 		} | ||||
| 		else if( strcasecmp( str, "MotdFile" ) == 0 ) | ||||
| 		{ | ||||
| 			/* Datei mit der "message of the day" (MOTD) */ | ||||
| 			strncpy( Conf_MotdFile, arg, FNAME_LEN ); | ||||
| 			Conf_MotdFile[FNAME_LEN] = '\0'; | ||||
| 			ok = TRUE; | ||||
| 		} | ||||
| 		else if( strcasecmp( str, "PingTimeout" ) == 0 ) | ||||
| 		{ | ||||
| 			/* PING-Timeout */ | ||||
| 			Conf_PingTimeout = atoi( arg ); | ||||
| 			if(( Conf_PingTimeout ) < 5 ) Conf_PingTimeout = 5; | ||||
| 			ok = TRUE; | ||||
| 		} | ||||
| 		else if( strcasecmp( str, "PongTimeout" ) == 0 ) | ||||
| 		{ | ||||
| 			/* PONG-Timeout */ | ||||
| 			Conf_PongTimeout = atoi( arg ); | ||||
| 			if(( Conf_PongTimeout ) < 5 ) Conf_PongTimeout = 5; | ||||
| 			ok = TRUE; | ||||
| 		} | ||||
| 		 | ||||
| 		if( ! ok ) Log( LOG_ERR, "%s, line %d: Unknown variable \"%s\"!", Conf_File, line, var ); | ||||
| 	} | ||||
| 	 | ||||
| 	/* ... */ | ||||
| 	fclose( fd ); | ||||
| } /* Read_Config */ | ||||
|  | ||||
|  | ||||
| LOCAL VOID Validate_Config( VOID ) | ||||
| { | ||||
| 	/* Konfiguration ueberpruefen */ | ||||
| 	 | ||||
| 	if( ! Conf_ServerName[0] ) | ||||
| 	{ | ||||
| 		/* Kein Servername konfiguriert */ | ||||
| 		Log( LOG_ALERT, "No server name configured (use \"ServerName\")!", Conf_File, strerror( errno )); | ||||
| 		Log( LOG_ALERT, PACKAGE" exiting due to fatal errors!" ); | ||||
| 		exit( 1 ); | ||||
| 	} | ||||
| } /* Validate_Config */ | ||||
|  | ||||
| /* -eof- */ | ||||
|   | ||||
| @@ -9,11 +9,14 @@ | ||||
|  * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste | ||||
|  * der an comBase beteiligten Autoren finden Sie in der Datei AUTHORS. | ||||
|  * | ||||
|  * $Id: conf.h,v 1.4 2001/12/26 22:48:53 alex Exp $ | ||||
|  * $Id: conf.h,v 1.5 2001/12/30 19:26:11 alex Exp $ | ||||
|  * | ||||
|  * conf.h: Konfiguration des ngircd (Header) | ||||
|  * | ||||
|  * $Log: conf.h,v $ | ||||
|  * Revision 1.5  2001/12/30 19:26:11  alex | ||||
|  * - Unterstuetzung fuer die Konfigurationsdatei eingebaut. | ||||
|  * | ||||
|  * Revision 1.4  2001/12/26 22:48:53  alex | ||||
|  * - MOTD-Datei ist nun konfigurierbar und wird gelesen. | ||||
|  * | ||||
| @@ -33,14 +36,20 @@ | ||||
|  | ||||
|  | ||||
| #define FNAME_LEN 256 | ||||
| #define LISTEN_PORTS 16 | ||||
|  | ||||
|  | ||||
| GLOBAL CHAR Conf_File[FNAME_LEN];	/* Konfigurationsdatei */ | ||||
| GLOBAL CHAR Conf_File[FNAME_LEN];		/* Konfigurationsdatei */ | ||||
|  | ||||
| GLOBAL INT Conf_PingTimeout;		/* Ping Timeout */ | ||||
| GLOBAL INT Conf_PongTimeout;		/* Pong Timeout */ | ||||
| GLOBAL CHAR Conf_ServerName[CLIENT_ID_LEN];	/* Name ("Nick") des Servers */ | ||||
|  | ||||
| GLOBAL CHAR Conf_MotdFile[FNAME_LEN];	/* Datei mit MOTD-Text */ | ||||
| GLOBAL CHAR Conf_MotdFile[FNAME_LEN];		/* Datei mit MOTD-Text */ | ||||
|  | ||||
| GLOBAL INT Conf_ListenPorts[LISTEN_PORTS];	/* Ports, auf denen der Server Verbindungen */ | ||||
| GLOBAL INT Conf_ListenPorts_Count;		/* entgegen nimmt sowie deren Anzahl */ | ||||
|  | ||||
| GLOBAL INT Conf_PingTimeout;			/* Ping Timeout */ | ||||
| GLOBAL INT Conf_PongTimeout;			/* Pong Timeout */ | ||||
|  | ||||
|  | ||||
| GLOBAL VOID Conf_Init( VOID ); | ||||
|   | ||||
| @@ -9,11 +9,14 @@ | ||||
|  * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste | ||||
|  * der an comBase beteiligten Autoren finden Sie in der Datei AUTHORS. | ||||
|  * | ||||
|  * $Id: conn.c,v 1.21 2001/12/29 22:33:36 alex Exp $ | ||||
|  * $Id: conn.c,v 1.22 2001/12/30 19:26:11 alex Exp $ | ||||
|  * | ||||
|  * connect.h: Verwaltung aller Netz-Verbindungen ("connections") | ||||
|  * | ||||
|  * $Log: conn.c,v $ | ||||
|  * Revision 1.22  2001/12/30 19:26:11  alex | ||||
|  * - Unterstuetzung fuer die Konfigurationsdatei eingebaut. | ||||
|  * | ||||
|  * Revision 1.21  2001/12/29 22:33:36  alex | ||||
|  * - bessere Dokumentation des Modules bzw. der Funktionen. | ||||
|  * | ||||
| @@ -288,7 +291,7 @@ GLOBAL BOOLEAN Conn_NewListener( CONST INT Port ) | ||||
|  | ||||
| 	if( sock > My_Max_Fd ) My_Max_Fd = sock; | ||||
|  | ||||
| 	Log( LOG_INFO, "Now listening on port %d, socket %d.", Port, sock ); | ||||
| 	Log( LOG_INFO, "Now listening on port %d (socket %d).", Port, sock ); | ||||
|  | ||||
| 	return TRUE; | ||||
| } /* Conn_NewListener */ | ||||
|   | ||||
| @@ -9,11 +9,14 @@ | ||||
|  * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste | ||||
|  * der an comBase beteiligten Autoren finden Sie in der Datei AUTHORS. | ||||
|  * | ||||
|  * $Id: irc.c,v 1.14 2001/12/30 11:42:00 alex Exp $ | ||||
|  * $Id: irc.c,v 1.15 2001/12/30 19:26:11 alex Exp $ | ||||
|  * | ||||
|  * irc.c: IRC-Befehle | ||||
|  * | ||||
|  * $Log: irc.c,v $ | ||||
|  * Revision 1.15  2001/12/30 19:26:11  alex | ||||
|  * - Unterstuetzung fuer die Konfigurationsdatei eingebaut. | ||||
|  * | ||||
|  * Revision 1.14  2001/12/30 11:42:00  alex | ||||
|  * - der Server meldet nun eine ordentliche "Start-Zeit". | ||||
|  * | ||||
| @@ -480,9 +483,9 @@ LOCAL BOOLEAN Hello_User( CLIENT *Client ) | ||||
| 	Log( LOG_NOTICE, "User \"%s!%s@%s\" (%s) registered (connection %d).", Client->nick, Client->user, Client->host, Client->name, Client->conn_id ); | ||||
|  | ||||
| 	IRC_WriteStrClient( Client, This_Server, RPL_WELCOME_MSG, Client->nick, Client_GetID( Client )); | ||||
| 	IRC_WriteStrClient( Client, This_Server, RPL_YOURHOST_MSG, Client->nick, This_Server->host ); | ||||
| 	IRC_WriteStrClient( Client, This_Server, RPL_YOURHOST_MSG, Client->nick, This_Server->nick ); | ||||
| 	IRC_WriteStrClient( Client, This_Server, RPL_CREATED_MSG, Client->nick, NGIRCd_StartStr ); | ||||
| 	IRC_WriteStrClient( Client, This_Server, RPL_MYINFO_MSG, Client->nick, This_Server->host ); | ||||
| 	IRC_WriteStrClient( Client, This_Server, RPL_MYINFO_MSG, Client->nick, This_Server->nick ); | ||||
|  | ||||
| 	Client->type = CLIENT_USER; | ||||
|  | ||||
| @@ -506,7 +509,7 @@ LOCAL BOOLEAN Show_MOTD( CLIENT *Client ) | ||||
| 		return IRC_WriteStrClient( Client, This_Server, ERR_NOMOTD_MSG, Client->nick ); | ||||
| 	} | ||||
| 	 | ||||
| 	IRC_WriteStrClient( Client, This_Server, RPL_MOTDSTART_MSG, Client->nick, This_Server->host ); | ||||
| 	IRC_WriteStrClient( Client, This_Server, RPL_MOTDSTART_MSG, Client->nick, This_Server->nick ); | ||||
| 	while( TRUE ) | ||||
| 	{ | ||||
| 		if( ! fgets( line, 126, fd )) break; | ||||
|   | ||||
| @@ -9,11 +9,14 @@ | ||||
|  * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste | ||||
|  * der an comBase beteiligten Autoren finden Sie in der Datei AUTHORS. | ||||
|  * | ||||
|  * $Id: ngircd.c,v 1.13 2001/12/30 11:42:00 alex Exp $ | ||||
|  * $Id: ngircd.c,v 1.14 2001/12/30 19:26:12 alex Exp $ | ||||
|  * | ||||
|  * ngircd.c: Hier beginnt alles ;-) | ||||
|  * | ||||
|  * $Log: ngircd.c,v $ | ||||
|  * Revision 1.14  2001/12/30 19:26:12  alex | ||||
|  * - Unterstuetzung fuer die Konfigurationsdatei eingebaut. | ||||
|  * | ||||
|  * Revision 1.13  2001/12/30 11:42:00  alex | ||||
|  * - der Server meldet nun eine ordentliche "Start-Zeit". | ||||
|  * | ||||
| @@ -88,6 +91,8 @@ | ||||
| LOCAL VOID Initialize_Signal_Handler( VOID ); | ||||
| LOCAL VOID Signal_Handler( INT Signal ); | ||||
|  | ||||
| LOCAL VOID Initialize_Listen_Ports( VOID ); | ||||
|  | ||||
|  | ||||
| GLOBAL INT main( INT argc, CONST CHAR *argv[] ) | ||||
| { | ||||
| @@ -110,9 +115,9 @@ GLOBAL INT main( INT argc, CONST CHAR *argv[] ) | ||||
|  | ||||
| 	/* Signal-Handler initialisieren */ | ||||
| 	Initialize_Signal_Handler( ); | ||||
| 	 | ||||
| 	if( ! Conn_NewListener( 6668 )) exit( 1 ); | ||||
| 	if( ! Conn_NewListener( 6669 )) Log( LOG_WARNING, "Can't create second listening socket!" ); | ||||
|  | ||||
| 	/* Listen-Ports initialisieren */ | ||||
| 	Initialize_Listen_Ports( ); | ||||
| 	 | ||||
| 	/* Hauptschleife */ | ||||
| 	while( ! NGIRCd_Quit ) | ||||
| @@ -177,4 +182,26 @@ LOCAL VOID Signal_Handler( INT Signal ) | ||||
| } /* Signal_Handler */ | ||||
|  | ||||
|  | ||||
| LOCAL VOID Initialize_Listen_Ports( VOID ) | ||||
| { | ||||
| 	/* Ports, auf denen der Server Verbindungen entgegennehmen | ||||
| 	 * soll, initialisieren */ | ||||
| 	 | ||||
| 	INT created, i; | ||||
|  | ||||
| 	created = 0; | ||||
| 	for( i = 0; i < Conf_ListenPorts_Count; i++ ) | ||||
| 	{ | ||||
| 		if( Conn_NewListener( Conf_ListenPorts[i] )) created++; | ||||
| 		else Log( LOG_ERR, "Can't listen on port %d!", Conf_ListenPorts[i] ); | ||||
| 	} | ||||
|  | ||||
| 	if( created < 1 ) | ||||
| 	{ | ||||
| 		Log( LOG_ALERT, "Server isn't listening on a single port!" ); | ||||
| 		Log( LOG_ALERT, PACKAGE" exiting due to fatal errors!" ); | ||||
| 		exit( 1 ); | ||||
| 	} | ||||
| } /* Initialize_Listen_Ports */ | ||||
|  | ||||
| /* -eof- */ | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Alexander Barton
					Alexander Barton