|
@@ -1,6 +1,6 @@
|
|
|
/*
|
|
|
* ngIRCd -- The Next Generation IRC Daemon
|
|
|
- * Copyright (c)2001-2009 Alexander Barton (alex@barton.de)
|
|
|
+ * Copyright (c)2001-2010 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
|
|
@@ -39,23 +39,24 @@
|
|
|
#include "array.h"
|
|
|
#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"
|
|
|
|
|
|
#include "exp.h"
|
|
|
#include "conf.h"
|
|
|
|
|
|
|
|
|
-static bool Use_Log = true;
|
|
|
+static bool Use_Log = true, Using_MotdFile = true;
|
|
|
static CONF_SERVER New_Server;
|
|
|
static int New_Server_Idx;
|
|
|
|
|
|
+static size_t Conf_Oper_Count;
|
|
|
static size_t Conf_Channel_Count;
|
|
|
+static char Conf_MotdFile[FNAME_LEN];
|
|
|
+
|
|
|
static void Set_Defaults PARAMS(( bool InitServers ));
|
|
|
static bool Read_Config PARAMS(( bool ngircd_starting ));
|
|
|
static bool Validate_Config PARAMS(( bool TestOnly, bool Rehash ));
|
|
@@ -226,6 +227,41 @@ yesno_to_str(int boolean_value)
|
|
|
}
|
|
|
|
|
|
|
|
|
+static void
|
|
|
+opers_free(void)
|
|
|
+{
|
|
|
+ struct Conf_Oper *op;
|
|
|
+ size_t len;
|
|
|
+
|
|
|
+ len = array_length(&Conf_Opers, sizeof(*op));
|
|
|
+ op = array_start(&Conf_Opers);
|
|
|
+ while (len--) {
|
|
|
+ free(op->mask);
|
|
|
+ op++;
|
|
|
+ }
|
|
|
+ array_free(&Conf_Opers);
|
|
|
+}
|
|
|
+
|
|
|
+static void
|
|
|
+opers_puts(void)
|
|
|
+{
|
|
|
+ struct Conf_Oper *op;
|
|
|
+ size_t len;
|
|
|
+
|
|
|
+ len = array_length(&Conf_Opers, sizeof(*op));
|
|
|
+ op = array_start(&Conf_Opers);
|
|
|
+ while (len--) {
|
|
|
+ assert(op->name[0]);
|
|
|
+
|
|
|
+ puts("[OPERATOR]");
|
|
|
+ printf(" Name = %s\n", op->name);
|
|
|
+ printf(" Password = %s\n", op->pwd);
|
|
|
+ printf(" Mask = %s\n\n", op->mask ? op->mask : "");
|
|
|
+ op++;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
GLOBAL int
|
|
|
Conf_Test( void )
|
|
|
{
|
|
@@ -255,16 +291,25 @@ Conf_Test( void )
|
|
|
}
|
|
|
|
|
|
puts( "[GLOBAL]" );
|
|
|
- printf( " Name = %s\n", Conf_ServerName );
|
|
|
- printf( " Info = %s\n", Conf_ServerInfo );
|
|
|
- printf( " Password = %s\n", Conf_ServerPwd );
|
|
|
- printf( " AdminInfo1 = %s\n", Conf_ServerAdmin1 );
|
|
|
- printf( " AdminInfo2 = %s\n", Conf_ServerAdmin2 );
|
|
|
- printf( " AdminEMail = %s\n", Conf_ServerAdminMail );
|
|
|
- printf( " MotdFile = %s\n", Conf_MotdFile );
|
|
|
- printf( " MotdPhrase = %s\n", Conf_MotdPhrase );
|
|
|
- printf( " ChrootDir = %s\n", Conf_Chroot );
|
|
|
- printf( " PidFile = %s\n", Conf_PidFile);
|
|
|
+ printf(" Name = %s\n", Conf_ServerName);
|
|
|
+ printf(" Info = %s\n", Conf_ServerInfo);
|
|
|
+#ifndef PAM
|
|
|
+ printf(" Password = %s\n", Conf_ServerPwd);
|
|
|
+#endif
|
|
|
+ printf(" WebircPassword = %s\n", Conf_WebircPwd);
|
|
|
+ printf(" AdminInfo1 = %s\n", Conf_ServerAdmin1);
|
|
|
+ printf(" AdminInfo2 = %s\n", Conf_ServerAdmin2);
|
|
|
+ printf(" AdminEMail = %s\n", Conf_ServerAdminMail);
|
|
|
+ if (Using_MotdFile) {
|
|
|
+ printf(" MotdFile = %s\n", Conf_MotdFile);
|
|
|
+ printf(" MotdPhrase =\n");
|
|
|
+ } else {
|
|
|
+ printf(" MotdFile = \n");
|
|
|
+ printf(" MotdPhrase = %s\n", array_bytes(&Conf_Motd)
|
|
|
+ ? (const char*) array_start(&Conf_Motd) : "");
|
|
|
+ }
|
|
|
+ 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);
|
|
@@ -285,6 +330,10 @@ Conf_Test( void )
|
|
|
printf(" ServerGID = %s\n", grp->gr_name);
|
|
|
else
|
|
|
printf(" ServerGID = %ld\n", (long)Conf_GID);
|
|
|
+#ifdef SYSLOG
|
|
|
+ printf(" SyslogFacility = %s\n",
|
|
|
+ ngt_SyslogFacilityName(Conf_SyslogFacility));
|
|
|
+#endif
|
|
|
printf(" PingTimeout = %d\n", Conf_PingTimeout);
|
|
|
printf(" PongTimeout = %d\n", Conf_PongTimeout);
|
|
|
printf(" ConnectRetry = %d\n", Conf_ConnectRetry);
|
|
@@ -294,6 +343,8 @@ Conf_Test( void )
|
|
|
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));
|
|
|
+ printf(" NoPAM = %s\n", yesno_to_str(Conf_NoPAM));
|
|
|
+ printf(" NoZeroConf = %s\n", yesno_to_str(Conf_NoZeroConf));
|
|
|
|
|
|
#ifdef WANT_IPV6
|
|
|
printf(" ConnectIPv4 = %s\n", yesno_to_str(Conf_ConnectIPv6));
|
|
@@ -304,16 +355,7 @@ Conf_Test( void )
|
|
|
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;
|
|
|
-
|
|
|
- /* Valid "Operator" section */
|
|
|
- puts( "[OPERATOR]" );
|
|
|
- printf( " Name = %s\n", Conf_Oper[i].name );
|
|
|
- printf( " Password = %s\n", Conf_Oper[i].pwd );
|
|
|
- if ( Conf_Oper[i].mask ) printf( " Mask = %s\n", Conf_Oper[i].mask );
|
|
|
- puts( "" );
|
|
|
- }
|
|
|
+ opers_puts();
|
|
|
|
|
|
for( i = 0; i < MAX_SERVERS; i++ ) {
|
|
|
if( ! Conf_Server[i].name[0] ) continue;
|
|
@@ -538,7 +580,6 @@ Set_Defaults(bool InitServers)
|
|
|
|
|
|
strlcpy(Conf_MotdFile, SYSCONFDIR, sizeof(Conf_MotdFile));
|
|
|
strlcat(Conf_MotdFile, MOTD_FILE, sizeof(Conf_MotdFile));
|
|
|
- strlcpy(Conf_MotdPhrase, MOTD_PHRASE, sizeof(Conf_MotdPhrase));
|
|
|
|
|
|
Conf_UID = Conf_GID = 0;
|
|
|
strlcpy(Conf_Chroot, CHROOT_DIR, sizeof(Conf_Chroot));
|
|
@@ -552,6 +593,8 @@ Set_Defaults(bool InitServers)
|
|
|
Conf_ConnectRetry = 60;
|
|
|
Conf_NoDNS = false;
|
|
|
Conf_NoIdent = false;
|
|
|
+ Conf_NoPAM = false;
|
|
|
+ Conf_NoZeroConf = false;
|
|
|
|
|
|
Conf_Oper_Count = 0;
|
|
|
Conf_Channel_Count = 0;
|
|
@@ -569,6 +612,14 @@ Set_Defaults(bool InitServers)
|
|
|
Conf_MaxJoins = 10;
|
|
|
Conf_MaxNickLength = CLIENT_NICK_LEN_DEFAULT;
|
|
|
|
|
|
+#ifdef SYSLOG
|
|
|
+#ifdef LOG_LOCAL5
|
|
|
+ Conf_SyslogFacility = LOG_LOCAL5;
|
|
|
+#else
|
|
|
+ Conf_SyslogFacility = 0;
|
|
|
+#endif
|
|
|
+#endif
|
|
|
+
|
|
|
/* Initialize server configuration structures */
|
|
|
if (InitServers) {
|
|
|
for (i = 0; i < MAX_SERVERS;
|
|
@@ -587,6 +638,37 @@ no_listenports(void)
|
|
|
return cnt == 0;
|
|
|
}
|
|
|
|
|
|
+static void
|
|
|
+Read_Motd(const char *filename)
|
|
|
+{
|
|
|
+ char line[127];
|
|
|
+ FILE *fp;
|
|
|
+
|
|
|
+ if (*filename == '\0')
|
|
|
+ return;
|
|
|
+
|
|
|
+ fp = fopen(filename, "r");
|
|
|
+ if (!fp) {
|
|
|
+ Log(LOG_WARNING, "Can't read MOTD file \"%s\": %s",
|
|
|
+ filename, strerror(errno));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ array_free(&Conf_Motd);
|
|
|
+ Using_MotdFile = true;
|
|
|
+
|
|
|
+ while (fgets(line, (int)sizeof line, fp)) {
|
|
|
+ ngt_TrimLastChr( line, '\n');
|
|
|
+
|
|
|
+ /* add text including \0 */
|
|
|
+ if (!array_catb(&Conf_Motd, line, strlen(line) + 1)) {
|
|
|
+ Log(LOG_WARNING, "Cannot add MOTD text: %s", strerror(errno));
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ fclose(fp);
|
|
|
+}
|
|
|
+
|
|
|
static bool
|
|
|
Read_Config( bool ngircd_starting )
|
|
|
{
|
|
@@ -609,6 +691,7 @@ Read_Config( bool ngircd_starting )
|
|
|
exit( 1 );
|
|
|
}
|
|
|
|
|
|
+ opers_free();
|
|
|
Set_Defaults( ngircd_starting );
|
|
|
|
|
|
Config_Error( LOG_INFO, "Reading configuration from \"%s\" ...", NGIRCd_ConfFile );
|
|
@@ -667,21 +750,6 @@ Read_Config( bool ngircd_starting )
|
|
|
if( strcasecmp( section, "[GLOBAL]" ) == 0 )
|
|
|
continue;
|
|
|
|
|
|
- if( strcasecmp( section, "[OPERATOR]" ) == 0 ) {
|
|
|
- if( Conf_Oper_Count + 1 > MAX_OPERATORS )
|
|
|
- Config_Error( LOG_ERR, "Too many operators configured.");
|
|
|
- else {
|
|
|
- /* Initialize new operator structure */
|
|
|
- Conf_Oper[Conf_Oper_Count].name[0] = '\0';
|
|
|
- Conf_Oper[Conf_Oper_Count].pwd[0] = '\0';
|
|
|
- if (Conf_Oper[Conf_Oper_Count].mask) {
|
|
|
- free(Conf_Oper[Conf_Oper_Count].mask );
|
|
|
- Conf_Oper[Conf_Oper_Count].mask = NULL;
|
|
|
- }
|
|
|
- Conf_Oper_Count++;
|
|
|
- }
|
|
|
- continue;
|
|
|
- }
|
|
|
if( strcasecmp( section, "[SERVER]" ) == 0 ) {
|
|
|
/* Check if there is already a server to add */
|
|
|
if( New_Server.name[0] ) {
|
|
@@ -710,6 +778,10 @@ Read_Config( bool ngircd_starting )
|
|
|
Conf_Channel_Count++;
|
|
|
continue;
|
|
|
}
|
|
|
+ if (strcasecmp(section, "[OPERATOR]") == 0) {
|
|
|
+ Conf_Oper_Count++;
|
|
|
+ continue;
|
|
|
+ }
|
|
|
|
|
|
Config_Error( LOG_ERR, "%s, line %d: Unknown section \"%s\"!", NGIRCd_ConfFile, line, section );
|
|
|
section[0] = 0x1;
|
|
@@ -760,6 +832,10 @@ Read_Config( bool ngircd_starting )
|
|
|
Config_Error(LOG_ALERT, "%s exiting due to fatal errors!", PACKAGE_NAME);
|
|
|
exit(1);
|
|
|
}
|
|
|
+
|
|
|
+ /* No MOTD phrase configured? (re)try motd file. */
|
|
|
+ if (array_bytes(&Conf_Motd) == 0)
|
|
|
+ Read_Motd(Conf_MotdFile);
|
|
|
return true;
|
|
|
} /* Read_Config */
|
|
|
|
|
@@ -775,7 +851,8 @@ Check_ArgIsTrue( const char *Arg )
|
|
|
} /* Check_ArgIsTrue */
|
|
|
|
|
|
|
|
|
-static unsigned int Handle_MaxNickLength(int Line, const char *Arg)
|
|
|
+static unsigned int
|
|
|
+Handle_MaxNickLength(int Line, const char *Arg)
|
|
|
{
|
|
|
unsigned new;
|
|
|
|
|
@@ -796,6 +873,7 @@ static unsigned int Handle_MaxNickLength(int Line, const char *Arg)
|
|
|
} /* Handle_MaxNickLength */
|
|
|
|
|
|
|
|
|
+
|
|
|
static void
|
|
|
Handle_GLOBAL( int Line, char *Var, char *Arg )
|
|
|
{
|
|
@@ -828,6 +906,13 @@ Handle_GLOBAL( int Line, char *Var, char *Arg )
|
|
|
Config_Error_TooLong( Line, Var );
|
|
|
return;
|
|
|
}
|
|
|
+ if (strcasecmp(Var, "WebircPassword") == 0) {
|
|
|
+ /* Password required for WEBIRC command */
|
|
|
+ len = strlcpy(Conf_WebircPwd, Arg, sizeof(Conf_WebircPwd));
|
|
|
+ if (len >= sizeof(Conf_WebircPwd))
|
|
|
+ Config_Error_TooLong(Line, Var);
|
|
|
+ return;
|
|
|
+ }
|
|
|
if( strcasecmp( Var, "AdminInfo1" ) == 0 ) {
|
|
|
/* Administrative info #1 */
|
|
|
len = strlcpy( Conf_ServerAdmin1, Arg, sizeof( Conf_ServerAdmin1 ));
|
|
@@ -855,17 +940,25 @@ Handle_GLOBAL( int Line, char *Var, char *Arg )
|
|
|
return;
|
|
|
}
|
|
|
if( strcasecmp( Var, "MotdFile" ) == 0 ) {
|
|
|
- /* "Message of the day" (MOTD) file */
|
|
|
len = strlcpy( Conf_MotdFile, Arg, sizeof( Conf_MotdFile ));
|
|
|
if (len >= sizeof( Conf_MotdFile ))
|
|
|
Config_Error_TooLong( Line, Var );
|
|
|
+ Read_Motd(Arg);
|
|
|
return;
|
|
|
}
|
|
|
if( strcasecmp( Var, "MotdPhrase" ) == 0 ) {
|
|
|
/* "Message of the day" phrase (instead of file) */
|
|
|
- len = strlcpy( Conf_MotdPhrase, Arg, sizeof( Conf_MotdPhrase ));
|
|
|
- if (len >= sizeof( Conf_MotdPhrase ))
|
|
|
+ len = strlen(Arg);
|
|
|
+ if (len == 0)
|
|
|
+ return;
|
|
|
+ if (len >= LINE_LEN) {
|
|
|
Config_Error_TooLong( Line, Var );
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (!array_copyb(&Conf_Motd, Arg, len + 1))
|
|
|
+ Config_Error(LOG_WARNING, "%s, line %d: Could not append MotdPhrase: %s",
|
|
|
+ NGIRCd_ConfFile, Line, strerror(errno));
|
|
|
+ Using_MotdFile = false;
|
|
|
return;
|
|
|
}
|
|
|
if( strcasecmp( Var, "ChrootDir" ) == 0 ) {
|
|
@@ -961,6 +1054,16 @@ Handle_GLOBAL( int Line, char *Var, char *Arg )
|
|
|
#endif
|
|
|
return;
|
|
|
}
|
|
|
+ if(strcasecmp(Var, "NoPAM") == 0) {
|
|
|
+ /* don't use PAM library to authenticate users */
|
|
|
+ Conf_NoPAM = Check_ArgIsTrue(Arg);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if(strcasecmp(Var, "NoZeroConf") == 0) {
|
|
|
+ /* don't register services using ZeroConf */
|
|
|
+ Conf_NoZeroConf = Check_ArgIsTrue(Arg);
|
|
|
+ return;
|
|
|
+ }
|
|
|
#ifdef WANT_IPV6
|
|
|
/* the default setting for all the WANT_IPV6 special options is 'true' */
|
|
|
if( strcasecmp( Var, "ConnectIPv6" ) == 0 ) {
|
|
@@ -1073,6 +1176,13 @@ Handle_GLOBAL( int Line, char *Var, char *Arg )
|
|
|
return;
|
|
|
}
|
|
|
#endif
|
|
|
+#ifdef SYSLOG
|
|
|
+ if (strcasecmp(Var, "SyslogFacility") == 0) {
|
|
|
+ Conf_SyslogFacility = ngt_SyslogFacilityID(Arg,
|
|
|
+ Conf_SyslogFacility);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+#endif
|
|
|
Config_Error(LOG_ERR, "%s, line %d (section \"Global\"): Unknown variable \"%s\"!",
|
|
|
NGIRCd_ConfFile, Line, Var);
|
|
|
} /* Handle_GLOBAL */
|
|
@@ -1081,36 +1191,38 @@ Handle_GLOBAL( int Line, char *Var, char *Arg )
|
|
|
static void
|
|
|
Handle_OPERATOR( int Line, char *Var, char *Arg )
|
|
|
{
|
|
|
- unsigned int opercount;
|
|
|
size_t len;
|
|
|
+ struct Conf_Oper *op;
|
|
|
+
|
|
|
assert( Line > 0 );
|
|
|
assert( Var != NULL );
|
|
|
assert( Arg != NULL );
|
|
|
assert( Conf_Oper_Count > 0 );
|
|
|
|
|
|
- if ( Conf_Oper_Count == 0 )
|
|
|
+ op = array_alloc(&Conf_Opers, sizeof(*op), Conf_Oper_Count - 1);
|
|
|
+ if (!op) {
|
|
|
+ Config_Error(LOG_ERR, "Could not allocate memory for operator (%d:%s = %s)", Line, Var, Arg);
|
|
|
return;
|
|
|
+ }
|
|
|
|
|
|
- opercount = Conf_Oper_Count - 1;
|
|
|
-
|
|
|
- if( strcasecmp( Var, "Name" ) == 0 ) {
|
|
|
+ if (strcasecmp(Var, "Name") == 0) {
|
|
|
/* Name of IRC operator */
|
|
|
- len = strlcpy( Conf_Oper[opercount].name, Arg, sizeof( Conf_Oper[opercount].name ));
|
|
|
- if (len >= sizeof( Conf_Oper[opercount].name ))
|
|
|
- Config_Error_TooLong( Line, Var );
|
|
|
+ len = strlcpy(op->name, Arg, sizeof(op->name));
|
|
|
+ if (len >= sizeof(op->name))
|
|
|
+ Config_Error_TooLong(Line, Var);
|
|
|
return;
|
|
|
}
|
|
|
- if( strcasecmp( Var, "Password" ) == 0 ) {
|
|
|
+ if (strcasecmp(Var, "Password") == 0) {
|
|
|
/* Password of IRC operator */
|
|
|
- len = strlcpy( Conf_Oper[opercount].pwd, Arg, sizeof( Conf_Oper[opercount].pwd ));
|
|
|
- if (len >= sizeof( Conf_Oper[opercount].pwd ))
|
|
|
- Config_Error_TooLong( Line, Var );
|
|
|
+ len = strlcpy(op->pwd, Arg, sizeof(op->pwd));
|
|
|
+ if (len >= sizeof(op->pwd))
|
|
|
+ Config_Error_TooLong(Line, Var);
|
|
|
return;
|
|
|
}
|
|
|
- if( strcasecmp( Var, "Mask" ) == 0 ) {
|
|
|
- if (Conf_Oper[opercount].mask) return; /* Hostname already configured */
|
|
|
-
|
|
|
- Conf_Oper[opercount].mask = strdup_warn( Arg );
|
|
|
+ if (strcasecmp(Var, "Mask") == 0) {
|
|
|
+ if (op->mask)
|
|
|
+ return; /* Hostname already configured */
|
|
|
+ op->mask = strdup_warn( Arg );
|
|
|
return;
|
|
|
}
|
|
|
Config_Error( LOG_ERR, "%s, line %d (section \"Operator\"): Unknown variable \"%s\"!",
|
|
@@ -1376,6 +1488,12 @@ Validate_Config(bool Configtest, bool Rehash)
|
|
|
"No administrative information configured but required by RFC!");
|
|
|
}
|
|
|
|
|
|
+#ifdef PAM
|
|
|
+ if (Conf_ServerPwd[0])
|
|
|
+ Config_Error(LOG_ERR,
|
|
|
+ "This server uses PAM, \"Password\" will be ignored!");
|
|
|
+#endif
|
|
|
+
|
|
|
#ifdef DEBUG
|
|
|
servers = servers_once = 0;
|
|
|
for (i = 0; i < MAX_SERVERS; i++) {
|
|
@@ -1441,6 +1559,29 @@ va_dcl
|
|
|
} /* Config_Error */
|
|
|
|
|
|
|
|
|
+#ifdef DEBUG
|
|
|
+
|
|
|
+GLOBAL void
|
|
|
+Conf_DebugDump(void)
|
|
|
+{
|
|
|
+ int i;
|
|
|
+
|
|
|
+ Log(LOG_DEBUG, "Configured servers:");
|
|
|
+ for (i = 0; i < MAX_SERVERS; i++) {
|
|
|
+ if (! Conf_Server[i].name[0])
|
|
|
+ continue;
|
|
|
+ Log(LOG_DEBUG,
|
|
|
+ " - %s: %s:%d, last=%ld, group=%d, flags=%d, conn=%d",
|
|
|
+ Conf_Server[i].name, Conf_Server[i].host,
|
|
|
+ Conf_Server[i].port, Conf_Server[i].lasttry,
|
|
|
+ Conf_Server[i].group, Conf_Server[i].flags,
|
|
|
+ Conf_Server[i].conn_id);
|
|
|
+ }
|
|
|
+} /* Conf_DebugDump */
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+
|
|
|
static void
|
|
|
Init_Server_Struct( CONF_SERVER *Server )
|
|
|
{
|
|
@@ -1455,7 +1596,7 @@ Init_Server_Struct( CONF_SERVER *Server )
|
|
|
|
|
|
if( NGIRCd_Passive ) Server->flags = CONF_SFLAG_DISABLED;
|
|
|
|
|
|
- Resolve_Init(&Server->res_stat);
|
|
|
+ Proc_InitStruct(&Server->res_stat);
|
|
|
Server->conn_id = NONE;
|
|
|
memset(&Server->bind_addr, 0, sizeof(&Server->bind_addr));
|
|
|
} /* Init_Server_Struct */
|