Module: ngircd.git Branch: master Commit: 28ca31e5761c0f5e746fcd0f4cdfac98e344bdb7 URL: http://ngircd.barton.de/cgi-bin/gitweb.cgi?p=ngircd.git&a=commit;h=28ca3...
Author: Florian Westphal fw@strlen.de Date: Sat Nov 7 12:14:37 2009 +0100
Remove limit on max number of configured irc operators.
---
src/ngircd/conf.c | 101 +++++++++++++++++++++++++++++-------------------- src/ngircd/conf.h | 10 ++--- src/ngircd/defines.h | 2 - src/ngircd/irc-oper.c | 21 +++++----- 4 files changed, 75 insertions(+), 59 deletions(-)
diff --git a/src/ngircd/conf.c b/src/ngircd/conf.c index 2b592b1..fae2a28 100644 --- a/src/ngircd/conf.c +++ b/src/ngircd/conf.c @@ -55,6 +55,7 @@ static bool Use_Log = true; static CONF_SERVER New_Server; static int New_Server_Idx;
+static size_t Conf_Oper_Count; static size_t Conf_Channel_Count; static void Set_Defaults PARAMS(( bool InitServers )); static bool Read_Config PARAMS(( bool ngircd_starting )); @@ -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 ) { @@ -304,16 +340,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; @@ -609,6 +636,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 +695,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 +723,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; @@ -1081,36 +1098,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"!", diff --git a/src/ngircd/conf.h b/src/ngircd/conf.h index 2308e4c..0180515 100644 --- a/src/ngircd/conf.h +++ b/src/ngircd/conf.h @@ -26,12 +26,11 @@ #include "conf-ssl.h"
-typedef struct _Conf_Oper -{ +struct Conf_Oper { char name[CLIENT_PASS_LEN]; /* Name (ID) of IRC operator */ char pwd[CLIENT_PASS_LEN]; /* Password */ - char *mask; -} CONF_OPER; + char *mask; /* allowed host mask */ +};
typedef struct _Conf_Server { @@ -125,8 +124,7 @@ GLOBAL int Conf_PongTimeout; GLOBAL int Conf_ConnectRetry;
/* Operators */ -GLOBAL CONF_OPER Conf_Oper[MAX_OPERATORS]; -GLOBAL unsigned int Conf_Oper_Count; +GLOBAL array Conf_Opers;
/* Servers */ GLOBAL CONF_SERVER Conf_Server[MAX_SERVERS]; diff --git a/src/ngircd/defines.h b/src/ngircd/defines.h index 905a5a6..f0cf2ac 100644 --- a/src/ngircd/defines.h +++ b/src/ngircd/defines.h @@ -30,8 +30,6 @@ #define HOST_LEN 256 /* Max. lenght of fully qualified host names (e. g. "abc.domain.tld") */
-#define MAX_OPERATORS 16 /* Max. count of configurable IRC Ops */ - #define MAX_SERVERS 16 /* Max. count of configurable servers */
#define MAX_WHOWAS 64 /* Max. number of WHOWAS items */ diff --git a/src/ngircd/irc-oper.c b/src/ngircd/irc-oper.c index 17b6044..8492603 100644 --- a/src/ngircd/irc-oper.c +++ b/src/ngircd/irc-oper.c @@ -55,25 +55,26 @@ Bad_OperPass(CLIENT *Client, char *errtoken, char *errmsg) GLOBAL bool IRC_OPER( CLIENT *Client, REQUEST *Req ) { - unsigned int i; + struct Conf_Oper *op; + size_t len, i;
assert( Client != NULL ); assert( Req != NULL );
if( Req->argc != 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
- for( i = 0; i < Conf_Oper_Count; i++) - { - if( Conf_Oper[i].name[0] && Conf_Oper[i].pwd[0] && ( strcmp( Conf_Oper[i].name, Req->argv[0] ) == 0 )) break; - } - if( i >= Conf_Oper_Count ) + len = array_length(&Conf_Opers, sizeof(*op)); + op = array_start(&Conf_Opers); + for (i = 0; i < len && strcmp(op[i].name, Req->argv[0]); i++) + ; + if (i >= len) return Bad_OperPass(Client, Req->argv[0], "not configured");
- if( strcmp( Conf_Oper[i].pwd, Req->argv[1] ) != 0 ) - return Bad_OperPass(Client, Conf_Oper[i].name, "bad password"); + if (strcmp(op[i].pwd, Req->argv[1]) != 0) + return Bad_OperPass(Client, op[i].name, "bad password");
- if( Conf_Oper[i].mask && (! Match( Conf_Oper[i].mask, Client_Mask( Client ) ))) - return Bad_OperPass(Client, Conf_Oper[i].mask, "hostmask check failed" ); + if (op[i].mask && (!Match(op[i].mask, Client_Mask(Client)))) + return Bad_OperPass(Client, op[i].mask, "hostmask check failed");
if( ! Client_HasMode( Client, 'o' )) {