2001-12-12 18:18:20 +01:00
/*
* ngIRCd - - The Next Generation IRC Daemon
2002-12-12 12:26:08 +01:00
* Copyright ( c ) 2001 , 2002 Alexander Barton ( alex @ barton . de )
2001-12-12 18:18:20 +01:00
*
2002-12-12 12:26:08 +01:00
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 of the License , or
* ( at your option ) any later version .
* Please read the file COPYING , README and AUTHORS for more information .
2001-12-12 18:18:20 +01:00
*
2002-12-12 12:26:08 +01:00
* Configuration management ( reading , parsing & validation )
2001-12-12 18:18:20 +01:00
*/
2002-03-12 15:37:51 +01:00
# include "portab.h"
2001-12-12 18:18:20 +01:00
2004-10-20 15:47:32 +02:00
static char UNUSED id [ ] = " $Id: conf.c,v 1.66 2004/10/20 13:47:32 alex Exp $ " ;
2002-12-12 12:26:08 +01:00
2002-03-12 15:37:51 +01:00
# include "imp.h"
2001-12-12 18:18:20 +01:00
# include <assert.h>
2001-12-30 20:26:11 +01:00
# include <errno.h>
2004-10-20 15:47:32 +02:00
# ifdef PROTOTYPES
# include <stdarg.h>
# else
# include <varargs.h>
# endif
2001-12-30 20:26:11 +01:00
# include <stdio.h>
2002-01-01 19:25:44 +01:00
# include <stdlib.h>
2001-12-30 20:26:11 +01:00
# include <string.h>
2004-01-17 04:17:00 +01:00
# include <strings.h>
2002-03-27 17:39:22 +01:00
# include <unistd.h>
2002-11-09 00:09:26 +01:00
# include <pwd.h>
# include <grp.h>
# include <sys/types.h>
2002-12-18 03:47:12 +01:00
# include <unistd.h>
2001-12-30 20:26:11 +01:00
2002-11-30 23:15:49 +01:00
# ifdef HAVE_CTYPE_H
# include <ctype.h>
# endif
2002-03-27 17:39:22 +01:00
# include "ngircd.h"
2002-05-27 15:09:26 +02:00
# include "conn.h"
2001-12-30 20:26:11 +01:00
# include "client.h"
2002-03-12 15:37:51 +01:00
# include "defines.h"
2001-12-30 20:26:11 +01:00
# include "log.h"
2002-05-27 15:09:26 +02:00
# include "resolve.h"
2001-12-30 20:26:11 +01:00
# include "tool.h"
2001-12-12 18:18:20 +01:00
2002-03-12 15:37:51 +01:00
# include "exp.h"
2001-12-12 18:18:20 +01:00
# include "conf.h"
2002-03-27 17:39:22 +01:00
LOCAL BOOLEAN Use_Log = TRUE ;
2002-12-30 01:01:42 +01:00
LOCAL CONF_SERVER New_Server ;
LOCAL INT New_Server_Idx ;
2002-03-27 17:39:22 +01:00
2002-12-30 01:01:42 +01:00
LOCAL VOID Set_Defaults PARAMS ( ( BOOLEAN InitServers ) ) ;
2002-05-27 15:09:26 +02:00
LOCAL VOID Read_Config PARAMS ( ( VOID ) ) ;
2002-12-18 03:47:12 +01:00
LOCAL VOID Validate_Config PARAMS ( ( BOOLEAN TestOnly ) ) ;
2002-01-02 03:44:36 +01:00
2002-05-27 15:09:26 +02:00
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 ) ) ;
2002-01-02 03:44:36 +01:00
2002-05-27 15:09:26 +02:00
LOCAL VOID Config_Error PARAMS ( ( CONST INT Level , CONST CHAR * Format , . . . ) ) ;
2001-12-26 23:48:53 +01:00
2002-12-30 01:01:42 +01:00
LOCAL VOID Init_Server_Struct PARAMS ( ( CONF_SERVER * Server ) ) ;
2001-12-26 23:48:53 +01:00
2002-05-27 15:09:26 +02:00
GLOBAL VOID
Conf_Init ( VOID )
2001-12-12 18:18:20 +01:00
{
2002-12-30 01:01:42 +01:00
Set_Defaults ( TRUE ) ;
2002-03-27 17:39:22 +01:00
Read_Config ( ) ;
2002-12-18 03:47:12 +01:00
Validate_Config ( FALSE ) ;
2002-03-27 17:39:22 +01:00
} /* Config_Init */
2002-12-30 01:01:42 +01:00
GLOBAL VOID
Conf_Rehash ( VOID )
{
Set_Defaults ( FALSE ) ;
Read_Config ( ) ;
Validate_Config ( FALSE ) ;
} /* Config_Rehash */
2002-05-27 15:09:26 +02:00
GLOBAL INT
Conf_Test ( VOID )
2002-03-27 17:39:22 +01:00
{
2002-12-12 12:26:08 +01:00
/* Read configuration, validate and output it. */
2002-03-27 17:39:22 +01:00
2002-11-09 00:09:26 +01:00
struct passwd * pwd ;
struct group * grp ;
2002-10-03 23:49:59 +02:00
INT i ;
2002-03-27 17:39:22 +01:00
Use_Log = FALSE ;
2002-12-30 01:01:42 +01:00
Set_Defaults ( TRUE ) ;
2002-03-27 17:39:22 +01:00
Read_Config ( ) ;
2002-12-18 03:47:12 +01:00
Validate_Config ( TRUE ) ;
2001-12-30 20:26:11 +01:00
2002-12-12 12:26:08 +01:00
/* If stdin is a valid tty wait for a key: */
2002-03-27 17:39:22 +01:00
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] " ) ;
2004-09-24 20:00:40 +02:00
printf ( " Name = %s \n " , Conf_ServerName ) ;
printf ( " Info = %s \n " , Conf_ServerInfo ) ;
2003-04-27 13:46:52 +02:00
printf ( " Password = %s \n " , Conf_ServerPwd ) ;
2002-09-16 11:13:06 +02:00
printf ( " AdminInfo1 = %s \n " , Conf_ServerAdmin1 ) ;
printf ( " AdminInfo2 = %s \n " , Conf_ServerAdmin2 ) ;
printf ( " AdminEMail = %s \n " , Conf_ServerAdminMail ) ;
2002-03-27 17:39:22 +01:00
printf ( " MotdFile = %s \n " , Conf_MotdFile ) ;
2004-05-07 13:19:20 +02:00
printf ( " MotdPhrase = %s \n " , Conf_MotdPhrase ) ;
printf ( " ChrootDir= %s \n " , Conf_Chroot ) ;
2002-11-18 19:47:42 +01:00
printf ( " Ports = " ) ;
2002-03-27 17:39:22 +01:00
for ( i = 0 ; i < Conf_ListenPorts_Count ; i + + )
{
if ( i ! = 0 ) printf ( " , " ) ;
2002-03-30 00:33:05 +01:00
printf ( " %u " , Conf_ListenPorts [ i ] ) ;
2002-03-27 17:39:22 +01:00
}
2002-03-30 00:33:05 +01:00
puts ( " " ) ;
2003-09-11 14:05:28 +02:00
printf ( " Listen = %s \n " , Conf_ListenAddress ) ;
2002-11-09 00:09:26 +01:00
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 ) ;
2002-03-27 17:39:22 +01:00
printf ( " PingTimeout = %d \n " , Conf_PingTimeout ) ;
printf ( " PongTimeout = %d \n " , Conf_PongTimeout ) ;
printf ( " ConnectRetry = %d \n " , Conf_ConnectRetry ) ;
2002-09-02 16:59:17 +02:00
printf ( " OperCanUseMode = %s \n " , Conf_OperCanMode = = TRUE ? " yes " : " no " ) ;
2002-11-02 23:59:01 +01:00
if ( Conf_MaxConnections > 0 ) printf ( " MaxConnections = %ld \n " , Conf_MaxConnections ) ;
else printf ( " MaxConnections = -1 \n " ) ;
2003-11-05 22:41:01 +01:00
if ( Conf_MaxConnectionsIP > 0 ) printf ( " MaxConnectionsIP = %d \n " , Conf_MaxConnectionsIP ) ;
else printf ( " MaxConnectionsIP = -1 \n " ) ;
2002-12-13 18:32:33 +01:00
if ( Conf_MaxJoins > 0 ) printf ( " MaxJoins = %d \n " , Conf_MaxJoins ) ;
else printf ( " MaxJoins = -1 \n " ) ;
2002-03-27 17:39:22 +01:00
puts ( " " ) ;
for ( i = 0 ; i < Conf_Oper_Count ; i + + )
{
2002-05-22 13:14:36 +02:00
if ( ! Conf_Oper [ i ] . name [ 0 ] ) continue ;
2002-12-12 12:26:08 +01:00
/* Valid "Operator" section */
2002-03-27 17:39:22 +01:00
puts ( " [OPERATOR] " ) ;
printf ( " Name = %s \n " , Conf_Oper [ i ] . name ) ;
printf ( " Password = %s \n " , Conf_Oper [ i ] . pwd ) ;
puts ( " " ) ;
}
2002-12-30 01:01:42 +01:00
for ( i = 0 ; i < MAX_SERVERS ; i + + )
2002-03-27 17:39:22 +01:00
{
2002-05-22 13:14:36 +02:00
if ( ! Conf_Server [ i ] . name [ 0 ] ) continue ;
2002-12-12 12:26:08 +01:00
/* Valid "Server" section */
2002-03-27 17:39:22 +01:00
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 ) ;
2002-11-19 13:50:20 +01:00
printf ( " MyPassword = %s \n " , Conf_Server [ i ] . pwd_in ) ;
printf ( " PeerPassword = %s \n " , Conf_Server [ i ] . pwd_out ) ;
2002-03-27 17:39:22 +01:00
printf ( " Group = %d \n " , Conf_Server [ i ] . group ) ;
puts ( " " ) ;
}
2002-05-21 02:10:16 +02:00
for ( i = 0 ; i < Conf_Channel_Count ; i + + )
{
2002-05-22 13:14:36 +02:00
if ( ! Conf_Channel [ i ] . name [ 0 ] ) continue ;
2002-12-12 12:26:08 +01:00
/* Valid "Channel" section */
2002-05-21 02:10:16 +02:00
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 ( " " ) ;
}
2002-03-27 17:39:22 +01:00
return 0 ;
} /* Conf_Test */
2002-12-30 01:01:42 +01:00
GLOBAL VOID
Conf_UnsetServer ( CONN_ID Idx )
{
/* Set next time for next connection attempt, if this is a server
* link that is ( still ) configured here . If the server is set as
* " once " , delete it from our configuration .
* Non - Server - Connections will be silently ignored . */
INT i ;
/* Check all our configured servers */
for ( i = 0 ; i < MAX_SERVERS ; i + + )
{
if ( Conf_Server [ i ] . conn_id ! = Idx ) continue ;
/* Gotcha! Mark server configuration as "unused": */
Conf_Server [ i ] . conn_id = NONE ;
2002-12-31 17:12:50 +01:00
if ( Conf_Server [ i ] . flags & CONF_SFLAG_ONCE )
2002-12-30 01:01:42 +01:00
{
/* Delete configuration here */
Init_Server_Struct ( & Conf_Server [ i ] ) ;
}
else
{
/* Set time for next connect attempt */
if ( Conf_Server [ i ] . lasttry < time ( NULL ) - Conf_ConnectRetry )
{
/* Okay, the connection was established "long enough": */
Conf_Server [ i ] . lasttry = time ( NULL ) - Conf_ConnectRetry + RECONNECT_DELAY ;
}
}
}
} /* Conf_UnsetServer */
GLOBAL VOID
Conf_SetServer ( INT ConfServer , CONN_ID Idx )
{
/* Set connection for specified configured server */
assert ( ConfServer > NONE ) ;
assert ( Idx > NONE ) ;
Conf_Server [ ConfServer ] . conn_id = Idx ;
} /* Conf_SetServer */
GLOBAL INT
Conf_GetServer ( CONN_ID Idx )
{
/* Get index of server in configuration structure */
2003-04-21 13:06:07 +02:00
INT i = 0 ;
2002-12-30 01:01:42 +01:00
assert ( Idx > NONE ) ;
for ( i = 0 ; i < MAX_SERVERS ; i + + )
{
if ( Conf_Server [ i ] . conn_id = = Idx ) return i ;
}
return NONE ;
} /* Conf_GetServer */
2002-12-31 17:12:50 +01:00
GLOBAL BOOLEAN
Conf_EnableServer ( CHAR * Name , INT Port )
{
/* Enable specified server and adjust port */
INT i ;
assert ( Name ! = NULL ) ;
for ( i = 0 ; i < MAX_SERVERS ; i + + )
{
if ( strcasecmp ( Conf_Server [ i ] . name , Name ) = = 0 )
{
/* Gotcha! Set port and enable server: */
Conf_Server [ i ] . port = Port ;
Conf_Server [ i ] . flags & = ~ CONF_SFLAG_DISABLED ;
return TRUE ;
}
}
return FALSE ;
} /* Conf_EnableServer */
GLOBAL BOOLEAN
Conf_DisableServer ( CHAR * Name )
{
/* Enable specified server and adjust port */
INT i ;
assert ( Name ! = NULL ) ;
for ( i = 0 ; i < MAX_SERVERS ; i + + )
{
if ( strcasecmp ( Conf_Server [ i ] . name , Name ) = = 0 )
{
/* Gotcha! Disable and disconnect server: */
Conf_Server [ i ] . flags | = CONF_SFLAG_DISABLED ;
if ( Conf_Server [ i ] . conn_id > NONE ) Conn_Close ( Conf_Server [ i ] . conn_id , NULL , " Server link terminated on operator request " , TRUE ) ;
return TRUE ;
}
}
return FALSE ;
} /* Conf_DisableServer */
GLOBAL BOOLEAN
Conf_AddServer ( CHAR * Name , INT Port , CHAR * Host , CHAR * MyPwd , CHAR * PeerPwd )
{
/* Add new server to configuration */
INT i ;
assert ( Name ! = NULL ) ;
assert ( Host ! = NULL ) ;
assert ( MyPwd ! = NULL ) ;
assert ( PeerPwd ! = NULL ) ;
/* Search unused item in server configuration structure */
for ( i = 0 ; i < MAX_SERVERS ; i + + )
{
/* Is this item used? */
if ( ! Conf_Server [ i ] . name [ 0 ] ) break ;
}
if ( i > = MAX_SERVERS ) return FALSE ;
Init_Server_Struct ( & Conf_Server [ i ] ) ;
strlcpy ( Conf_Server [ i ] . name , Name , sizeof ( Conf_Server [ i ] . name ) ) ;
strlcpy ( Conf_Server [ i ] . host , Host , sizeof ( Conf_Server [ i ] . host ) ) ;
strlcpy ( Conf_Server [ i ] . pwd_out , MyPwd , sizeof ( Conf_Server [ i ] . pwd_out ) ) ;
strlcpy ( Conf_Server [ i ] . pwd_in , PeerPwd , sizeof ( Conf_Server [ i ] . pwd_in ) ) ;
Conf_Server [ i ] . port = Port ;
Conf_Server [ i ] . flags = CONF_SFLAG_ONCE ;
return TRUE ;
} /* Conf_AddServer */
2002-05-27 15:09:26 +02:00
LOCAL VOID
2002-12-30 01:01:42 +01:00
Set_Defaults ( BOOLEAN InitServers )
2002-03-27 17:39:22 +01:00
{
2002-12-12 12:26:08 +01:00
/* Initialize configuration variables with default values. */
2001-12-30 20:26:11 +01:00
2002-12-30 01:01:42 +01:00
INT i ;
2001-12-30 20:26:11 +01:00
strcpy ( Conf_ServerName , " " ) ;
2003-03-31 17:54:21 +02:00
sprintf ( Conf_ServerInfo , " %s %s " , PACKAGE_NAME , PACKAGE_VERSION ) ;
2002-01-03 03:27:20 +01:00
strcpy ( Conf_ServerPwd , " " ) ;
2001-12-31 03:18:51 +01:00
2002-09-16 11:13:06 +02:00
strcpy ( Conf_ServerAdmin1 , " " ) ;
strcpy ( Conf_ServerAdmin2 , " " ) ;
strcpy ( Conf_ServerAdminMail , " " ) ;
2002-12-26 17:48:14 +01:00
strlcpy ( Conf_MotdFile , SYSCONFDIR , sizeof ( Conf_MotdFile ) ) ;
strlcat ( Conf_MotdFile , MOTD_FILE , sizeof ( Conf_MotdFile ) ) ;
2001-12-30 20:26:11 +01:00
2004-05-07 13:19:20 +02:00
strlcpy ( Conf_MotdPhrase , MOTD_PHRASE , sizeof ( Conf_MotdPhrase ) ) ;
strlcpy ( Conf_Chroot , CHROOT_DIR , sizeof ( Conf_Chroot ) ) ;
2001-12-30 20:26:11 +01:00
Conf_ListenPorts_Count = 0 ;
2003-09-11 14:05:28 +02:00
strcpy ( Conf_ListenAddress , " " ) ;
2002-03-30 00:33:05 +01:00
Conf_UID = Conf_GID = 0 ;
2001-12-26 23:48:53 +01:00
2001-12-26 15:45:37 +01:00
Conf_PingTimeout = 120 ;
2002-03-25 17:14:15 +01:00
Conf_PongTimeout = 20 ;
2001-12-26 23:48:53 +01:00
2002-01-02 03:44:36 +01:00
Conf_ConnectRetry = 60 ;
Conf_Oper_Count = 0 ;
2002-05-21 02:10:16 +02:00
Conf_Channel_Count = 0 ;
2002-09-02 16:59:17 +02:00
Conf_OperCanMode = FALSE ;
2002-11-02 23:59:01 +01:00
2002-12-13 18:32:33 +01:00
Conf_MaxConnections = - 1 ;
2003-11-05 22:41:01 +01:00
Conf_MaxConnectionsIP = 5 ;
2002-12-13 18:32:33 +01:00
Conf_MaxJoins = 10 ;
2002-12-30 01:01:42 +01:00
/* Initialize server configuration structures */
if ( InitServers ) for ( i = 0 ; i < MAX_SERVERS ; Init_Server_Struct ( & Conf_Server [ i + + ] ) ) ;
2002-03-27 17:39:22 +01:00
} /* Set_Defaults */
2001-12-12 18:18:20 +01:00
2002-05-27 15:09:26 +02:00
LOCAL VOID
Read_Config ( VOID )
2001-12-26 23:48:53 +01:00
{
2002-12-12 12:26:08 +01:00
/* Read configuration file. */
2001-12-30 20:26:11 +01:00
2002-01-02 03:44:36 +01:00
CHAR section [ LINE_LEN ] , str [ LINE_LEN ] , * var , * arg , * ptr ;
2003-03-27 02:21:38 +01:00
INT line , i , n ;
2001-12-30 20:26:11 +01:00
FILE * fd ;
2002-12-30 01:01:42 +01:00
/* Open configuration file */
2002-03-27 17:39:22 +01:00
fd = fopen ( NGIRCd_ConfFile , " r " ) ;
2001-12-30 20:26:11 +01:00
if ( ! fd )
{
2002-12-12 12:26:08 +01:00
/* No configuration file found! */
2002-03-27 17:39:22 +01:00
Config_Error ( LOG_ALERT , " Can't read configuration \" %s \" : %s " , NGIRCd_ConfFile , strerror ( errno ) ) ;
2003-03-31 17:54:21 +02:00
Config_Error ( LOG_ALERT , " %s exiting due to fatal errors! " , PACKAGE_NAME ) ;
2001-12-30 20:26:11 +01:00
exit ( 1 ) ;
}
2002-11-22 18:57:40 +01:00
Config_Error ( LOG_INFO , " Reading configuration from \" %s \" ... " , NGIRCd_ConfFile ) ;
2002-12-30 01:01:42 +01:00
/* Clean up server configuration structure: mark all already
* configured servers as " once " so that they are deleted
2003-03-27 02:21:38 +01:00
* after the next disconnect and delete all unused servers .
* And delete all servers which are " duplicates " of servers
* that are already marked as " once " ( such servers have been
* created by the last rehash but are now useless ) . */
2002-12-30 01:01:42 +01:00
for ( i = 0 ; i < MAX_SERVERS ; i + + )
{
if ( Conf_Server [ i ] . conn_id = = NONE ) Init_Server_Struct ( & Conf_Server [ i ] ) ;
2003-03-27 02:21:38 +01:00
else
{
/* This structure is in use ... */
if ( Conf_Server [ i ] . flags & CONF_SFLAG_ONCE )
{
/* Check for duplicates */
for ( n = 0 ; n < MAX_SERVERS ; n + + )
{
if ( n = = i ) continue ;
if ( Conf_Server [ i ] . conn_id = = Conf_Server [ n ] . conn_id )
{
Init_Server_Struct ( & Conf_Server [ n ] ) ;
Log ( LOG_DEBUG , " Deleted unused duplicate server %d (kept %d). " , n , i ) ;
}
}
}
else
{
/* Mark server as "once" */
Conf_Server [ i ] . flags | = CONF_SFLAG_ONCE ;
2003-04-21 01:09:43 +02:00
Log ( LOG_DEBUG , " Marked server %d as \" once \" " , i ) ;
2003-03-27 02:21:38 +01:00
}
}
2002-12-30 01:01:42 +01:00
}
/* Initialize variables */
2001-12-30 20:26:11 +01:00
line = 0 ;
2002-01-02 03:44:36 +01:00
strcpy ( section , " " ) ;
2002-12-30 01:01:42 +01:00
Init_Server_Struct ( & New_Server ) ;
New_Server_Idx = NONE ;
/* Read configuration file */
2001-12-30 20:26:11 +01:00
while ( TRUE )
{
2001-12-31 03:18:51 +01:00
if ( ! fgets ( str , LINE_LEN , fd ) ) break ;
2001-12-30 20:26:11 +01:00
ngt_TrimStr ( str ) ;
line + + ;
2002-12-12 12:26:08 +01:00
/* Skip comments and empty lines */
2001-12-30 20:26:11 +01:00
if ( str [ 0 ] = = ' ; ' | | str [ 0 ] = = ' # ' | | str [ 0 ] = = ' \0 ' ) continue ;
2002-12-12 12:26:08 +01:00
/* Is this the beginning of a new section? */
2002-01-02 03:44:36 +01:00
if ( ( str [ 0 ] = = ' [ ' ) & & ( str [ strlen ( str ) - 1 ] = = ' ] ' ) )
{
2002-12-26 18:04:54 +01:00
strlcpy ( section , str , sizeof ( section ) ) ;
2002-01-02 03:44:36 +01:00
if ( strcasecmp ( section , " [GLOBAL] " ) = = 0 ) continue ;
if ( strcasecmp ( section , " [OPERATOR] " ) = = 0 )
{
2002-03-27 17:39:22 +01:00
if ( Conf_Oper_Count + 1 > MAX_OPERATORS ) Config_Error ( LOG_ERR , " Too many operators configured. " ) ;
2002-01-02 03:44:36 +01:00
else
{
2002-12-12 12:26:08 +01:00
/* Initialize new operator structure */
2002-01-02 03:44:36 +01:00
strcpy ( Conf_Oper [ Conf_Oper_Count ] . name , " " ) ;
strcpy ( Conf_Oper [ Conf_Oper_Count ] . pwd , " " ) ;
Conf_Oper_Count + + ;
}
continue ;
}
if ( strcasecmp ( section , " [SERVER] " ) = = 0 )
{
2002-12-30 01:01:42 +01:00
/* Check if there is already a server to add */
if ( New_Server . name [ 0 ] )
{
/* Copy data to "real" server structure */
assert ( New_Server_Idx > NONE ) ;
Conf_Server [ New_Server_Idx ] = New_Server ;
}
/* Re-init structure for new server */
Init_Server_Struct ( & New_Server ) ;
/* Search unused item in server configuration structure */
for ( i = 0 ; i < MAX_SERVERS ; i + + )
2002-01-02 03:44:36 +01:00
{
2002-12-30 01:01:42 +01:00
/* Is this item used? */
if ( ! Conf_Server [ i ] . name [ 0 ] ) break ;
2002-01-02 03:44:36 +01:00
}
2002-12-30 01:01:42 +01:00
if ( i > = MAX_SERVERS )
{
/* Oops, no free item found! */
Config_Error ( LOG_ERR , " Too many servers configured. " ) ;
New_Server_Idx = NONE ;
}
else New_Server_Idx = i ;
2002-01-02 03:44:36 +01:00
continue ;
}
2002-05-21 02:10:16 +02:00
if ( strcasecmp ( section , " [CHANNEL] " ) = = 0 )
{
if ( Conf_Channel_Count + 1 > MAX_DEFCHANNELS ) Config_Error ( LOG_ERR , " Too many pre-defined channels configured. " ) ;
else
{
2002-12-12 12:26:08 +01:00
/* Initialize new channel structure */
2002-05-21 02:10:16 +02:00
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 ;
}
2002-03-27 17:39:22 +01:00
Config_Error ( LOG_ERR , " %s, line %d: Unknown section \" %s \" ! " , NGIRCd_ConfFile , line , section ) ;
2002-01-02 03:44:36 +01:00
section [ 0 ] = 0x1 ;
}
if ( section [ 0 ] = = 0x1 ) continue ;
2002-12-12 12:26:08 +01:00
/* Split line into variable name and parameters */
2001-12-30 20:26:11 +01:00
ptr = strchr ( str , ' = ' ) ;
if ( ! ptr )
{
2002-03-27 17:39:22 +01:00
Config_Error ( LOG_ERR , " %s, line %d: Syntax error! " , NGIRCd_ConfFile , line ) ;
2001-12-30 20:26:11 +01:00
continue ;
}
* ptr = ' \0 ' ;
var = str ; ngt_TrimStr ( var ) ;
arg = ptr + 1 ; ngt_TrimStr ( arg ) ;
2002-01-02 03:44:36 +01:00
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 ) ;
2002-05-21 02:10:16 +02:00
else if ( strcasecmp ( section , " [CHANNEL] " ) = = 0 ) Handle_CHANNEL ( line , var , arg ) ;
2002-03-27 17:39:22 +01:00
else Config_Error ( LOG_ERR , " %s, line %d: Variable \" %s \" outside section! " , NGIRCd_ConfFile , line , var ) ;
2002-01-02 03:44:36 +01:00
}
2002-12-30 01:01:42 +01:00
/* Close configuration file */
2002-01-02 03:44:36 +01:00
fclose ( fd ) ;
2002-12-30 01:01:42 +01:00
/* Check if there is still a server to add */
if ( New_Server . name [ 0 ] )
{
/* Copy data to "real" server structure */
assert ( New_Server_Idx > NONE ) ;
Conf_Server [ New_Server_Idx ] = New_Server ;
}
2002-03-30 14:08:10 +01:00
2002-12-12 12:26:08 +01:00
/* If there are no ports configured use the default: 6667 */
2002-03-30 14:08:10 +01:00
if ( Conf_ListenPorts_Count < 1 )
{
Conf_ListenPorts_Count = 1 ;
Conf_ListenPorts [ 0 ] = 6667 ;
}
2002-01-02 03:44:36 +01:00
} /* Read_Config */
2002-05-27 15:09:26 +02:00
LOCAL VOID
Handle_GLOBAL ( INT Line , CHAR * Var , CHAR * Arg )
2002-01-02 03:44:36 +01:00
{
2002-11-09 00:09:26 +01:00
struct passwd * pwd ;
struct group * grp ;
2002-01-02 03:44:36 +01:00
CHAR * ptr ;
2002-10-09 18:53:02 +02:00
LONG port ;
2002-01-02 03:44:36 +01:00
assert ( Line > 0 ) ;
assert ( Var ! = NULL ) ;
assert ( Arg ! = NULL ) ;
if ( strcasecmp ( Var , " Name " ) = = 0 )
{
2002-12-12 12:26:08 +01:00
/* Server name */
2002-12-26 17:25:43 +01:00
if ( strlcpy ( Conf_ServerName , Arg , sizeof ( Conf_ServerName ) ) > = sizeof ( Conf_ServerName ) ) Config_Error ( LOG_WARNING , " %s, line %d: Value of \" Name \" too long! " , NGIRCd_ConfFile , Line ) ;
2002-01-02 03:44:36 +01:00
return ;
}
if ( strcasecmp ( Var , " Info " ) = = 0 )
{
2002-12-12 12:26:08 +01:00
/* Info text of server */
2002-12-26 17:25:43 +01:00
if ( strlcpy ( Conf_ServerInfo , Arg , sizeof ( Conf_ServerInfo ) ) > = sizeof ( Conf_ServerInfo ) ) Config_Error ( LOG_WARNING , " %s, line %d: Value of \" Info \" too long! " , NGIRCd_ConfFile , Line ) ;
2002-01-02 03:44:36 +01:00
return ;
}
2002-01-03 03:27:20 +01:00
if ( strcasecmp ( Var , " Password " ) = = 0 )
{
2002-12-12 12:26:08 +01:00
/* Global server password */
2002-12-26 17:25:43 +01:00
if ( strlcpy ( Conf_ServerPwd , Arg , sizeof ( Conf_ServerPwd ) ) > = sizeof ( Conf_ServerPwd ) ) Config_Error ( LOG_WARNING , " %s, line %d: Value of \" Password \" too long! " , NGIRCd_ConfFile , Line ) ;
2002-01-03 03:27:20 +01:00
return ;
}
2002-09-16 11:13:06 +02:00
if ( strcasecmp ( Var , " AdminInfo1 " ) = = 0 )
{
2002-12-12 12:26:08 +01:00
/* Administrative info #1 */
2002-12-26 17:25:43 +01:00
if ( strlcpy ( Conf_ServerAdmin1 , Arg , sizeof ( Conf_ServerAdmin1 ) ) > = sizeof ( Conf_ServerAdmin1 ) ) Config_Error ( LOG_WARNING , " %s, line %d: Value of \" AdminInfo1 \" too long! " , NGIRCd_ConfFile , Line ) ;
2002-09-16 11:13:06 +02:00
return ;
}
if ( strcasecmp ( Var , " AdminInfo2 " ) = = 0 )
{
2002-12-12 12:26:08 +01:00
/* Administrative info #2 */
2002-12-26 17:25:43 +01:00
if ( strlcpy ( Conf_ServerAdmin2 , Arg , sizeof ( Conf_ServerAdmin2 ) ) > = sizeof ( Conf_ServerAdmin2 ) ) Config_Error ( LOG_WARNING , " %s, line %d: Value of \" AdminInfo2 \" too long! " , NGIRCd_ConfFile , Line ) ;
2002-09-16 11:13:06 +02:00
return ;
}
if ( strcasecmp ( Var , " AdminEMail " ) = = 0 )
{
2002-12-12 12:26:08 +01:00
/* Administrative email contact */
2002-12-26 17:25:43 +01:00
if ( strlcpy ( Conf_ServerAdminMail , Arg , sizeof ( Conf_ServerAdminMail ) ) > = sizeof ( Conf_ServerAdminMail ) ) Config_Error ( LOG_WARNING , " %s, line %d: Value of \" AdminEMail \" too long! " , NGIRCd_ConfFile , Line ) ;
2002-09-16 11:13:06 +02:00
return ;
}
2002-01-02 03:44:36 +01:00
if ( strcasecmp ( Var , " Ports " ) = = 0 )
{
2002-12-12 12:26:08 +01:00
/* Ports on that the server should listen. More port numbers
* must be separated by " , " */
2002-01-02 03:44:36 +01:00
ptr = strtok ( Arg , " , " ) ;
while ( ptr )
2001-12-30 20:26:11 +01:00
{
2002-01-02 03:44:36 +01:00
ngt_TrimStr ( ptr ) ;
port = atol ( ptr ) ;
2002-03-27 17:39:22 +01:00
if ( Conf_ListenPorts_Count + 1 > MAX_LISTEN_PORTS ) Config_Error ( LOG_ERR , " Too many listen ports configured. Port %ld ignored. " , port ) ;
2002-01-02 03:44:36 +01:00
else
2001-12-30 20:26:11 +01:00
{
2002-03-30 00:33:05 +01:00
if ( port > 0 & & port < 0xFFFF ) Conf_ListenPorts [ Conf_ListenPorts_Count + + ] = ( UINT ) port ;
2002-03-27 17:39:22 +01:00
else Config_Error ( LOG_ERR , " %s, line %d (section \" Global \" ) : Illegal port number % ld ! " , NGIRCd_ConfFile, Line, port ) ;
2001-12-30 20:26:11 +01:00
}
2002-01-02 03:44:36 +01:00
ptr = strtok ( NULL , " , " ) ;
2001-12-30 20:26:11 +01:00
}
2002-01-02 03:44:36 +01:00
return ;
}
if ( strcasecmp ( Var , " MotdFile " ) = = 0 )
{
2002-12-12 12:26:08 +01:00
/* "Message of the day" (MOTD) file */
2002-12-26 17:25:43 +01:00
if ( strlcpy ( Conf_MotdFile , Arg , sizeof ( Conf_MotdFile ) ) > = sizeof ( Conf_MotdFile ) ) Config_Error ( LOG_WARNING , " %s, line %d: Value of \" MotdFile \" too long! " , NGIRCd_ConfFile , Line ) ;
2002-01-02 03:44:36 +01:00
return ;
}
2004-05-07 13:19:20 +02:00
if ( strcasecmp ( Var , " MotdPhrase " ) = = 0 )
{
/* "Message of the day" phrase (instead of file) */
if ( strlcpy ( Conf_MotdPhrase , Arg , sizeof ( Conf_MotdPhrase ) ) > = sizeof ( Conf_MotdPhrase ) ) Config_Error ( LOG_WARNING , " %s, line %d: Value of \" MotdPhrase \" too long! " , NGIRCd_ConfFile , Line ) ;
return ;
}
if ( strcasecmp ( Var , " ChrootDir " ) = = 0 )
{
/* directory for chroot() */
if ( strlcpy ( Conf_Chroot , Arg , sizeof ( Conf_Chroot ) ) > = sizeof ( Conf_Chroot ) ) Config_Error ( LOG_WARNING , " %s, line %d: Value of \" ChrootDir \" too long! " , NGIRCd_ConfFile , Line ) ;
return ;
}
2002-03-30 00:33:05 +01:00
if ( strcasecmp ( Var , " ServerUID " ) = = 0 )
{
2002-12-12 12:26:08 +01:00
/* UID the daemon should switch to */
2002-11-09 00:09:26 +01:00
pwd = getpwnam ( Arg ) ;
if ( pwd ) Conf_UID = pwd - > pw_uid ;
2002-11-30 23:15:49 +01:00
else
{
# ifdef HAVE_ISDIGIT
2004-01-17 04:17:00 +01:00
if ( ! isdigit ( ( INT ) * Arg ) ) Config_Error ( LOG_WARNING , " %s, line %d: Value of \" ServerUID \" is not a number! " , NGIRCd_ConfFile , Line ) ;
2002-11-30 23:15:49 +01:00
else
# endif
Conf_UID = ( UINT ) atoi ( Arg ) ;
}
2002-03-30 00:33:05 +01:00
return ;
}
if ( strcasecmp ( Var , " ServerGID " ) = = 0 )
{
2002-12-12 12:26:08 +01:00
/* GID the daemon should use */
2002-11-09 00:09:26 +01:00
grp = getgrnam ( Arg ) ;
if ( grp ) Conf_GID = grp - > gr_gid ;
2002-11-30 23:15:49 +01:00
else
{
# ifdef HAVE_ISDIGIT
2004-01-17 04:17:00 +01:00
if ( ! isdigit ( ( INT ) * Arg ) ) Config_Error ( LOG_WARNING , " %s, line %d: Value of \" ServerGID \" is not a number! " , NGIRCd_ConfFile , Line ) ;
2002-11-30 23:15:49 +01:00
else
# endif
Conf_GID = ( UINT ) atoi ( Arg ) ;
}
2002-03-30 00:33:05 +01:00
return ;
}
2002-01-02 03:44:36 +01:00
if ( strcasecmp ( Var , " PingTimeout " ) = = 0 )
{
2002-12-12 12:26:08 +01:00
/* PING timeout */
2002-01-02 03:44:36 +01:00
Conf_PingTimeout = atoi ( Arg ) ;
2002-11-30 23:15:49 +01:00
if ( Conf_PingTimeout < 5 )
{
Config_Error ( LOG_WARNING , " %s, line %d: Value of \" PingTimeout \" too low! " , NGIRCd_ConfFile , Line ) ;
Conf_PingTimeout = 5 ;
}
2002-01-02 03:44:36 +01:00
return ;
}
if ( strcasecmp ( Var , " PongTimeout " ) = = 0 )
{
2002-12-12 12:26:08 +01:00
/* PONG timeout */
2002-01-02 03:44:36 +01:00
Conf_PongTimeout = atoi ( Arg ) ;
2002-11-30 23:15:49 +01:00
if ( Conf_PongTimeout < 5 )
{
Config_Error ( LOG_WARNING , " %s, line %d: Value of \" PongTimeout \" too low! " , NGIRCd_ConfFile , Line ) ;
Conf_PongTimeout = 5 ;
}
2002-01-02 03:44:36 +01:00
return ;
}
if ( strcasecmp ( Var , " ConnectRetry " ) = = 0 )
{
2002-12-12 12:26:08 +01:00
/* Seconds between connection attempts to other servers */
2002-01-02 03:44:36 +01:00
Conf_ConnectRetry = atoi ( Arg ) ;
2002-11-30 23:15:49 +01:00
if ( Conf_ConnectRetry < 5 )
{
Config_Error ( LOG_WARNING , " %s, line %d: Value of \" ConnectRetry \" too low! " , NGIRCd_ConfFile , Line ) ;
Conf_ConnectRetry = 5 ;
}
2002-01-02 03:44:36 +01:00
return ;
}
2002-09-02 16:59:17 +02:00
if ( strcasecmp ( Var , " OperCanUseMode " ) = = 0 )
{
2002-12-12 12:26:08 +01:00
/* Are IRC operators allowed to use MODE in channels they aren't Op in? */
2002-09-02 16:59:17 +02:00
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 ;
}
2002-11-02 23:59:01 +01:00
if ( strcasecmp ( Var , " MaxConnections " ) = = 0 )
{
2002-12-12 12:26:08 +01:00
/* Maximum number of connections. Values <= 0 are equal to "no limit". */
2002-11-30 23:15:49 +01:00
# ifdef HAVE_ISDIGIT
2004-01-17 04:17:00 +01:00
if ( ! isdigit ( ( INT ) * Arg ) ) Config_Error ( LOG_WARNING , " %s, line %d: Value of \" MaxConnections \" is not a number! " , NGIRCd_ConfFile , Line ) ;
2002-11-30 23:15:49 +01:00
else
# endif
2002-11-02 23:59:01 +01:00
Conf_MaxConnections = atol ( Arg ) ;
return ;
}
2003-11-05 22:41:01 +01:00
if ( strcasecmp ( Var , " MaxConnectionsIP " ) = = 0 )
{
/* Maximum number of simoultanous connections from one IP. Values <= 0 are equal to "no limit". */
# ifdef HAVE_ISDIGIT
2004-01-17 04:17:00 +01:00
if ( ! isdigit ( ( INT ) * Arg ) ) Config_Error ( LOG_WARNING , " %s, line %d: Value of \" MaxConnectionsIP \" is not a number! " , NGIRCd_ConfFile , Line ) ;
2003-11-05 22:41:01 +01:00
else
# endif
Conf_MaxConnectionsIP = atoi ( Arg ) ;
return ;
}
2002-12-13 18:32:33 +01:00
if ( strcasecmp ( Var , " MaxJoins " ) = = 0 )
{
/* Maximum number of channels a user can join. Values <= 0 are equal to "no limit". */
# ifdef HAVE_ISDIGIT
2004-01-17 04:17:00 +01:00
if ( ! isdigit ( ( INT ) * Arg ) ) Config_Error ( LOG_WARNING , " %s, line %d: Value of \" MaxJoins \" is not a number! " , NGIRCd_ConfFile , Line ) ;
2002-12-13 18:32:33 +01:00
else
# endif
Conf_MaxJoins = atoi ( Arg ) ;
return ;
}
2003-09-11 14:05:28 +02:00
if ( strcasecmp ( Var , " Listen " ) = = 0 )
{
/* IP-Address to bind sockets */
if ( strlcpy ( Conf_ListenAddress , Arg , sizeof ( Conf_ListenAddress ) ) > = sizeof ( Conf_ListenAddress ) )
{
Config_Error ( LOG_WARNING , " %s, line %d: Value of \" Listen \" too long! " , NGIRCd_ConfFile , Line ) ;
}
2003-11-05 22:41:01 +01:00
return ;
2003-09-11 14:05:28 +02:00
}
2002-12-13 18:32:33 +01:00
2002-03-27 17:39:22 +01:00
Config_Error ( LOG_ERR , " %s, line %d (section \" Global \" ): Unknown variable \" %s \" ! " , NGIRCd_ConfFile , Line , Var ) ;
2002-01-02 03:44:36 +01:00
} /* Handle_GLOBAL */
2002-05-27 15:09:26 +02:00
LOCAL VOID
Handle_OPERATOR ( INT Line , CHAR * Var , CHAR * Arg )
2002-01-02 03:44:36 +01:00
{
assert ( Line > 0 ) ;
assert ( Var ! = NULL ) ;
assert ( Arg ! = NULL ) ;
assert ( Conf_Oper_Count > 0 ) ;
if ( strcasecmp ( Var , " Name " ) = = 0 )
{
2002-12-12 12:26:08 +01:00
/* Name of IRC operator */
2002-12-26 17:25:43 +01:00
if ( strlcpy ( Conf_Oper [ Conf_Oper_Count - 1 ] . name , Arg , sizeof ( Conf_Oper [ Conf_Oper_Count - 1 ] . name ) ) > = sizeof ( Conf_Oper [ Conf_Oper_Count - 1 ] . name ) ) Config_Error ( LOG_WARNING , " %s, line %d: Value of \" Name \" too long! " , NGIRCd_ConfFile , Line ) ;
2002-01-02 03:44:36 +01:00
return ;
}
if ( strcasecmp ( Var , " Password " ) = = 0 )
{
2002-12-12 12:26:08 +01:00
/* Password of IRC operator */
2002-12-26 17:25:43 +01:00
if ( strlcpy ( Conf_Oper [ Conf_Oper_Count - 1 ] . pwd , Arg , sizeof ( Conf_Oper [ Conf_Oper_Count - 1 ] . pwd ) ) > = sizeof ( Conf_Oper [ Conf_Oper_Count - 1 ] . pwd ) ) Config_Error ( LOG_WARNING , " %s, line %d: Value of \" Password \" too long! " , NGIRCd_ConfFile , Line ) ;
2002-01-02 03:44:36 +01:00
return ;
2001-12-30 20:26:11 +01:00
}
2001-12-26 23:48:53 +01:00
2002-03-27 17:39:22 +01:00
Config_Error ( LOG_ERR , " %s, line %d (section \" Operator \" ): Unknown variable \" %s \" ! " , NGIRCd_ConfFile , Line , Var ) ;
2002-01-02 03:44:36 +01:00
} /* Handle_OPERATOR */
2002-05-27 15:09:26 +02:00
LOCAL VOID
Handle_SERVER ( INT Line , CHAR * Var , CHAR * Arg )
2002-01-02 03:44:36 +01:00
{
2002-10-09 18:53:02 +02:00
LONG port ;
2002-01-02 03:44:36 +01:00
assert ( Line > 0 ) ;
assert ( Var ! = NULL ) ;
assert ( Arg ! = NULL ) ;
2002-12-30 01:01:42 +01:00
/* Ignore server block if no space is left in server configuration structure */
if ( New_Server_Idx < = NONE ) return ;
2002-01-02 03:44:36 +01:00
if ( strcasecmp ( Var , " Host " ) = = 0 )
{
2002-12-12 12:26:08 +01:00
/* Hostname of the server */
2002-12-30 01:01:42 +01:00
if ( strlcpy ( New_Server . host , Arg , sizeof ( New_Server . host ) ) > = sizeof ( New_Server . host ) ) Config_Error ( LOG_WARNING , " %s, line %d: Value of \" Host \" too long! " , NGIRCd_ConfFile , Line ) ;
2002-01-02 03:44:36 +01:00
return ;
}
if ( strcasecmp ( Var , " Name " ) = = 0 )
{
2002-12-12 12:26:08 +01:00
/* Name of the server ("Nick"/"ID") */
2002-12-30 01:01:42 +01:00
if ( strlcpy ( New_Server . name , Arg , sizeof ( New_Server . name ) ) > = sizeof ( New_Server . name ) ) Config_Error ( LOG_WARNING , " %s, line %d: Value of \" Name \" too long! " , NGIRCd_ConfFile , Line ) ;
2002-01-02 03:44:36 +01:00
return ;
}
2002-11-19 13:50:20 +01:00
if ( strcasecmp ( Var , " MyPassword " ) = = 0 )
{
2002-12-12 12:26:08 +01:00
/* Password of this server which is sent to the peer */
2002-12-30 01:01:42 +01:00
if ( strlcpy ( New_Server . pwd_in , Arg , sizeof ( New_Server . pwd_in ) ) > = sizeof ( New_Server . pwd_in ) ) Config_Error ( LOG_WARNING , " %s, line %d: Value of \" MyPassword \" too long! " , NGIRCd_ConfFile , Line ) ;
2002-11-19 13:50:20 +01:00
return ;
}
if ( strcasecmp ( Var , " PeerPassword " ) = = 0 )
2002-01-02 03:44:36 +01:00
{
2002-12-12 12:26:08 +01:00
/* Passwort of the peer which must be received */
2002-12-30 01:01:42 +01:00
if ( strlcpy ( New_Server . pwd_out , Arg , sizeof ( New_Server . pwd_out ) ) > = sizeof ( New_Server . pwd_out ) ) Config_Error ( LOG_WARNING , " %s, line %d: Value of \" PeerPassword \" too long! " , NGIRCd_ConfFile , Line ) ;
2002-01-02 03:44:36 +01:00
return ;
}
if ( strcasecmp ( Var , " Port " ) = = 0 )
{
2002-12-12 12:26:08 +01:00
/* Port to which this server should connect */
2002-01-02 03:44:36 +01:00
port = atol ( Arg ) ;
2002-12-30 01:01:42 +01:00
if ( port > 0 & & port < 0xFFFF ) New_Server . port = ( INT ) port ;
2002-03-27 17:39:22 +01:00
else Config_Error ( LOG_ERR , " %s, line %d (section \" Server \" ) : Illegal port number % ld ! " , NGIRCd_ConfFile, Line, port ) ;
2002-01-02 03:44:36 +01:00
return ;
}
2002-03-10 18:50:48 +01:00
if ( strcasecmp ( Var , " Group " ) = = 0 )
{
2002-12-12 12:26:08 +01:00
/* Server group */
2002-11-30 23:15:49 +01:00
# ifdef HAVE_ISDIGIT
2004-01-17 04:17:00 +01:00
if ( ! isdigit ( ( INT ) * Arg ) ) Config_Error ( LOG_WARNING , " %s, line %d: Value of \" Group \" is not a number! " , NGIRCd_ConfFile , Line ) ;
2002-11-30 23:15:49 +01:00
else
# endif
2002-12-30 01:01:42 +01:00
New_Server . group = atoi ( Arg ) ;
2002-03-10 18:50:48 +01:00
return ;
}
2002-01-02 03:44:36 +01:00
2002-03-27 17:39:22 +01:00
Config_Error ( LOG_ERR , " %s, line %d (section \" Server \" ): Unknown variable \" %s \" ! " , NGIRCd_ConfFile , Line , Var ) ;
2002-01-02 03:44:36 +01:00
} /* Handle_SERVER */
2001-12-26 23:48:53 +01:00
2002-05-27 15:09:26 +02:00
LOCAL VOID
Handle_CHANNEL ( INT Line , CHAR * Var , CHAR * Arg )
2002-05-21 02:10:16 +02:00
{
assert ( Line > 0 ) ;
assert ( Var ! = NULL ) ;
assert ( Arg ! = NULL ) ;
if ( strcasecmp ( Var , " Name " ) = = 0 )
{
2002-12-12 12:26:08 +01:00
/* Name of the channel */
2002-12-26 17:25:43 +01:00
if ( strlcpy ( Conf_Channel [ Conf_Channel_Count - 1 ] . name , Arg , sizeof ( Conf_Channel [ Conf_Channel_Count - 1 ] . name ) ) > = sizeof ( Conf_Channel [ Conf_Channel_Count - 1 ] . name ) ) Config_Error ( LOG_WARNING , " %s, line %d: Value of \" Name \" too long! " , NGIRCd_ConfFile , Line ) ;
2002-05-21 02:10:16 +02:00
return ;
}
if ( strcasecmp ( Var , " Modes " ) = = 0 )
{
2002-12-12 12:26:08 +01:00
/* Initial modes */
2002-12-26 17:25:43 +01:00
if ( strlcpy ( Conf_Channel [ Conf_Channel_Count - 1 ] . modes , Arg , sizeof ( Conf_Channel [ Conf_Channel_Count - 1 ] . modes ) ) > = sizeof ( Conf_Channel [ Conf_Channel_Count - 1 ] . modes ) ) Config_Error ( LOG_WARNING , " %s, line %d: Value of \" Modes \" too long! " , NGIRCd_ConfFile , Line ) ;
2002-05-21 02:10:16 +02:00
return ;
}
if ( strcasecmp ( Var , " Topic " ) = = 0 )
{
2002-12-12 12:26:08 +01:00
/* Initial topic */
2002-12-26 17:25:43 +01:00
if ( strlcpy ( Conf_Channel [ Conf_Channel_Count - 1 ] . topic , Arg , sizeof ( Conf_Channel [ Conf_Channel_Count - 1 ] . topic ) ) > = sizeof ( Conf_Channel [ Conf_Channel_Count - 1 ] . topic ) ) Config_Error ( LOG_WARNING , " %s, line %d: Value of \" Topic \" too long! " , NGIRCd_ConfFile , Line ) ;
2002-05-21 02:10:16 +02:00
return ;
}
Config_Error ( LOG_ERR , " %s, line %d (section \" Channel \" ): Unknown variable \" %s \" ! " , NGIRCd_ConfFile , Line , Var ) ;
} /* Handle_CHANNEL */
2002-05-27 15:09:26 +02:00
LOCAL VOID
2002-12-18 03:47:12 +01:00
Validate_Config ( BOOLEAN Configtest )
2001-12-30 20:26:11 +01:00
{
2002-12-12 12:26:08 +01:00
/* Validate configuration settings. */
2002-12-30 01:01:42 +01:00
# ifdef DEBUG
INT i , servers , servers_once ;
# endif
2001-12-30 20:26:11 +01:00
if ( ! Conf_ServerName [ 0 ] )
{
2002-12-12 12:26:08 +01:00
/* No server name configured! */
2003-12-19 15:32:59 +01:00
Config_Error ( LOG_ALERT , " No server name configured in \" %s \" (section 'Global': 'Name')! " , NGIRCd_ConfFile ) ;
2002-12-18 03:47:12 +01:00
if ( ! Configtest )
{
2003-03-31 17:54:21 +02:00
Config_Error ( LOG_ALERT , " %s exiting due to fatal errors! " , PACKAGE_NAME ) ;
2002-12-18 03:47:12 +01:00
exit ( 1 ) ;
}
2001-12-30 20:26:11 +01:00
}
2003-04-29 14:36:09 +02:00
2003-12-19 15:32:59 +01:00
if ( Conf_ServerName [ 0 ] & & ! strchr ( Conf_ServerName , ' . ' ) )
2003-04-29 14:36:09 +02:00
{
/* No dot in server name! */
2003-12-19 15:32:59 +01:00
Config_Error ( LOG_ALERT , " Invalid server name configured in \" %s \" (section 'Global': 'Name'): Dot missing! " , NGIRCd_ConfFile ) ;
2003-04-29 14:36:09 +02:00
if ( ! Configtest )
{
Config_Error ( LOG_ALERT , " %s exiting due to fatal errors! " , PACKAGE_NAME ) ;
exit ( 1 ) ;
}
}
2002-09-16 11:13:06 +02:00
# ifdef STRICT_RFC
2002-10-21 15:45:07 +02:00
if ( ! Conf_ServerAdminMail [ 0 ] )
2002-09-16 11:13:06 +02:00
{
2002-12-12 12:26:08 +01:00
/* No administrative contact configured! */
2002-09-16 11:13:06 +02:00
Config_Error ( LOG_ALERT , " No administrator email address configured in \" %s \" ('AdminEMail')! " , NGIRCd_ConfFile ) ;
2002-12-18 03:47:12 +01:00
if ( ! Configtest )
{
2003-03-31 17:54:21 +02:00
Config_Error ( LOG_ALERT , " %s exiting due to fatal errors! " , PACKAGE_NAME ) ;
2002-12-18 03:47:12 +01:00
exit ( 1 ) ;
}
2002-09-16 11:13:06 +02:00
}
# endif
2002-09-19 12:19:12 +02:00
if ( ! Conf_ServerAdmin1 [ 0 ] & & ! Conf_ServerAdmin2 [ 0 ] & & ! Conf_ServerAdminMail [ 0 ] )
2002-09-16 11:13:06 +02:00
{
2002-12-12 12:26:08 +01:00
/* No administrative information configured! */
2002-12-18 03:47:12 +01:00
Config_Error ( LOG_WARNING , " No administrative information configured but required by RFC! " ) ;
2002-09-16 11:13:06 +02:00
}
2002-12-18 03:47:12 +01:00
# ifdef FD_SETSIZE
2002-12-18 03:52:51 +01:00
if ( ( Conf_MaxConnections > ( LONG ) FD_SETSIZE ) | | ( Conf_MaxConnections < 1 ) )
2002-12-18 03:47:12 +01:00
{
Conf_MaxConnections = ( LONG ) FD_SETSIZE ;
Config_Error ( LOG_ERR , " Setting MaxConnections to %ld, select() can't handle more file descriptors! " , Conf_MaxConnections ) ;
}
# else
Config_Error ( LOG_WARN , " Don't know how many file descriptors select() can handle on this system, don't set MaxConnections too high! " ) ;
# endif
2002-12-30 01:01:42 +01:00
# ifdef DEBUG
servers = servers_once = 0 ;
for ( i = 0 ; i < MAX_SERVERS ; i + + )
{
if ( Conf_Server [ i ] . name [ 0 ] )
{
servers + + ;
2002-12-31 17:12:50 +01:00
if ( Conf_Server [ i ] . flags & CONF_SFLAG_ONCE ) servers_once + + ;
2002-12-30 01:01:42 +01:00
}
}
Log ( LOG_DEBUG , " Configuration: Operators=%d, Servers=%d[%d], Channels=%d " , Conf_Oper_Count , servers , servers_once , Conf_Channel_Count ) ;
# endif
2001-12-30 20:26:11 +01:00
} /* Validate_Config */
2002-03-27 17:39:22 +01:00
2002-05-30 18:52:20 +02:00
# 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
2002-03-27 17:39:22 +01:00
{
2002-12-12 12:26:08 +01:00
/* Error! Write to console and/or logfile. */
2002-03-27 17:39:22 +01:00
CHAR msg [ MAX_LOG_MSG_LEN ] ;
va_list ap ;
assert ( Format ! = NULL ) ;
2002-05-30 18:52:20 +02:00
# ifdef PROTOTYPES
2002-03-27 17:39:22 +01:00
va_start ( ap , Format ) ;
2002-05-30 18:52:20 +02:00
# else
va_start ( ap ) ;
# endif
2002-03-27 17:39:22 +01:00
vsnprintf ( msg , MAX_LOG_MSG_LEN , Format , ap ) ;
va_end ( ap ) ;
2002-12-12 12:26:08 +01:00
/* During "normal operations" the log functions of the daemon should
* be used , but during testing of the configuration file , all messages
* should go directly to the console : */
2002-10-04 13:21:46 +02:00
if ( Use_Log ) Log ( Level , " %s " , msg ) ;
2002-03-27 17:39:22 +01:00
else puts ( msg ) ;
} /* Config_Error */
2002-12-30 01:01:42 +01:00
LOCAL VOID
Init_Server_Struct ( CONF_SERVER * Server )
{
/* Initialize server configuration structur to default values */
assert ( Server ! = NULL ) ;
strcpy ( Server - > host , " " ) ;
strcpy ( Server - > ip , " " ) ;
strcpy ( Server - > name , " " ) ;
strcpy ( Server - > pwd_in , " " ) ;
strcpy ( Server - > pwd_out , " " ) ;
Server - > port = 0 ;
Server - > group = NONE ;
Server - > lasttry = time ( NULL ) - Conf_ConnectRetry + STARTUP_DELAY ;
Server - > res_stat = NULL ;
2002-12-31 17:12:50 +01:00
if ( NGIRCd_Passive ) Server - > flags = CONF_SFLAG_DISABLED ;
else Server - > flags = 0 ;
2002-12-30 01:01:42 +01:00
Server - > conn_id = NONE ;
} /* Init_Server_Struct */
2001-12-12 18:18:20 +01:00
/* -eof- */