X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fngircd%2Fconf.c;h=c5a621fee65d9a7f8f484c592f45ab58a4599f78;hb=4a81367dac3a34d3bad3035b78d40e960c0cca75;hp=7ca5567d990158fba9a4835663831adf94081cce;hpb=82d32ffb28262b302fb435739e4c81bd3c1a1b85;p=ngircd-alex.git diff --git a/src/ngircd/conf.c b/src/ngircd/conf.c index 7ca5567d..c5a621fe 100644 --- a/src/ngircd/conf.c +++ b/src/ngircd/conf.c @@ -14,7 +14,7 @@ #include "portab.h" -static char UNUSED id[] = "$Id: conf.c,v 1.103 2007/11/23 16:26:04 fw Exp $"; +static char UNUSED id[] = "$Id: conf.c,v 1.105 2008/03/18 20:12:47 fw Exp $"; #include "imp.h" #include @@ -57,7 +57,7 @@ static int New_Server_Idx; static void Set_Defaults PARAMS(( bool InitServers )); -static void Read_Config PARAMS(( void )); +static bool Read_Config PARAMS(( bool ngircd_starting )); static void Validate_Config PARAMS(( bool TestOnly, bool Rehash )); static void Handle_GLOBAL PARAMS(( int Line, char *Var, char *Arg )); @@ -134,24 +134,33 @@ ports_parse(array *a, int Line, char *Arg) GLOBAL void Conf_Init( void ) { - Set_Defaults( true ); - Read_Config( ); + Read_Config( true ); Validate_Config(false, false); } /* Config_Init */ -GLOBAL void +GLOBAL bool Conf_Rehash( void ) { - Set_Defaults( false ); - Read_Config( ); + if (!Read_Config(false)) + return false; Validate_Config(false, true); /* Update CLIENT structure of local server */ Client_SetInfo(Client_ThisServer(), Conf_ServerInfo); + return true; } /* Config_Rehash */ +static const char* +yesno_to_str(int boolean_value) +{ + if (boolean_value) + return "yes"; + return "no"; +} + + GLOBAL int Conf_Test( void ) { @@ -163,9 +172,8 @@ Conf_Test( void ) char *topic; Use_Log = false; - Set_Defaults( true ); - Read_Config( ); + Read_Config( true ); Validate_Config(true, false); /* If stdin and stdout ("you can read our nice message and we can @@ -202,10 +210,17 @@ Conf_Test( void ) 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" ); - printf( " OperServerMode = %s\n", Conf_OperServerMode == true? "yes" : "no" ); - printf( " PredefChannelsOnly = %s\n", Conf_PredefChannelsOnly == true ? "yes" : "no" ); - printf( " NoDNS = %s\n", Conf_NoDNS ? "yes" : "no"); + printf( " OperCanUseMode = %s\n", yesno_to_str(Conf_OperCanMode)); + printf( " OperServerMode = %s\n", yesno_to_str(Conf_OperServerMode)); + printf( " PredefChannelsOnly = %s\n", yesno_to_str(Conf_PredefChannelsOnly)); + printf( " NoDNS = %s\n", yesno_to_str(Conf_NoDNS)); + +#ifdef WANT_IPV6 + printf(" ListenIPv6 = %s\n", yesno_to_str(Conf_ListenIPv6)); + printf(" ListenIPv4 = %s\n", yesno_to_str(Conf_ListenIPv4)); + printf(" ConnectIPv4 = %s\n", yesno_to_str(Conf_ConnectIPv6)); + printf(" ConnectIPv6 = %s\n", yesno_to_str(Conf_ConnectIPv4)); +#endif printf( " MaxConnections = %ld\n", Conf_MaxConnections); printf( " MaxConnectionsIP = %d\n", Conf_MaxConnectionsIP); printf( " MaxJoins = %d\n", Conf_MaxJoins>0 ? Conf_MaxJoins : -1); @@ -450,6 +465,11 @@ Set_Defaults( bool InitServers ) Conf_PredefChannelsOnly = false; Conf_OperServerMode = false; + Conf_ConnectIPv4 = true; + Conf_ListenIPv4 = true; + Conf_ConnectIPv6 = true; + Conf_ListenIPv6 = true; + Conf_MaxConnections = 0; Conf_MaxConnectionsIP = 5; Conf_MaxJoins = 10; @@ -460,8 +480,8 @@ Set_Defaults( bool InitServers ) } /* Set_Defaults */ -static void -Read_Config( void ) +static bool +Read_Config( bool ngircd_starting ) { /* Read configuration file. */ @@ -476,10 +496,14 @@ Read_Config( void ) /* No configuration file found! */ Config_Error( LOG_ALERT, "Can't read configuration \"%s\": %s", NGIRCd_ConfFile, strerror( errno )); + if (!ngircd_starting) + return false; Config_Error( LOG_ALERT, "%s exiting due to fatal errors!", PACKAGE_NAME ); exit( 1 ); } + Set_Defaults( ngircd_starting ); + Config_Error( LOG_INFO, "Reading configuration from \"%s\" ...", NGIRCd_ConfFile ); /* Clean up server configuration structure: mark all already @@ -626,6 +650,7 @@ Read_Config( void ) exit( 1 ); } } + return true; } /* Read_Config */ @@ -813,6 +838,33 @@ Handle_GLOBAL( int Line, char *Var, char *Arg ) Conf_NoDNS = Check_ArgIsTrue( Arg ); return; } +#ifdef WANT_IPV6 + /* the default setting for all the WANT_IPV6 special options is 'true' */ + if( strcasecmp( Var, "ListenIPv6" ) == 0 ) { + /* listen on ipv6 sockets, if available? */ + Conf_ListenIPv6 = Check_ArgIsTrue( Arg ); + return; + } + if( strcasecmp( Var, "ListenIPv4" ) == 0 ) { + /* + * listen on ipv4 sockets, if available? + * this allows "ipv6-only" setups. + */ + Conf_ListenIPv4 = Check_ArgIsTrue( Arg ); + return; + } + if( strcasecmp( Var, "ConnectIPv6" ) == 0 ) { + /* connect to other hosts using ipv6, if they have an AAAA record? */ + Conf_ConnectIPv6 = Check_ArgIsTrue( Arg ); + return; + } + if( strcasecmp( Var, "ConnectIPv4" ) == 0 ) { + /* connect to other hosts using ipv4. + * again, this can be used for ipv6-only setups */ + Conf_ConnectIPv4 = Check_ArgIsTrue( Arg ); + return; + } +#endif if( strcasecmp( Var, "OperCanUseMode" ) == 0 ) { /* Are IRC operators allowed to use MODE in channels they aren't Op in? */ Conf_OperCanMode = Check_ArgIsTrue( Arg ); @@ -938,7 +990,7 @@ Handle_SERVER( int Line, char *Var, char *Arg ) return; } if (strcasecmp(Var, "Bind") == 0) { - if (ngt_IPStrToBin(Arg, &New_Server.bind_addr)) + if (ng_ipaddr_init(&New_Server.bind_addr, Arg, 0)) return; Config_Error(LOG_ERR, "%s, line %d (section \"Server\"): Can't parse IP address \"%s\"", @@ -1134,6 +1186,16 @@ Validate_Config(bool Configtest, bool Rehash) "No administrative information configured but required by RFC!"); } +#ifdef WANT_IPV6 + if (!Conf_ListenIPv4 && !Conf_ListenIPv6) + Config_Error(LOG_ALERT, + "Both \"ListenIPv4\" and \"ListenIPv6\" are set to 'no'; no network protocol available!"); + + if (!Conf_ConnectIPv4 && !Conf_ConnectIPv6) + Config_Error(LOG_ALERT, + "Both \"ConnectIPv4\" and \"ConnectIPv6\" are set to 'no'; ngircd will fail to connect to other irc servers"); +#endif + #ifdef DEBUG servers = servers_once = 0; for (i = 0; i < MAX_SERVERS; i++) { @@ -1213,7 +1275,7 @@ Init_Server_Struct( CONF_SERVER *Server ) Resolve_Init(&Server->res_stat); Server->conn_id = NONE; - Server->bind_addr.s_addr = htonl(INADDR_ANY); + memset(&Server->bind_addr, 0, sizeof(&Server->bind_addr)); } /* Init_Server_Struct */