This should save 128 bytes per user for non-opers. Well worth it imho for a reasonably large amount of unused ram.

git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@9179 e03df62e-2008-0410-955e-edbf42e46eb7
This commit is contained in:
brain 2008-03-23 21:12:36 +00:00
parent 029e804945
commit 20680f9c49
2 changed files with 28 additions and 2 deletions

View File

@ -458,10 +458,10 @@ class CoreExport User : public connection
std::map<std::string, bool>* AllowedOperCommands;
/** Allowed user modes from oper classes. */
bool AllowedUserModes[64];
bool* AllowedUserModes;
/** Allowed channel modes from oper classes. */
bool AllowedChanModes[64];
bool* AllowedChanModes;
public:
/** Contains a pointer to the connect class a user is on from - this will be NULL for remote connections.

View File

@ -193,6 +193,8 @@ User::User(InspIRCd* Instance, const std::string &uid) : ServerInstance(Instance
Visibility = NULL;
ip = NULL;
MyClass = NULL;
AllowedUserModes = NULL;
AllowedChanModes = NULL;
AllowedOperCommands = NULL;
memset(AllowedUserModes, 0, sizeof(AllowedUserModes));
memset(AllowedChanModes, 0, sizeof(AllowedChanModes));
@ -231,6 +233,18 @@ User::~User()
AllowedOperCommands = NULL;
}
if (this->AllowedUserModes)
{
delete AllowedUserModes;
AllowedUserModes = NULL;
}
if (this->AllowedChanModes)
{
delete AllowedChanModes;
AllowedChanModes = NULL;
}
this->InvalidateCache();
this->DecrementModes();
@ -447,6 +461,9 @@ bool User::HasModePermission(unsigned char mode, ModeType type)
if (!IS_OPER(this))
return false;
if (!AllowedUserModes || !AllowedChanModes)
return false;
return ((type == MODETYPE_USER ? AllowedUserModes : AllowedChanModes))[(mode - 'A')];
}
@ -683,6 +700,15 @@ void User::Oper(const std::string &opertype, const std::string &opername)
else
AllowedOperCommands = new std::map<std::string, bool>;
if (!AllowedChanModes)
AllowedChanModes = new bool[64];
if (!AllowedUserModes)
AllowedUserModes = new bool[64];
memset(AllowedUserModes, 0, 64);
memset(AllowedChanModes, 0, 64);
char* Classes = strdup(iter_opertype->second);
char* myclass = strtok_r(Classes," ",&savept);
while (myclass)