- assert( Client != NULL );
- assert( Client->nick[0] );
-
- IRC_WriteStr_Client( Client, This_Server, RPL_MOTDSTART_MSG, Client->nick, This_Server->host );
- IRC_WriteStr_Client( Client, This_Server, RPL_MOTD_MSG, Client->nick, "Some cool IRC server welcome message ;-)" );
- return IRC_WriteStr_Client( Client, This_Server, RPL_ENDOFMOTD_MSG, Client->nick );
-} /* Show_MOTD */
+ CLIENT *cl;
+ bool client_match;
+ char *mask = targetMask + 1;
+ const char *check_wildcards;
+
+ cl = NULL;
+
+ if (strchr(Client_Modes(from), 'o') == NULL) {
+ if (!SendErrors)
+ return true;
+ return IRC_WriteStrClient(from, ERR_NOPRIVILEGES_MSG,
+ Client_ID(from));
+ }
+
+ /*
+ * RFC 2812, sec. 3.3.1 requires that targetMask have at least one
+ * dot (".") and no wildcards ("*", "?") following the last one.
+ */
+ check_wildcards = strrchr(targetMask, '.');
+ assert(check_wildcards != NULL);
+ if (check_wildcards &&
+ check_wildcards[strcspn(check_wildcards, "*?")])
+ {
+ if (!SendErrors)
+ return true;
+ return IRC_WriteStrClient(from, ERR_WILDTOPLEVEL, targetMask);
+ }
+
+ /* #: hostmask, see RFC 2812, sec. 3.3.1 */
+ if (targetMask[0] == '#') {
+ for (cl = Client_First(); cl != NULL; cl = Client_Next(cl)) {
+ if (Client_Type(cl) != CLIENT_USER)
+ continue;
+ client_match = MatchCaseInsensitive(mask, Client_Hostname(cl));
+ if (client_match)
+ if (!IRC_WriteStrClientPrefix(cl, from, "%s %s :%s",
+ command, Client_ID(cl), message))
+ return false;
+ }
+ } else {
+ assert(targetMask[0] == '$'); /* $: server mask, see RFC 2812, sec. 3.3.1 */
+ for (cl = Client_First(); cl != NULL; cl = Client_Next(cl)) {
+ if (Client_Type(cl) != CLIENT_USER)
+ continue;
+ client_match = MatchCaseInsensitive(mask,
+ Client_ID(Client_Introducer(cl)));
+ if (client_match)
+ if (!IRC_WriteStrClientPrefix(cl, from, "%s %s :%s",
+ command, Client_ID(cl), message))
+ return false;
+ }
+ }
+ return CONNECTED;
+} /* Send_Message_Mask */