#include "irc-mode.h"
-static void Announce_Client_Hostname PARAMS((CLIENT *Origin, CLIENT *Client));
-
static bool Client_Mode PARAMS((CLIENT *Client, REQUEST *Req, CLIENT *Origin,
CLIENT *Target));
static bool Channel_Mode PARAMS((CLIENT *Client, REQUEST *Req, CLIENT *Origin,
/* Mode request: let's answer it :-) */
if (Req->argc == 1)
return IRC_WriteStrClient(Origin, RPL_UMODEIS_MSG,
- Client_ID(Origin),
+ Client_ID(Target),
Client_Modes(Target));
mode_arg = 1;
"MODE %s :%s",
Client_ID(Target),
the_modes);
- if (send_RPL_HOSTHIDDEN_MSG)
- Announce_Client_Hostname(Origin, Client);
}
+
+ if (send_RPL_HOSTHIDDEN_MSG && Client_Conn(Target) > NONE) {
+ /* A new (cloaked) hostname must be annoucned */
+ IRC_WriteStrClientPrefix(Target, Origin,
+ RPL_HOSTHIDDEN_MSG,
+ Client_ID(Target),
+ Client_HostnameDisplayed(Target));
+
+ }
+
LogDebug("%s \"%s\": Mode change, now \"%s\".",
Client_TypeText(Target), Client_Mask(Target),
Client_Modes(Target));
} /* Client_Mode */
-/**
- * Announce changed client hostname in the network.
- *
- * @param Client The client of which the hostname changed.
- */
-static void
-Announce_Client_Hostname(CLIENT *Origin, CLIENT *Client)
-{
- assert(Client != NULL);
-
- /* Inform the client itself */
- IRC_WriteStrClient(Client, RPL_HOSTHIDDEN_MSG, Client_ID(Client),
- Client_HostnameCloaked(Client));
-
- /* Inform other servers in the network */
- IRC_WriteStrServersPrefixFlag(Origin, Client_ThisServer(), 'M',
- "METADATA %s host :%s", Client_ID(Client),
- Client_HostnameCloaked(Client));
-}
-
-
static bool
Channel_Mode_Answer_Request(CLIENT *Origin, CHANNEL *Channel)
{
if (arg_arg >= Req->argc)
arg_arg = -1;
- if(!is_machine) {
+ if(!is_machine && !is_oper) {
o_mode_ptr = Channel_UserModes(Channel, Client);
while( *o_mode_ptr ) {
if ( *o_mode_ptr == 'q')
Req->argv[arg_arg][0] = '\0';
arg_arg++;
} else {
+#ifdef STRICT_RFC
+ /* Only send error message in "strict" mode,
+ * this is how ircd2.11 and others behave ... */
connected = IRC_WriteStrClient(Origin,
ERR_NEEDMOREPARAMS_MSG,
Client_ID(Origin), Req->command);
+#endif
goto chan_exit;
}
break;
Req->argv[arg_arg][0] = '\0';
arg_arg++;
} else {
+#ifdef STRICT_RFC
+ /* Only send error message in "strict" mode,
+ * this is how ircd2.11 and others behave ... */
connected = IRC_WriteStrClient(Origin,
ERR_NEEDMOREPARAMS_MSG,
Client_ID(Origin), Req->command);
+#endif
goto chan_exit;
}
break;
Req->argv[arg_arg][0] = '\0';
arg_arg++;
} else {
+#ifdef STRICT_RFC
+ /* Report an error to the client, when a user
+ * mode should be changed but no nickname is
+ * given. But don't do it when not in "strict"
+ * mode, because most other servers don't do
+ * it as well and some clients send "wired"
+ * MODE commands like "MODE #chan -ooo nick". */
connected = IRC_WriteStrClient(Origin,
ERR_NEEDMOREPARAMS_MSG,
Client_ID(Origin), Req->command);
+#endif
goto chan_exit;
}
break;