| 
					
				 | 
			
			
				@@ -1,6 +1,6 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /* 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * ngIRCd -- The Next Generation IRC Daemon 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * Copyright (c)2001,2002 Alexander Barton (alex@barton.de) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * Copyright (c)2001-2009 Alexander Barton (alex@barton.de) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * 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 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -14,8 +14,6 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #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> 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -42,8 +40,10 @@ static char UNUSED id[] = "$Id: conf.c,v 1.105 2008/03/18 20:12:47 fw Exp $"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include "ngircd.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include "conn.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include "client.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include "channel.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include "defines.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include "log.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include "match.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include "resolve.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include "tool.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -55,19 +55,7 @@ static bool Use_Log = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 static CONF_SERVER New_Server; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 static int New_Server_Idx; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-#ifdef WANT_IPV6 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-/* 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * these options appeared in ngircd 0.12; they are here 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * for backwards compatibility. They should be removed 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * in the future. Instead of setting these options, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * the "Listen" option should be set accordingly. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-static bool Conf_ListenIPv6; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-static bool Conf_ListenIPv4; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-#endif 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static size_t Conf_Channel_Count; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 static void Set_Defaults PARAMS(( bool InitServers )); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 static bool Read_Config PARAMS(( bool ngircd_starting )); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 static bool Validate_Config PARAMS(( bool TestOnly, bool Rehash )); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -84,6 +72,71 @@ static void Config_Error_TooLong PARAMS(( const int LINE, const char *Value )); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 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 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#ifdef SSL_SUPPORT 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+struct SSLOptions Conf_SSLOptions; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static void 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ConfSSL_Init(void) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	free(Conf_SSLOptions.KeyFile); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	Conf_SSLOptions.KeyFile = NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	free(Conf_SSLOptions.CertFile); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	Conf_SSLOptions.CertFile = NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	free(Conf_SSLOptions.DHFile); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	Conf_SSLOptions.DHFile = NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	array_free_wipe(&Conf_SSLOptions.KeyFilePassword); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static bool 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ssl_print_configvar(const char *name, const char *file) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	FILE *fp; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (!file) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		printf("  %s =\n", name); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	fp = fopen(file, "r"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (fp) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		fclose(fp); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		fprintf(stderr, "ERROR: %s \"%s\": %s\n", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			name, file, strerror(errno)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	printf("  %s = %s\n", name, file); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return fp != NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static bool 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ConfSSL_Puts(void) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	bool ret; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	ret = ssl_print_configvar("SSLKeyFile", Conf_SSLOptions.KeyFile); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (!ssl_print_configvar("SSLCertFile", Conf_SSLOptions.CertFile)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		ret = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (!ssl_print_configvar("SSLDHFile", Conf_SSLOptions.DHFile)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		ret = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (array_bytes(&Conf_SSLOptions.KeyFilePassword)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		puts("  SSLKeyFilePassword = <secret>"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	array_free_wipe(&Conf_SSLOptions.KeyFilePassword); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return ret; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#endif 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 static char * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 strdup_warn(const char *str) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -126,8 +179,8 @@ ports_parse(array *a, int Line, char *Arg) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	 * must be separated by "," */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	ptr = strtok( Arg, "," ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	while (ptr) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		ngt_TrimStr( ptr ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		port = atol( ptr ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		ngt_TrimStr(ptr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		port = atoi(ptr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if (port > 0 && port < 0xFFFF) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			port16 = (UINT16) port; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			if (!array_catb(a, (char*)&port16, sizeof port16)) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -181,8 +234,9 @@ Conf_Test( void ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	struct passwd *pwd; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	struct group *grp; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	unsigned int i; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	char *topic; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	bool config_valid; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	size_t predef_channel_count; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	struct Conf_Channel *predef_chan; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	Use_Log = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -211,37 +265,44 @@ Conf_Test( void ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	printf( "  MotdPhrase = %s\n", Conf_MotdPhrase ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	printf( "  ChrootDir = %s\n", Conf_Chroot ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	printf( "  PidFile = %s\n", Conf_PidFile); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	printf("  Listen = %s\n", Conf_ListenAddress); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	fputs("  Ports = ", stdout); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	ports_puts(&Conf_ListenPorts); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	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 ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	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", 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 SSL_SUPPORT 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	fputs("  SSLPorts = ", stdout); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	ports_puts(&Conf_SSLOptions.ListenPorts); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (!ConfSSL_Puts()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		config_valid = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#endif 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	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", yesno_to_str(Conf_OperCanMode)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	printf("  OperServerMode = %s\n", yesno_to_str(Conf_OperServerMode)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	printf("  AllowRemoteOper = %s\n", yesno_to_str(Conf_AllowRemoteOper)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	printf("  PredefChannelsOnly = %s\n", yesno_to_str(Conf_PredefChannelsOnly)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	printf("  NoDNS = %s\n", yesno_to_str(Conf_NoDNS)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	printf("  NoIdent = %s\n", yesno_to_str(Conf_NoIdent)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #ifdef WANT_IPV6 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	/* both are deprecated, only mention them if their default value changed. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if (!Conf_ListenIPv6) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		puts("  ListenIPv6 = no"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if (!Conf_ListenIPv4) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		puts("  ListenIPv4 = no"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	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); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	printf( "  MaxNickLength = %u\n\n", Conf_MaxNickLength - 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	printf("  MaxConnections = %ld\n", Conf_MaxConnections); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	printf("  MaxConnectionsIP = %d\n", Conf_MaxConnectionsIP); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	printf("  MaxJoins = %d\n", Conf_MaxJoins > 0 ? Conf_MaxJoins : -1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	printf("  MaxNickLength = %u\n\n", Conf_MaxNickLength - 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	for( i = 0; i < Conf_Oper_Count; i++ ) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if( ! Conf_Oper[i].name[0] ) continue; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -262,24 +323,31 @@ Conf_Test( void ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		printf( "  Name = %s\n", Conf_Server[i].name ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		printf( "  Host = %s\n", Conf_Server[i].host ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		printf( "  Port = %u\n", (unsigned int)Conf_Server[i].port ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#ifdef SSL_SUPPORT 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		printf( "  SSLConnect = %s\n", Conf_Server[i].SSLConnect?"yes":"no"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#endif 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		printf( "  MyPassword = %s\n", Conf_Server[i].pwd_in ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		printf( "  PeerPassword = %s\n", Conf_Server[i].pwd_out ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		printf( "  ServiceMask = %s\n", Conf_Server[i].svs_mask); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		printf( "  Group = %d\n", Conf_Server[i].group ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		printf( "  Passive = %s\n\n", Conf_Server[i].flags & CONF_SFLAG_DISABLED ? "yes" : "no"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	for( i = 0; i < Conf_Channel_Count; i++ ) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if( ! Conf_Channel[i].name[0] ) continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	predef_channel_count = array_length(&Conf_Channels, sizeof(*predef_chan)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	predef_chan = array_start(&Conf_Channels); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	for (i = 0; i < predef_channel_count; i++, predef_chan++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if (!predef_chan->name[0]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		/* Valid "Channel" section */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		puts( "[CHANNEL]" ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		printf( "  Name = %s\n", Conf_Channel[i].name ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		printf( "  Modes = %s\n", Conf_Channel[i].modes ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		printf( "  Key = %s\n", Conf_Channel[i].key ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		printf( "  MaxUsers = %lu\n", Conf_Channel[i].maxusers ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		topic = (char*)array_start(&Conf_Channel[i].topic); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		printf( "  Topic = %s\n\n", topic ? topic : ""); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		printf("  Name = %s\n", predef_chan->name); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		printf("  Modes = %s\n", predef_chan->modes); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		printf("  Key = %s\n", predef_chan->key); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		printf("  MaxUsers = %lu\n", predef_chan->maxusers); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		printf("  Topic = %s\n", predef_chan->topic); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		printf("  KeyFile = %s\n\n", predef_chan->keyfile); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	return (config_valid ? 0 : 1); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -351,7 +419,7 @@ Conf_GetServer( CONN_ID Idx ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 GLOBAL bool 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-Conf_EnableServer( char *Name, UINT16 Port ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Conf_EnableServer( const char *Name, UINT16 Port ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	/* Enable specified server and adjust port */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -364,7 +432,7 @@ Conf_EnableServer( char *Name, UINT16 Port ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			/* Gotcha! Set port and enable server: */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			Conf_Server[i].port = Port; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			Conf_Server[i].flags &= ~CONF_SFLAG_DISABLED; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			return true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return (Conf_Server[i].port && Conf_Server[i].host[0]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	return false; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -390,7 +458,7 @@ Conf_EnablePassiveServer(const char *Name) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 GLOBAL bool 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-Conf_DisableServer( char *Name ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Conf_DisableServer( const char *Name ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	/* Enable specified server and adjust port */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -411,7 +479,7 @@ Conf_DisableServer( char *Name ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 GLOBAL bool 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-Conf_AddServer( char *Name, UINT16 Port, char *Host, char *MyPwd, char *PeerPwd ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Conf_AddServer( const char *Name, UINT16 Port, const char *Host, const char *MyPwd, const char *PeerPwd ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	/* Add new server to configuration */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -441,64 +509,85 @@ Conf_AddServer( char *Name, UINT16 Port, char *Host, char *MyPwd, char *PeerPwd 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } /* Conf_AddServer */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-static void 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-Set_Defaults( bool InitServers ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * Check if the given nick name is an service 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+GLOBAL bool 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Conf_IsService(int ConfServer, const char *Nick) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	/* Initialize configuration variables with default values. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	int i; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return MatchCaseInsensitive(Conf_Server[ConfServer].svs_mask, Nick); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} /* Conf_IsService */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	strcpy( Conf_ServerName, "" ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	snprintf( Conf_ServerInfo, sizeof Conf_ServerInfo, "%s %s", PACKAGE_NAME, PACKAGE_VERSION ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	strcpy( Conf_ServerPwd, "" ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	strcpy( Conf_ServerAdmin1, "" ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	strcpy( Conf_ServerAdmin2, "" ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	strcpy( Conf_ServerAdminMail, "" ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * Initialize configuration settings with their default values. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static void 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Set_Defaults(bool InitServers) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	int i; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	strlcpy( Conf_MotdFile, SYSCONFDIR, sizeof( Conf_MotdFile )); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	strlcat( Conf_MotdFile, MOTD_FILE, sizeof( Conf_MotdFile )); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	strcpy(Conf_ServerName, ""); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	snprintf(Conf_ServerInfo, sizeof Conf_ServerInfo, "%s %s", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		 PACKAGE_NAME, PACKAGE_VERSION); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	strcpy(Conf_ServerPwd, ""); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	strlcpy( Conf_MotdPhrase, MOTD_PHRASE, sizeof( Conf_MotdPhrase )); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	strcpy(Conf_ServerAdmin1, ""); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	strcpy(Conf_ServerAdmin2, ""); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	strcpy(Conf_ServerAdminMail, ""); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	strlcpy( Conf_Chroot, CHROOT_DIR, sizeof( Conf_Chroot )); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	strlcpy(Conf_MotdFile, SYSCONFDIR, sizeof(Conf_MotdFile)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	strlcat(Conf_MotdFile, MOTD_FILE, sizeof(Conf_MotdFile)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	strlcpy(Conf_MotdPhrase, MOTD_PHRASE, sizeof(Conf_MotdPhrase)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	strlcpy( Conf_PidFile, PID_FILE, sizeof( Conf_PidFile )); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	Conf_UID = Conf_GID = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	strlcpy(Conf_Chroot, CHROOT_DIR, sizeof(Conf_Chroot)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	strlcpy(Conf_PidFile, PID_FILE, sizeof(Conf_PidFile)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	free(Conf_ListenAddress); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	Conf_ListenAddress = NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	Conf_UID = Conf_GID = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	Conf_PingTimeout = 120; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	Conf_PongTimeout = 20; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	Conf_ConnectRetry = 60; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	Conf_NoDNS = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	Conf_NoIdent = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	Conf_Oper_Count = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	Conf_Channel_Count = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	Conf_OperCanMode = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	Conf_NoDNS = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	Conf_PredefChannelsOnly = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	Conf_OperServerMode = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	Conf_AllowRemoteOper = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	Conf_PredefChannelsOnly = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	Conf_ConnectIPv4 = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	Conf_ConnectIPv6 = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-#ifdef WANT_IPV6 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	Conf_ListenIPv4 = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	Conf_ListenIPv6 = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-#endif 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	Conf_MaxConnections = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	Conf_MaxConnectionsIP = 5; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	Conf_MaxJoins = 10; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	Conf_MaxNickLength = CLIENT_NICK_LEN_DEFAULT; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	/* Initialize server configuration structures */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if( InitServers ) for( i = 0; i < MAX_SERVERS; Init_Server_Struct( &Conf_Server[i++] )); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (InitServers) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		for (i = 0; i < MAX_SERVERS; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		     Init_Server_Struct(&Conf_Server[i++])); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } /* Set_Defaults */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 static bool 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+no_listenports(void) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	size_t cnt = array_bytes(&Conf_ListenPorts); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#ifdef SSL_SUPPORT 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	cnt += array_bytes(&Conf_SSLOptions.ListenPorts); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#endif 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return cnt == 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static bool 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 Read_Config( bool ngircd_starting ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	/* Read configuration file. */ 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -560,7 +649,9 @@ Read_Config( bool ngircd_starting ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	strcpy( section, "" ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	Init_Server_Struct( &New_Server ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	New_Server_Idx = NONE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#ifdef SSL_SUPPORT 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	ConfSSL_Init(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#endif 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	/* Read configuration file */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	while( true ) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if( ! fgets( str, LINE_LEN, fd )) break; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -615,20 +706,11 @@ Read_Config( bool ngircd_starting ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				else New_Server_Idx = i; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			if( strcasecmp( section, "[CHANNEL]" ) == 0 ) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				if( Conf_Channel_Count + 1 > MAX_DEFCHANNELS ) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					Config_Error( LOG_ERR, "Too many pre-defined channels configured." ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					/* Initialize new channel structure */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					strcpy( Conf_Channel[Conf_Channel_Count].name, "" ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					strcpy( Conf_Channel[Conf_Channel_Count].modes, "" ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					strcpy( Conf_Channel[Conf_Channel_Count].key, "" ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					Conf_Channel[Conf_Channel_Count].maxusers = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					array_free(&Conf_Channel[Conf_Channel_Count].topic); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					Conf_Channel_Count++; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if (strcasecmp(section, "[CHANNEL]") == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				Conf_Channel_Count++; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			Config_Error( LOG_ERR, "%s, line %d: Unknown section \"%s\"!", NGIRCd_ConfFile, line, section ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			section[0] = 0x1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -661,26 +743,19 @@ Read_Config( bool ngircd_starting ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		Conf_Server[New_Server_Idx] = New_Server; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if (0 == array_length(&Conf_ListenPorts, sizeof(UINT16))) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if (!array_copyb(&Conf_ListenPorts, (char*) &defaultport, sizeof defaultport)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			Config_Error( LOG_ALERT, "Could not add default listening Port %u: %s", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-							(unsigned int) defaultport, strerror(errno)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			exit( 1 ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	/* not a single listening port? Add default. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (no_listenports() && 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		!array_copyb(&Conf_ListenPorts, (char*) &defaultport, sizeof defaultport)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Config_Error(LOG_ALERT, "Could not add default listening Port %u: %s", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					(unsigned int) defaultport, strerror(errno)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if (!Conf_ListenAddress) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		/* no Listen addresses configured, use default */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-#ifdef WANT_IPV6 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		/* Conf_ListenIPv6/4 should no longer be used */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if (Conf_ListenIPv6 && Conf_ListenIPv4) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			Conf_ListenAddress = strdup_warn("::,0.0.0.0"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		else if (Conf_ListenIPv6) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			Conf_ListenAddress = strdup_warn("::"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-#endif 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Conf_ListenAddress = strdup_warn("0.0.0.0"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		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); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -873,29 +948,21 @@ 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) { /* DEPRECATED, option appeared in 0.12.0 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		/* 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		 * listen on ipv6 sockets, if available? 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		 * Deprecated use "Listen = 0.0.0.0" (or, rather, do not list "::") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Conf_ListenIPv6 = Check_ArgIsTrue( Arg ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Config_Error(LOG_WARNING, "%s, line %d: %s=%s is deprecated, %sinclude '::' in \"Listen =\" option instead", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				NGIRCd_ConfFile, Line, Var, yesno_to_str(Conf_ListenIPv6), Conf_ListenIPv6 ? " ":"do not "); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if (strcasecmp(Var, "ListenIPv4") == 0) { /* DEPRECATED, option appeared in 0.12.0 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		/* 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		 * listen on ipv4 sockets, if available? 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		 * this allows "ipv6-only" setups 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		 * Deprecated use "Listen = ::" (or, rather, do not list "0.0.0.0") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Conf_ListenIPv4 = Check_ArgIsTrue( Arg ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Config_Error(LOG_WARNING, "%s, line %d: %s=%s is deprecated, %sinclude '0.0.0.0' in \"Listen =\" option instead", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				NGIRCd_ConfFile, Line, Var, yesno_to_str(Conf_ListenIPv4), Conf_ListenIPv4 ? " ":"do not "); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (strcasecmp(Var, "NoIdent") == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		/* don't do IDENT lookups when clients connect? */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Conf_NoIdent = Check_ArgIsTrue(Arg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#ifndef IDENTAUTH 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if (!Conf_NoIdent) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			/* user has enabled ident lookups explicitly, but ... */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			Config_Error(LOG_WARNING, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				"%s: line %d: NoIdent=False, but ngircd was built without IDENT support", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				NGIRCd_ConfFile, Line); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#endif 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#ifdef WANT_IPV6 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	/* the default setting for all the WANT_IPV6 special options is 'true' */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if( strcasecmp( Var, "ConnectIPv6" ) == 0 ) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		/* connect to other hosts using ipv6, if they have an AAAA record? */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		Conf_ConnectIPv6 = Check_ArgIsTrue( Arg ); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -918,6 +985,11 @@ Handle_GLOBAL( int Line, char *Var, char *Arg ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		Conf_OperServerMode = Check_ArgIsTrue( Arg ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if(strcasecmp(Var, "AllowRemoteOper") == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		/* Are remote IRC operators allowed to control this server? */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Conf_AllowRemoteOper = Check_ArgIsTrue(Arg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if( strcasecmp( Var, "MaxConnections" ) == 0 ) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		/* Maximum number of connections. 0 -> "no limit". */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #ifdef HAVE_ISDIGIT 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -970,6 +1042,37 @@ Handle_GLOBAL( int Line, char *Var, char *Arg ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#ifdef SSL_SUPPORT 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if( strcasecmp( Var, "SSLPorts" ) == 0 ) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		ports_parse(&Conf_SSLOptions.ListenPorts, Line, Arg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if( strcasecmp( Var, "SSLKeyFile" ) == 0 ) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		assert(Conf_SSLOptions.KeyFile == NULL ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Conf_SSLOptions.KeyFile = strdup_warn(Arg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if( strcasecmp( Var, "SSLCertFile" ) == 0 ) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		assert(Conf_SSLOptions.CertFile == NULL ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Conf_SSLOptions.CertFile = strdup_warn(Arg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if( strcasecmp( Var, "SSLKeyFilePassword" ) == 0 ) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		assert(array_bytes(&Conf_SSLOptions.KeyFilePassword) == 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if (!array_copys(&Conf_SSLOptions.KeyFilePassword, Arg)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			Config_Error( LOG_ERR, "%s, line %d (section \"Global\"): Could not copy %s: %s!", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+								NGIRCd_ConfFile, Line, Var, strerror(errno)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if( strcasecmp( Var, "SSLDHFile" ) == 0 ) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		assert(Conf_SSLOptions.DHFile == NULL); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Conf_SSLOptions.DHFile = strdup_warn( Arg ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#endif 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	Config_Error(LOG_ERR, "%s, line %d (section \"Global\"): Unknown variable \"%s\"!", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 								NGIRCd_ConfFile, Line, Var); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } /* Handle_GLOBAL */ 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1079,6 +1182,12 @@ Handle_SERVER( int Line, char *Var, char *Arg ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 										NGIRCd_ConfFile, Line, port ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#ifdef SSL_SUPPORT 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if( strcasecmp( Var, "SSLConnect" ) == 0 ) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		New_Server.SSLConnect = Check_ArgIsTrue(Arg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#endif 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if( strcasecmp( Var, "Group" ) == 0 ) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		/* Server group */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #ifdef HAVE_ISDIGIT 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1094,19 +1203,30 @@ Handle_SERVER( int Line, char *Var, char *Arg ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			New_Server.flags |= CONF_SFLAG_DISABLED; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (strcasecmp(Var, "ServiceMask") == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		len = strlcpy(New_Server.svs_mask, ngt_LowerStr(Arg), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			      sizeof(New_Server.svs_mask)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if (len >= sizeof(New_Server.svs_mask)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			Config_Error_TooLong(Line, Var); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	Config_Error( LOG_ERR, "%s, line %d (section \"Server\"): Unknown variable \"%s\"!", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 								NGIRCd_ConfFile, Line, Var ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } /* Handle_SERVER */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 static bool 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-Handle_Channelname(size_t chancount, const char *name) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Handle_Channelname(struct Conf_Channel *new_chan, const char *name) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	size_t size = sizeof( Conf_Channel[chancount].name ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	char *dest = Conf_Channel[chancount].name; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	size_t size = sizeof(new_chan->name); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	char *dest = new_chan->name; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if (*name && *name != '#') { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (!Channel_IsValidName(name)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		/* 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		 * maybe user forgot to add a '#'. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		 * This is only here for user convenience. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		*dest = '#'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		--size; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		++dest; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1116,51 +1236,64 @@ Handle_Channelname(size_t chancount, const char *name) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 static void 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-Handle_CHANNEL( int Line, char *Var, char *Arg ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Handle_CHANNEL(int Line, char *Var, char *Arg) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	size_t len; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	size_t chancount = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	size_t chancount; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	struct Conf_Channel *chan; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	assert( Line > 0 ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	assert( Var != NULL ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	assert( Arg != NULL ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if (Conf_Channel_Count > 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		chancount = Conf_Channel_Count - 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	assert(Conf_Channel_Count > 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if( strcasecmp( Var, "Name" ) == 0 ) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if (!Handle_Channelname(chancount, Arg)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			Config_Error_TooLong( Line, Var ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	chancount = Conf_Channel_Count - 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	chan = array_alloc(&Conf_Channels, sizeof(*chan), chancount); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (!chan) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Config_Error(LOG_ERR, "Could not allocate memory for predefined channel (%d:%s = %s)", Line, Var, Arg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if( strcasecmp( Var, "Modes" ) == 0 ) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (strcasecmp(Var, "Name") == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if (!Handle_Channelname(chan, Arg)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			Config_Error_TooLong(Line, Var); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (strcasecmp(Var, "Modes") == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		/* Initial modes */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		len = strlcpy( Conf_Channel[chancount].modes, Arg, sizeof( Conf_Channel[chancount].modes )); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if (len >= sizeof( Conf_Channel[chancount].modes )) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		len = strlcpy(chan->modes, Arg, sizeof(chan->modes)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if (len >= sizeof(chan->modes)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			Config_Error_TooLong( Line, Var ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if( strcasecmp( Var, "Topic" ) == 0 ) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		/* Initial topic */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if (!array_copys( &Conf_Channel[chancount].topic, Arg)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		len = strlcpy(chan->topic, Arg, sizeof(chan->topic)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if (len >= sizeof(chan->topic)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			Config_Error_TooLong( Line, Var ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if( strcasecmp( Var, "Key" ) == 0 ) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		/* Initial Channel Key (mode k) */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		len = strlcpy(Conf_Channel[chancount].key, Arg, sizeof(Conf_Channel[chancount].key)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if (len >= sizeof( Conf_Channel[chancount].key )) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		len = strlcpy(chan->key, Arg, sizeof(chan->key)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if (len >= sizeof(chan->key)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			Config_Error_TooLong(Line, Var); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if( strcasecmp( Var, "MaxUsers" ) == 0 ) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		/* maximum user limit, mode l */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Conf_Channel[chancount].maxusers = (unsigned long) atol(Arg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if (Conf_Channel[chancount].maxusers == 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		chan->maxusers = (unsigned long) atol(Arg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if (chan->maxusers == 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			Config_Error_NaN(Line, Var); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (strcasecmp(Var, "KeyFile") == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		/* channel keys */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		len = strlcpy(chan->keyfile, Arg, sizeof(chan->keyfile)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if (len >= sizeof(chan->keyfile)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			Config_Error_TooLong(Line, Var); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	Config_Error( LOG_ERR, "%s, line %d (section \"Channel\"): Unknown variable \"%s\"!", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 								NGIRCd_ConfFile, Line, Var ); 
			 |