X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fngircd%2Fconf.c;h=5619a6c78e9f6c0840300bb3daba6c67a8ffd404;hb=355828e64f6fa07eb96bc6b27eef964b529d8778;hp=fae2a28c453efc943e419526fd72fecbb864d789;hpb=28ca31e5761c0f5e746fcd0f4cdfac98e344bdb7;p=ngircd-alex.git diff --git a/src/ngircd/conf.c b/src/ngircd/conf.c index fae2a28c..5619a6c7 100644 --- a/src/ngircd/conf.c +++ b/src/ngircd/conf.c @@ -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,12 +39,10 @@ #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" @@ -57,6 +55,8 @@ 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 )); @@ -291,16 +291,19 @@ 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); + 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); @@ -330,6 +333,7 @@ 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)); #ifdef WANT_IPV6 printf(" ConnectIPv4 = %s\n", yesno_to_str(Conf_ConnectIPv6)); @@ -565,7 +569,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)); @@ -579,6 +582,7 @@ Set_Defaults(bool InitServers) Conf_ConnectRetry = 60; Conf_NoDNS = false; Conf_NoIdent = false; + Conf_NoPAM = false; Conf_Oper_Count = 0; Conf_Channel_Count = 0; @@ -614,6 +618,36 @@ 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); + + 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 ) { @@ -777,6 +811,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 */ @@ -813,6 +851,7 @@ static unsigned int Handle_MaxNickLength(int Line, const char *Arg) } /* Handle_MaxNickLength */ + static void Handle_GLOBAL( int Line, char *Var, char *Arg ) { @@ -845,6 +884,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 )); @@ -872,17 +918,24 @@ 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)); return; } if( strcasecmp( Var, "ChrootDir" ) == 0 ) { @@ -978,6 +1031,11 @@ 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; + } #ifdef WANT_IPV6 /* the default setting for all the WANT_IPV6 special options is 'true' */ if( strcasecmp( Var, "ConnectIPv6" ) == 0 ) { @@ -1395,6 +1453,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++) { @@ -1460,6 +1524,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 ) { @@ -1474,7 +1561,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 */