/*
* 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
#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"
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 ));
}
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);
+ printf(" MotdFile = %s\n", Conf_MotdFile);
+ printf(" MotdPhrase = %.32s\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);
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);
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));
#ifdef WANT_IPV6
printf(" ConnectIPv4 = %s\n", yesno_to_str(Conf_ConnectIPv6));
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));
Conf_ConnectRetry = 60;
Conf_NoDNS = false;
Conf_NoIdent = false;
+ Conf_NoPAM = false;
Conf_Oper_Count = 0;
Conf_Channel_Count = 0;
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;
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);
+
+ 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 )
{
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 */
} /* Handle_MaxNickLength */
+
static void
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 ));
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));
return;
}
if( strcasecmp( Var, "ChrootDir" ) == 0 ) {
#endif
return;
}
+ if(strcasecmp(Var, "NoPAM") == 0) {
+ /* don't use PAM library to authenticate users */
+ Conf_NoPAM = Check_ArgIsTrue(Arg);
+ return;
+ }
#ifdef WANT_IPV6
/* the default setting for all the WANT_IPV6 special options is 'true' */
if( strcasecmp( Var, "ConnectIPv6" ) == 0 ) {
Conf_SSLOptions.DHFile = strdup_warn( 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);
"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++) {
} /* 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 )
{
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 */