X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=ngircd-alex.git;a=blobdiff_plain;f=src%2Fngircd%2Fconf.c;h=f18016b5c13f7a852ca61ce688a0048980370ef4;hp=4991918d54ade6d843e249bc61205e867d2ab497;hb=edab86e0f843dc07815477e25a0a6184d7500120;hpb=d99edb7728e058a889e4734f8592f495effa5bc3 diff --git a/src/ngircd/conf.c b/src/ngircd/conf.c index 4991918d..f18016b5 100644 --- a/src/ngircd/conf.c +++ b/src/ngircd/conf.c @@ -55,8 +55,6 @@ 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 )); @@ -265,18 +263,18 @@ static void opers_puts(void) { struct Conf_Oper *op; - size_t len; + size_t count, i; - len = array_length(&Conf_Opers, sizeof(*op)); + count = array_length(&Conf_Opers, sizeof(*op)); op = array_start(&Conf_Opers); - while (len--) { - assert(op->name[0]); + for (i = 0; i < count; i++, op++) { + if (!op->name[0]) + continue; puts("[OPERATOR]"); printf(" Name = %s\n", op->name); printf(" Password = %s\n", op->pwd); printf(" Mask = %s\n\n", op->mask ? op->mask : ""); - op++; } } @@ -375,6 +373,7 @@ Conf_Test( void ) printf(" OperServerMode = %s\n", yesno_to_str(Conf_OperServerMode)); #ifdef PAM printf(" PAM = %s\n", yesno_to_str(Conf_PAM)); + printf(" PAMIsOptional = %s\n", yesno_to_str(Conf_PAMIsOptional)); #endif printf(" PredefChannelsOnly = %s\n", yesno_to_str(Conf_PredefChannelsOnly)); #ifndef STRICT_RFC @@ -699,6 +698,7 @@ Set_Defaults(bool InitServers) #else Conf_PAM = false; #endif + Conf_PAMIsOptional = false; Conf_PredefChannelsOnly = false; #ifdef SYSLOG Conf_ScrubCTCP = false; @@ -709,10 +709,6 @@ Set_Defaults(bool InitServers) #endif #endif - /* Initialize IRC operators and channels */ - Conf_Oper_Count = 0; - Conf_Channel_Count = 0; - /* Initialize server configuration structures */ if (InitServers) { for (i = 0; i < MAX_SERVERS; @@ -787,6 +783,7 @@ Read_Config( bool ngircd_starting ) char section[LINE_LEN], str[LINE_LEN], *var, *arg, *ptr; const UINT16 defaultport = 6667; int line, i, n; + size_t count; FILE *fd; /* Open configuration file */ @@ -887,12 +884,30 @@ Read_Config( bool ngircd_starting ) else New_Server_Idx = i; continue; } + if (strcasecmp(section, "[CHANNEL]") == 0) { - Conf_Channel_Count++; + count = array_length(&Conf_Channels, + sizeof(struct Conf_Channel)); + if (!array_alloc(&Conf_Channels, + sizeof(struct Conf_Channel), + count)) { + Config_Error(LOG_ERR, + "Could not allocate memory for new operator (line %d)", + line); + } continue; } + if (strcasecmp(section, "[OPERATOR]") == 0) { - Conf_Oper_Count++; + count = array_length(&Conf_Opers, + sizeof(struct Conf_Oper)); + if (!array_alloc(&Conf_Opers, + sizeof(struct Conf_Oper), + count)) { + Config_Error(LOG_ERR, + "Could not allocate memory for new channel (line &d)", + line); + } continue; } @@ -978,17 +993,21 @@ Read_Config( bool ngircd_starting ) } /** - * Check whether an string argument is true or false. + * Check whether a string argument is "true" or "false". * * @param Arg Input string. - * @returns true if string has been parsed as "yes"/"true"/"on". + * @returns true if the input string has been parsed as "yes", "true" + * (case insensitive) or a non-zero integer value. */ static bool -Check_ArgIsTrue( const char *Arg ) +Check_ArgIsTrue(const char *Arg) { - if( strcasecmp( Arg, "yes" ) == 0 ) return true; - if( strcasecmp( Arg, "true" ) == 0 ) return true; - if( atoi( Arg ) != 0 ) return true; + if (strcasecmp(Arg, "yes") == 0) + return true; + if (strcasecmp(Arg, "true") == 0) + return true; + if (atoi(Arg) != 0) + return true; return false; } @@ -1289,7 +1308,9 @@ Handle_GLOBAL( int Line, char *Var, char *Arg ) else { Conf_GID = (unsigned int)atoi(Arg); if (!Conf_GID && strcmp(Arg, "0")) - Config_Error_NaN(Line, Var); + Config_Error(LOG_WARNING, + "%s, line %d: Value of \"%s\" is not a valid group name or ID!", + NGIRCd_ConfFile, Line, Var); } return; } @@ -1300,7 +1321,9 @@ Handle_GLOBAL( int Line, char *Var, char *Arg ) else { Conf_UID = (unsigned int)atoi(Arg); if (!Conf_UID && strcmp(Arg, "0")) - Config_Error_NaN(Line, Var); + Config_Error(LOG_WARNING, + "%s, line %d: Value of \"%s\" is not a valid user name or ID!", + NGIRCd_ConfFile, Line, Var); } return; } @@ -1483,6 +1506,10 @@ Handle_OPTIONS(int Line, char *Var, char *Arg) WarnPAM(Line); return; } + if (strcasecmp(Var, "PAMIsOptional") == 0 ) { + Conf_PAMIsOptional = Check_ArgIsTrue(Arg); + return; + } if (strcasecmp(Var, "PredefChannelsOnly") == 0) { Conf_PredefChannelsOnly = Check_ArgIsTrue(Arg); return; @@ -1580,13 +1607,11 @@ Handle_OPERATOR( int Line, char *Var, char *Arg ) assert( Line > 0 ); assert( Var != NULL ); assert( Arg != NULL ); - assert( 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); + op = array_get(&Conf_Opers, sizeof(*op), + array_length(&Conf_Opers, sizeof(*op)) - 1); + if (!op) return; - } if (strcasecmp(Var, "Name") == 0) { /* Name of IRC operator */ @@ -1752,21 +1777,17 @@ static void Handle_CHANNEL(int Line, char *Var, char *Arg) { size_t len; - size_t chancount; struct Conf_Channel *chan; assert( Line > 0 ); assert( Var != NULL ); assert( Arg != NULL ); - assert(Conf_Channel_Count > 0); - - 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); + chan = array_get(&Conf_Channels, sizeof(*chan), + array_length(&Conf_Channels, sizeof(*chan)) - 1); + if (!chan) return; - } + if (strcasecmp(Var, "Name") == 0) { if (!Handle_Channelname(chan, Arg)) Config_Error_TooLong(Line, Var); @@ -1913,8 +1934,10 @@ Validate_Config(bool Configtest, bool Rehash) } } Log(LOG_DEBUG, - "Configuration: Operators=%d, Servers=%d[%d], Channels=%d", - Conf_Oper_Count, servers, servers_once, Conf_Channel_Count); + "Configuration: Operators=%ld, Servers=%d[%d], Channels=%ld", + array_length(&Conf_Opers, sizeof(struct Conf_Oper)), + servers, servers_once, + array_length(&Conf_Channels, sizeof(struct Conf_Channel))); #endif return config_valid; @@ -2044,7 +2067,7 @@ Init_Server_Struct( CONF_SERVER *Server ) Proc_InitStruct(&Server->res_stat); Server->conn_id = NONE; - memset(&Server->bind_addr, 0, sizeof(&Server->bind_addr)); + memset(&Server->bind_addr, 0, sizeof(Server->bind_addr)); } /* -eof- */