commit - c414d0bd3ae670fdcc5d1b81c4e01b486bca91d8
commit + 28ca31e5761c0f5e746fcd0f4cdfac98e344bdb7
blob - 2b592b16d3ce44931aff3b047198d3c50488234d
blob + fae2a28c453efc943e419526fd72fecbb864d789
--- src/ngircd/conf.c
+++ src/ngircd/conf.c
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 ));
}
+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 )
{
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;
exit( 1 );
}
+ opers_free();
Set_Defaults( ngircd_starting );
Config_Error( LOG_INFO, "Reading configuration from \"%s\" ...", NGIRCd_ConfFile );
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] ) {
}
if (strcasecmp(section, "[CHANNEL]") == 0) {
Conf_Channel_Count++;
+ continue;
+ }
+ if (strcasecmp(section, "[OPERATOR]") == 0) {
+ Conf_Oper_Count++;
continue;
}
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\"!",
blob - 2308e4cbb83d3844c9baf8b01b3ab07afb05ef31
blob + 0180515569dcbf5515211437776a3a25a460fca3
--- src/ngircd/conf.h
+++ src/ngircd/conf.h
#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
{
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];
blob - 905a5a61fbef27f7f329b0f46e8b3ea273b89a20
blob + f0cf2ac5ec6ce1b2a24f8db2ac3a543e6651a291
--- src/ngircd/defines.h
+++ src/ngircd/defines.h
#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 */
blob - 17b604465843c6d4f9db12040e3a643f573155f2
blob + 8492603dcbc42b710b5c10771e3021787e893484
--- src/ngircd/irc-oper.c
+++ src/ngircd/irc-oper.c
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' ))
{