commit 0a85c58878a594ed0b0767771b128d4e288057cf from: Alexander Barton date: Wed Dec 07 09:52:30 2011 UTC Configuration: get rid of Conf_Oper_Count and Conf_Channel_Count Count elements dynamically when needed. commit - ee21490887690a4c1dcdd7aafd3ffc745c2ca0ca commit + 0a85c58878a594ed0b0767771b128d4e288057cf blob - dccc9c7a27929feae79206f0038d738218f9c19f blob + b930b6c887d3237fdb1accaded002b6e33a2c8ac --- src/ngircd/conf.c +++ 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++; } } @@ -708,10 +706,6 @@ Set_Defaults(bool InitServers) Conf_SyslogFacility = 0; #endif #endif - - /* Initialize IRC operators and channels */ - Conf_Oper_Count = 0; - Conf_Channel_Count = 0; /* Initialize server configuration structures */ if (InitServers) { @@ -787,6 +781,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 +882,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; } @@ -1584,13 +1597,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 */ @@ -1756,21 +1767,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); @@ -1917,8 +1924,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;