1
0
mirror of https://github.com/unrealircd/unrealircd.git synced 2026-07-08 09:43:12 +02:00

Get rid of Usermode_Table[] and use a linked list called usermodes.

Just like already done for Channelmode_Table[] -> channelmodes.
This commit is contained in:
Bram Matthys
2021-09-26 12:45:45 +02:00
parent 05f2694685
commit ee8cc0e8e2
11 changed files with 273 additions and 276 deletions
+16 -23
View File
@@ -1079,7 +1079,7 @@ void _set_mode(Channel *channel, Client *client, int parc, const char *parv[], u
*/
CMD_FUNC(_cmd_umode)
{
int i;
Umode *um;
const char *m;
Client *acptr;
int what;
@@ -1120,10 +1120,7 @@ CMD_FUNC(_cmd_umode)
userhost_save_current(client); /* save host, in case we do any +x/-x or similar */
/* find flags already set for user */
for (i = 0; i <= Usermode_highest; i++)
if ((client->umodes & Usermode_Table[i].mode))
oldumodes |= Usermode_Table[i].mode;
oldumodes = client->umodes;
if (RESTRICT_USERMODES && MyUser(client) && !ValidatePermissionsForPath("immune:restrict-usermodes",client,NULL,NULL,NULL))
chk_restrict = 1;
@@ -1238,24 +1235,23 @@ CMD_FUNC(_cmd_umode)
break;
default:
def:
for (i = 0; i <= Usermode_highest; i++)
for (um = usermodes; um; um = um->next)
{
if (*m == Usermode_Table[i].letter)
if (um->letter == *m)
{
if (Usermode_Table[i].allowed)
if (!Usermode_Table[i].allowed(client,what))
if (um->allowed && !um->allowed(client,what))
break;
if (what == MODE_ADD)
client->umodes |= Usermode_Table[i].mode;
client->umodes |= um->mode;
else
client->umodes &= ~Usermode_Table[i].mode;
client->umodes &= ~um->mode;
break;
}
else if (i == Usermode_highest && MyConnect(client) && !rpterror)
{
sendnumeric(client, ERR_UMODEUNKNOWNFLAG);
rpterror = 1;
}
}
if (!um && MyConnect(client) && !rpterror)
{
sendnumeric(client, ERR_UMODEUNKNOWNFLAG);
rpterror = 1;
}
break;
} /* switch */
@@ -1273,19 +1269,16 @@ CMD_FUNC(_cmd_umode)
int i;
/* MODES */
for (i = 0; i <= Usermode_highest; i++)
for (um = usermodes; um; um = um->next)
{
if (!Usermode_Table[i].letter)
continue;
if (Usermode_Table[i].unset_on_deoper)
if (um->unset_on_deoper)
{
/* This is an oper mode. Is it set now and wasn't earlier?
* then it needs to be stripped, as setting it is not
* permitted.
*/
long m = Usermode_Table[i].mode;
if ((client->umodes & m) && !(oldumodes & m))
client->umodes &= ~Usermode_Table[i].mode; /* remove */
if ((client->umodes & um->mode) && !(oldumodes & um->mode))
client->umodes &= ~um->mode; /* remove */
}
}
+1 -13
View File
@@ -83,19 +83,7 @@ CMD_FUNC(cmd_sendumode)
sendto_server(client, 0, 0, mtags, ":%s SENDUMODE %s :%s", client->id, parv[1], message);
for (p = parv[1]; *p; p++)
{
for(i = 0; i <= Usermode_highest; i++)
{
if (!Usermode_Table[i].letter)
continue;
if (Usermode_Table[i].letter == *p)
{
umode_s |= Usermode_Table[i].mode;
break;
}
}
}
umode_s = set_usermode(parv[1]);
list_for_each_entry(acptr, &oper_list, special_node)
{
+11 -16
View File
@@ -317,11 +317,11 @@ void channel_svsmode(Client *client, int parc, const char *parv[])
*/
void do_svsmode(Client *client, MessageTag *recv_mtags, int parc, const char *parv[], int show_change)
{
int i;
Umode *um;
const char *m;
Client *target;
int what;
long setflags = 0;
long oldumodes = 0;
if (!IsULine(client))
return;
@@ -342,10 +342,7 @@ void do_svsmode(Client *client, MessageTag *recv_mtags, int parc, const char *pa
userhost_save_current(target);
/* initialize setflag to be the user's pre-SVSMODE flags */
for (i = 0; i <= Usermode_highest; i++)
if (Usermode_Table[i].letter && (target->umodes & Usermode_Table[i].mode))
setflags |= Usermode_Table[i].mode;
oldumodes = target->umodes;
/* parse mode change string(s) */
for (m = parv[2]; *m; m++)
@@ -505,16 +502,14 @@ void do_svsmode(Client *client, MessageTag *recv_mtags, int parc, const char *pa
break;
default:
setmodex:
for (i = 0; i <= Usermode_highest; i++)
for (um = usermodes; um; um = um->next)
{
if (!Usermode_Table[i].letter)
continue;
if (*m == Usermode_Table[i].letter)
if (um->letter == *m)
{
if (what == MODE_ADD)
target->umodes |= Usermode_Table[i].mode;
target->umodes |= um->mode;
else
target->umodes &= ~Usermode_Table[i].mode;
target->umodes &= ~um->mode;
break;
}
}
@@ -531,15 +526,15 @@ void do_svsmode(Client *client, MessageTag *recv_mtags, int parc, const char *pa
parv[1], parv[2]);
/* Here we trigger the same hooks that cmd_mode does and, likewise,
only if the old flags (setflags) are different than the newly-
only if the old flags (oldumodes) are different than the newly-
set ones */
if (setflags != target->umodes)
RunHook(HOOKTYPE_UMODE_CHANGE, target, setflags, target->umodes);
if (oldumodes != target->umodes)
RunHook(HOOKTYPE_UMODE_CHANGE, target, oldumodes, target->umodes);
if (show_change)
{
char buf[BUFSIZE];
build_umode_string(target, setflags, ALL_UMODES, buf);
build_umode_string(target, oldumodes, ALL_UMODES, buf);
if (MyUser(target) && *buf)
sendto_one(target, NULL, ":%s MODE %s :%s", client->name, target->name, buf);
}
+1 -11
View File
@@ -330,17 +330,7 @@ static int parse_who_options(Client *client, int argc, const char **argv)
else
umodes = &wfl.umodes_dontwant;
while (*s)
{
int i;
for (i = 0; i <= Usermode_highest; i++)
if (*s == Usermode_Table[i].letter)
{
*umodes |= Usermode_Table[i].mode;
break;
}
s++;
}
*umodes = set_usermode(s);
if (!IsOper(client))
*umodes = *umodes & UMODE_OPER; /* these are usermodes regular users may search for. just oper now. */
+4 -4
View File
@@ -295,7 +295,7 @@ CMD_FUNC(cmd_whox)
while (*s)
{
int i;
Umode *um;
switch (*s)
{
@@ -317,11 +317,11 @@ CMD_FUNC(cmd_whox)
else
umodes = &fmt.noumodes;
for (i = 0; i <= Usermode_highest; i++)
for (um = usermodes; um; um = um->next)
{
if (*s == Usermode_Table[i].letter)
if (um->letter == *s)
{
*umodes |= Usermode_Table[i].mode;
*umodes |= um->mode;
break;
}
}