#include "portab.h"
-static char UNUSED id[] = "$Id: conf.c,v 1.105 2008/03/18 20:12:47 fw Exp $";
-
#include "imp.h"
#include <assert.h>
#include <errno.h>
static void Init_Server_Struct PARAMS(( CONF_SERVER *Server ));
+#ifdef WANT_IPV6
+#define DEFAULT_LISTEN_ADDRSTR "::,0.0.0.0"
+#else
+#define DEFAULT_LISTEN_ADDRSTR "0.0.0.0"
+#endif
static char *
strdup_warn(const char *str)
fputs(" Ports = ", stdout);
ports_puts(&Conf_ListenPorts);
-
- printf( " Listen = %s\n", Conf_ListenAddress );
+ printf(" Listen = %s\n", Conf_ListenAddress);
pwd = getpwuid( Conf_UID );
if( pwd ) printf( " ServerUID = %s\n", pwd->pw_name );
else printf( " ServerUID = %ld\n", (long)Conf_UID );
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(" ConnectIPv4 = %s\n", yesno_to_str(Conf_ConnectIPv6));
printf(" ConnectIPv6 = %s\n", yesno_to_str(Conf_ConnectIPv4));
#endif
printf( " MaxConnections = %ld\n", Conf_MaxConnections);
strlcpy( Conf_PidFile, PID_FILE, sizeof( Conf_PidFile ));
- strcpy( Conf_ListenAddress, "" );
-
+ free(Conf_ListenAddress);
+ Conf_ListenAddress = NULL;
Conf_UID = Conf_GID = 0;
Conf_PingTimeout = 120;
Conf_OperServerMode = false;
Conf_ConnectIPv4 = true;
- Conf_ListenIPv4 = true;
Conf_ConnectIPv6 = true;
- Conf_ListenIPv6 = true;
Conf_MaxConnections = 0;
Conf_MaxConnectionsIP = 5;
exit( 1 );
}
}
+
+ if (!Conf_ListenAddress)
+ Conf_ListenAddress = strdup_warn(DEFAULT_LISTEN_ADDRSTR);
+
+ if (!Conf_ListenAddress) {
+ Config_Error(LOG_ALERT, "%s exiting due to fatal errors!", PACKAGE_NAME);
+ exit(1);
+ }
return true;
} /* Read_Config */
}
#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 );
if( strcasecmp( Var, "Listen" ) == 0 ) {
/* IP-Address to bind sockets */
- len = strlcpy( Conf_ListenAddress, Arg, sizeof( Conf_ListenAddress ));
- if (len >= sizeof( Conf_ListenAddress ))
- Config_Error_TooLong( Line, Var );
+ if (Conf_ListenAddress) {
+ Config_Error(LOG_ERR, "Multiple Listen= options, ignoring: %s", Arg);
+ return;
+ }
+ Conf_ListenAddress = strdup_warn(Arg);
+ /*
+ * if allocation fails, we're in trouble:
+ * we cannot ignore the error -- otherwise ngircd
+ * would listen on all interfaces.
+ */
+ if (!Conf_ListenAddress) {
+ Config_Error(LOG_ALERT, "%s exiting due to fatal errors!", PACKAGE_NAME);
+ exit(1);
+ }
return;
}
-
- Config_Error( LOG_ERR, "%s, line %d (section \"Global\"): Unknown variable \"%s\"!",
- NGIRCd_ConfFile, Line, Var );
+ Config_Error(LOG_ERR, "%s, line %d (section \"Global\"): Unknown variable \"%s\"!",
+ NGIRCd_ConfFile, Line, Var);
} /* Handle_GLOBAL */
"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++) {