mirror of
https://github.com/osmarks/ngircd.git
synced 2024-10-28 04:46:17 +00:00
Channel_Mode(): code cleanup (no functional changes)
This commit is contained in:
parent
b8c6dd503f
commit
dee89c2355
@ -276,12 +276,14 @@ Channel_Mode_Answer_Request(CLIENT *Origin, CHANNEL *Channel)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle channel mode and channel-user mode changes
|
||||||
|
*/
|
||||||
static bool
|
static bool
|
||||||
Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
|
Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel)
|
||||||
{
|
{
|
||||||
/* Handle channel and channel-user modes */
|
char the_modes[COMMAND_LEN], the_args[COMMAND_LEN], x[2],
|
||||||
|
argadd[CLIENT_PASS_LEN], *mode_ptr;
|
||||||
char the_modes[COMMAND_LEN], the_args[COMMAND_LEN], x[2], argadd[CLIENT_PASS_LEN], *mode_ptr;
|
|
||||||
bool ok, set, modeok = true, skiponce, use_servermode = false, retval;
|
bool ok, set, modeok = true, skiponce, use_servermode = false, retval;
|
||||||
int mode_arg, arg_arg;
|
int mode_arg, arg_arg;
|
||||||
CLIENT *client;
|
CLIENT *client;
|
||||||
@ -307,7 +309,7 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
|
|||||||
/* channel operator? */
|
/* channel operator? */
|
||||||
if (strchr(Channel_UserModes(Channel, Origin), 'o'))
|
if (strchr(Channel_UserModes(Channel, Origin), 'o'))
|
||||||
modeok = true;
|
modeok = true;
|
||||||
else if(Conf_OperCanMode) {
|
else if (Conf_OperCanMode) {
|
||||||
/* IRC-Operators can use MODE as well */
|
/* IRC-Operators can use MODE as well */
|
||||||
if (Client_OperByMe(Origin)) {
|
if (Client_OperByMe(Origin)) {
|
||||||
modeok = true;
|
modeok = true;
|
||||||
@ -327,8 +329,12 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
|
|||||||
/* Initial state: set or unset modes? */
|
/* Initial state: set or unset modes? */
|
||||||
skiponce = false;
|
skiponce = false;
|
||||||
switch (*mode_ptr) {
|
switch (*mode_ptr) {
|
||||||
case '-': set = false; break;
|
case '-':
|
||||||
case '+': set = true; break;
|
set = false;
|
||||||
|
break;
|
||||||
|
case '+':
|
||||||
|
set = true;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
set = true;
|
set = true;
|
||||||
skiponce = true;
|
skiponce = true;
|
||||||
@ -341,7 +347,7 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
|
|||||||
x[1] = '\0';
|
x[1] = '\0';
|
||||||
ok = CONNECTED;
|
ok = CONNECTED;
|
||||||
while (mode_ptr) {
|
while (mode_ptr) {
|
||||||
if (! skiponce)
|
if (!skiponce)
|
||||||
mode_ptr++;
|
mode_ptr++;
|
||||||
if (!*mode_ptr) {
|
if (!*mode_ptr) {
|
||||||
/* Try next argument if there's any */
|
/* Try next argument if there's any */
|
||||||
@ -364,10 +370,11 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
|
|||||||
switch (*mode_ptr) {
|
switch (*mode_ptr) {
|
||||||
case '+':
|
case '+':
|
||||||
case '-':
|
case '-':
|
||||||
if (((*mode_ptr == '+') && !set) || ((*mode_ptr == '-') && set)) {
|
if (((*mode_ptr == '+') && !set)
|
||||||
|
|| ((*mode_ptr == '-') && set)) {
|
||||||
/* Action modifier ("+"/"-") must be changed ... */
|
/* Action modifier ("+"/"-") must be changed ... */
|
||||||
len = strlen( the_modes ) - 1;
|
len = strlen(the_modes) - 1;
|
||||||
if ((the_modes[len] == '+') || (the_modes[len] == '-')) {
|
if (the_modes[len] == '+' || the_modes[len] == '-') {
|
||||||
/* Adjust last action modifier in result */
|
/* Adjust last action modifier in result */
|
||||||
the_modes[len] = *mode_ptr;
|
the_modes[len] = *mode_ptr;
|
||||||
} else {
|
} else {
|
||||||
@ -381,7 +388,8 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Are there arguments left? */
|
/* Are there arguments left? */
|
||||||
if( arg_arg >= Req->argc ) arg_arg = -1;
|
if (arg_arg >= Req->argc)
|
||||||
|
arg_arg = -1;
|
||||||
|
|
||||||
/* Validate modes */
|
/* Validate modes */
|
||||||
x[0] = '\0';
|
x[0] = '\0';
|
||||||
@ -397,29 +405,41 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
|
|||||||
if (modeok)
|
if (modeok)
|
||||||
x[0] = *mode_ptr;
|
x[0] = *mode_ptr;
|
||||||
else
|
else
|
||||||
ok = IRC_WriteStrClient(Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID(Origin), Channel_Name(Channel));
|
ok = IRC_WriteStrClient(Origin,
|
||||||
|
ERR_CHANOPRIVSNEEDED_MSG,
|
||||||
|
Client_ID(Origin), Channel_Name(Channel));
|
||||||
break;
|
break;
|
||||||
case 'k': /* Channel key */
|
case 'k': /* Channel key */
|
||||||
if (! set) {
|
if (!set) {
|
||||||
if (modeok)
|
if (modeok)
|
||||||
x[0] = *mode_ptr;
|
x[0] = *mode_ptr;
|
||||||
else
|
else
|
||||||
ok = IRC_WriteStrClient(Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID(Origin), Channel_Name(Channel));
|
ok = IRC_WriteStrClient(Origin,
|
||||||
|
ERR_CHANOPRIVSNEEDED_MSG,
|
||||||
|
Client_ID(Origin),
|
||||||
|
Channel_Name(Channel));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (arg_arg > mode_arg) {
|
if (arg_arg > mode_arg) {
|
||||||
if (modeok) {
|
if (modeok) {
|
||||||
Channel_ModeDel(Channel, 'k');
|
Channel_ModeDel(Channel, 'k');
|
||||||
Channel_SetKey(Channel, Req->argv[arg_arg]);
|
Channel_SetKey(Channel,
|
||||||
strlcpy(argadd, Channel_Key(Channel), sizeof(argadd));
|
Req->argv[arg_arg]);
|
||||||
|
strlcpy(argadd, Channel_Key(Channel),
|
||||||
|
sizeof(argadd));
|
||||||
x[0] = *mode_ptr;
|
x[0] = *mode_ptr;
|
||||||
} else {
|
} else {
|
||||||
ok = IRC_WriteStrClient(Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID(Origin), Channel_Name(Channel));
|
ok = IRC_WriteStrClient(Origin,
|
||||||
|
ERR_CHANOPRIVSNEEDED_MSG,
|
||||||
|
Client_ID(Origin),
|
||||||
|
Channel_Name(Channel));
|
||||||
}
|
}
|
||||||
Req->argv[arg_arg][0] = '\0';
|
Req->argv[arg_arg][0] = '\0';
|
||||||
arg_arg++;
|
arg_arg++;
|
||||||
} else {
|
} else {
|
||||||
ok = IRC_WriteStrClient(Origin, ERR_NEEDMOREPARAMS_MSG, Client_ID(Origin), Req->command);
|
ok = IRC_WriteStrClient(Origin,
|
||||||
|
ERR_NEEDMOREPARAMS_MSG,
|
||||||
|
Client_ID(Origin), Req->command);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'l': /* Member limit */
|
case 'l': /* Member limit */
|
||||||
@ -427,7 +447,10 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
|
|||||||
if (modeok)
|
if (modeok)
|
||||||
x[0] = *mode_ptr;
|
x[0] = *mode_ptr;
|
||||||
else
|
else
|
||||||
ok = IRC_WriteStrClient(Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID(Origin), Channel_Name(Channel));
|
ok = IRC_WriteStrClient(Origin,
|
||||||
|
ERR_CHANOPRIVSNEEDED_MSG,
|
||||||
|
Client_ID(Origin),
|
||||||
|
Channel_Name(Channel));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (arg_arg > mode_arg) {
|
if (arg_arg > mode_arg) {
|
||||||
@ -436,28 +459,40 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
|
|||||||
if (l > 0 && l < 0xFFFF) {
|
if (l > 0 && l < 0xFFFF) {
|
||||||
Channel_ModeDel(Channel, 'l');
|
Channel_ModeDel(Channel, 'l');
|
||||||
Channel_SetMaxUsers(Channel, l);
|
Channel_SetMaxUsers(Channel, l);
|
||||||
snprintf(argadd, sizeof(argadd), "%ld", l);
|
snprintf(argadd, sizeof(argadd),
|
||||||
|
"%ld", l);
|
||||||
x[0] = *mode_ptr;
|
x[0] = *mode_ptr;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ok = IRC_WriteStrClient(Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID(Origin), Channel_Name(Channel));
|
ok = IRC_WriteStrClient(Origin,
|
||||||
|
ERR_CHANOPRIVSNEEDED_MSG,
|
||||||
|
Client_ID(Origin),
|
||||||
|
Channel_Name(Channel));
|
||||||
}
|
}
|
||||||
Req->argv[arg_arg][0] = '\0';
|
Req->argv[arg_arg][0] = '\0';
|
||||||
arg_arg++;
|
arg_arg++;
|
||||||
} else {
|
} else {
|
||||||
ok = IRC_WriteStrClient(Origin, ERR_NEEDMOREPARAMS_MSG, Client_ID(Origin), Req->command);
|
ok = IRC_WriteStrClient(Origin,
|
||||||
|
ERR_NEEDMOREPARAMS_MSG,
|
||||||
|
Client_ID(Origin), Req->command);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'P': /* Persistent channel */
|
case 'P': /* Persistent channel */
|
||||||
if (modeok) {
|
if (modeok) {
|
||||||
/* Only IRC operators are allowed to
|
/* Only IRC operators are allowed to
|
||||||
* set the 'P' channel mode! */
|
* set the 'P' channel mode! */
|
||||||
if (set && !(Client_OperByMe(Client) || Client_Type(Client) == CLIENT_SERVER))
|
if (set && !(Client_OperByMe(Client)
|
||||||
ok = IRC_WriteStrClient(Origin, ERR_NOPRIVILEGES_MSG, Client_ID(Origin));
|
|| Client_Type(Client) == CLIENT_SERVER))
|
||||||
|
ok = IRC_WriteStrClient(Origin,
|
||||||
|
ERR_NOPRIVILEGES_MSG,
|
||||||
|
Client_ID(Origin));
|
||||||
else
|
else
|
||||||
x[0] = 'P';
|
x[0] = 'P';
|
||||||
} else
|
} else
|
||||||
ok = IRC_WriteStrClient(Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID(Origin), Channel_Name(Channel));
|
ok = IRC_WriteStrClient(Origin,
|
||||||
|
ERR_CHANOPRIVSNEEDED_MSG,
|
||||||
|
Client_ID(Origin),
|
||||||
|
Channel_Name(Channel));
|
||||||
break;
|
break;
|
||||||
/* --- Channel user modes --- */
|
/* --- Channel user modes --- */
|
||||||
case 'o': /* Channel operator */
|
case 'o': /* Channel operator */
|
||||||
@ -468,14 +503,22 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
|
|||||||
if (client)
|
if (client)
|
||||||
x[0] = *mode_ptr;
|
x[0] = *mode_ptr;
|
||||||
else
|
else
|
||||||
ok = IRC_WriteStrClient(Client, ERR_NOSUCHNICK_MSG, Client_ID(Client), Req->argv[arg_arg]);
|
ok = IRC_WriteStrClient(Client,
|
||||||
|
ERR_NOSUCHNICK_MSG,
|
||||||
|
Client_ID(Client),
|
||||||
|
Req->argv[arg_arg]);
|
||||||
} else {
|
} else {
|
||||||
ok = IRC_WriteStrClient(Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID(Origin), Channel_Name(Channel));
|
ok = IRC_WriteStrClient(Origin,
|
||||||
|
ERR_CHANOPRIVSNEEDED_MSG,
|
||||||
|
Client_ID(Origin),
|
||||||
|
Channel_Name(Channel));
|
||||||
}
|
}
|
||||||
Req->argv[arg_arg][0] = '\0';
|
Req->argv[arg_arg][0] = '\0';
|
||||||
arg_arg++;
|
arg_arg++;
|
||||||
} else {
|
} else {
|
||||||
ok = IRC_WriteStrClient(Origin, ERR_NEEDMOREPARAMS_MSG, Client_ID(Origin), Req->command);
|
ok = IRC_WriteStrClient(Origin,
|
||||||
|
ERR_NEEDMOREPARAMS_MSG,
|
||||||
|
Client_ID(Origin), Req->command);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
/* --- Channel lists --- */
|
/* --- Channel lists --- */
|
||||||
@ -484,11 +527,18 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
|
|||||||
if (arg_arg > mode_arg) {
|
if (arg_arg > mode_arg) {
|
||||||
/* modify list */
|
/* modify list */
|
||||||
if (modeok) {
|
if (modeok) {
|
||||||
ok = set ? Add_Ban_Invite(*mode_ptr, Origin, Client, Channel, Req->argv[arg_arg])
|
ok = set
|
||||||
: Del_Ban_Invite(*mode_ptr, Origin, Client, Channel, Req->argv[arg_arg]);
|
? Add_Ban_Invite(*mode_ptr, Origin,
|
||||||
|
Client, Channel,
|
||||||
|
Req->argv[arg_arg])
|
||||||
|
: Del_Ban_Invite(*mode_ptr, Origin,
|
||||||
|
Client, Channel,
|
||||||
|
Req->argv[arg_arg]);
|
||||||
} else {
|
} else {
|
||||||
ok = IRC_WriteStrClient(Origin, ERR_CHANOPRIVSNEEDED_MSG,
|
ok = IRC_WriteStrClient(Origin,
|
||||||
Client_ID(Origin), Channel_Name(Channel));
|
ERR_CHANOPRIVSNEEDED_MSG,
|
||||||
|
Client_ID(Origin),
|
||||||
|
Channel_Name(Channel));
|
||||||
}
|
}
|
||||||
Req->argv[arg_arg][0] = '\0';
|
Req->argv[arg_arg][0] = '\0';
|
||||||
arg_arg++;
|
arg_arg++;
|
||||||
@ -500,13 +550,18 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
Log(LOG_DEBUG, "Unknown mode \"%c%c\" from \"%s\" on %s!?",
|
Log(LOG_DEBUG,
|
||||||
set ? '+' : '-', *mode_ptr, Client_ID(Origin), Channel_Name(Channel));
|
"Unknown mode \"%c%c\" from \"%s\" on %s!?",
|
||||||
|
set ? '+' : '-', *mode_ptr, Client_ID(Origin),
|
||||||
|
Channel_Name(Channel));
|
||||||
if (Client_Type(Client) != CLIENT_SERVER)
|
if (Client_Type(Client) != CLIENT_SERVER)
|
||||||
ok = IRC_WriteStrClient(Origin, ERR_UMODEUNKNOWNFLAG2_MSG, Client_ID(Origin), set ? '+' : '-', *mode_ptr);
|
ok = IRC_WriteStrClient(Origin,
|
||||||
|
ERR_UMODEUNKNOWNFLAG2_MSG,
|
||||||
|
Client_ID(Origin),
|
||||||
|
set ? '+' : '-', *mode_ptr);
|
||||||
x[0] = '\0';
|
x[0] = '\0';
|
||||||
goto chan_exit;
|
goto chan_exit;
|
||||||
} /* switch() */
|
} /* switch() */
|
||||||
|
|
||||||
if (!ok)
|
if (!ok)
|
||||||
break;
|
break;
|
||||||
@ -517,29 +572,40 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
|
|||||||
|
|
||||||
/* Validate target client */
|
/* Validate target client */
|
||||||
if (client && (!Channel_IsMemberOf(Channel, client))) {
|
if (client && (!Channel_IsMemberOf(Channel, client))) {
|
||||||
if (!IRC_WriteStrClient(Origin, ERR_USERNOTINCHANNEL_MSG,
|
if (!IRC_WriteStrClient
|
||||||
Client_ID(Origin), Client_ID(client), Channel_Name(Channel)))
|
(Origin, ERR_USERNOTINCHANNEL_MSG,
|
||||||
break;
|
Client_ID(Origin), Client_ID(client),
|
||||||
|
Channel_Name(Channel)))
|
||||||
|
break;
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (client) {
|
if (client) {
|
||||||
/* Channel-User-Mode */
|
/* Channel-User-Mode */
|
||||||
retval = set ? Channel_UserModeAdd(Channel, client, x[0]) : Channel_UserModeDel(Channel, client, x[0]);
|
retval = set
|
||||||
|
? Channel_UserModeAdd(Channel, client, x[0])
|
||||||
|
: Channel_UserModeDel(Channel, client, x[0]);
|
||||||
if (retval) {
|
if (retval) {
|
||||||
strlcat(the_args, " ", sizeof(the_args));
|
strlcat(the_args, " ", sizeof(the_args));
|
||||||
strlcat(the_args, Client_ID(client), sizeof(the_args));
|
strlcat(the_args, Client_ID(client),
|
||||||
|
sizeof(the_args));
|
||||||
strlcat(the_modes, x, sizeof(the_modes));
|
strlcat(the_modes, x, sizeof(the_modes));
|
||||||
LogDebug("User \"%s\": Mode change on %s, now \"%s\"",
|
LogDebug
|
||||||
Client_Mask(client), Channel_Name(Channel), Channel_UserModes(Channel, client));
|
("User \"%s\": Mode change on %s, now \"%s\"",
|
||||||
|
Client_Mask(client), Channel_Name(Channel),
|
||||||
|
Channel_UserModes(Channel, client));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* Channel-Mode */
|
/* Channel-Mode */
|
||||||
retval = set ? Channel_ModeAdd(Channel, x[0]) : Channel_ModeDel(Channel, x[0]);
|
retval = set
|
||||||
|
? Channel_ModeAdd(Channel, x[0])
|
||||||
|
: Channel_ModeDel(Channel, x[0]);
|
||||||
if (retval) {
|
if (retval) {
|
||||||
strlcat(the_modes, x, sizeof(the_modes));
|
strlcat(the_modes, x, sizeof(the_modes));
|
||||||
LogDebug("Channel %s: Mode change, now \"%s\".", Channel_Name(Channel), Channel_Modes(Channel));
|
LogDebug("Channel %s: Mode change, now \"%s\".",
|
||||||
|
Channel_Name(Channel),
|
||||||
|
Channel_Modes(Channel));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -549,7 +615,8 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
|
|||||||
strlcat(the_args, argadd, sizeof(the_args));
|
strlcat(the_args, argadd, sizeof(the_args));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
chan_exit:
|
|
||||||
|
chan_exit:
|
||||||
/* Are there changed modes? */
|
/* Are there changed modes? */
|
||||||
if (the_modes[1]) {
|
if (the_modes[1]) {
|
||||||
/* Clean up mode string */
|
/* Clean up mode string */
|
||||||
@ -567,14 +634,19 @@ chan_exit:
|
|||||||
|
|
||||||
/* Forward mode changes to channel users and all the
|
/* Forward mode changes to channel users and all the
|
||||||
* other remote servers: */
|
* other remote servers: */
|
||||||
IRC_WriteStrServersPrefix(Client, Origin, "MODE %s %s%s", Channel_Name( Channel ), the_modes, the_args);
|
IRC_WriteStrServersPrefix(Client, Origin,
|
||||||
IRC_WriteStrChannelPrefix(Client, Channel, Origin, false, "MODE %s %s%s", Channel_Name(Channel), the_modes, the_args);
|
"MODE %s %s%s", Channel_Name(Channel),
|
||||||
|
the_modes, the_args);
|
||||||
|
IRC_WriteStrChannelPrefix(Client, Channel, Origin,
|
||||||
|
false, "MODE %s %s%s", Channel_Name(Channel),
|
||||||
|
the_modes, the_args);
|
||||||
} else {
|
} else {
|
||||||
if (use_servermode)
|
if (use_servermode)
|
||||||
Origin = Client_ThisServer();
|
Origin = Client_ThisServer();
|
||||||
/* Send reply to client and inform other servers and channel users */
|
/* Send reply to client and inform other servers and channel users */
|
||||||
ok = IRC_WriteStrClientPrefix(Client, Origin, "MODE %s %s%s",
|
ok = IRC_WriteStrClientPrefix(Client, Origin,
|
||||||
Channel_Name(Channel), the_modes, the_args);
|
"MODE %s %s%s", Channel_Name(Channel),
|
||||||
|
the_modes, the_args);
|
||||||
/* Only forward requests for non-local channels */
|
/* Only forward requests for non-local channels */
|
||||||
if (!Channel_IsLocal(Channel))
|
if (!Channel_IsLocal(Channel))
|
||||||
IRC_WriteStrServersPrefix(Client, Origin,
|
IRC_WriteStrServersPrefix(Client, Origin,
|
||||||
|
Loading…
Reference in New Issue
Block a user