106 lines
3.7 KiB
C
106 lines
3.7 KiB
C
/*
|
|
* IRC - Internet Relay Chat, ircd/s_numeric.c
|
|
* Copyright (C) 1990 Jarkko Oikarinen
|
|
*
|
|
* Numerous fixes by Markku Savela
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 1, or (at your option)
|
|
* any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
*/
|
|
/** @file
|
|
* @brief Send a numeric message to a client.
|
|
* @version $Id: s_numeric.c 1519 2005-10-10 12:18:11Z entrope $
|
|
*/
|
|
#include "config.h"
|
|
|
|
#include "s_numeric.h"
|
|
#include "channel.h"
|
|
#include "client.h"
|
|
#include "hash.h"
|
|
#include "ircd.h"
|
|
#include "ircd_features.h"
|
|
#include "ircd_snprintf.h"
|
|
#include "numnicks.h"
|
|
#include "send.h"
|
|
#include "struct.h"
|
|
|
|
|
|
/*
|
|
* do_numeric()
|
|
* Rewritten by Nemesi, Jan 1999, to support numeric nicks in parv[1]
|
|
*
|
|
* Called when we get a numeric message from a remote _server_ and we are
|
|
* supposed to forward it somewhere. Note that we always ignore numerics sent
|
|
* to 'me' and simply drop the message if we can't handle with this properly:
|
|
* the savvy approach is NEVER generate an error in response to an... error :)
|
|
*/
|
|
|
|
/** Forwards a numeric message from a remote server.
|
|
* @param numeric Value of numeric message.
|
|
* @param nnn If non-zero, treat parv[1] as a numnick; else as a client name.
|
|
* @param cptr Client that originated the numeric.
|
|
* @param sptr Peer that sent us the numeric.
|
|
* @param parc Count of valid arguments in \a parv.
|
|
* @param parv Argument list.
|
|
* @return Zero (always).
|
|
*/
|
|
int do_numeric(int numeric, int nnn, struct Client *cptr, struct Client *sptr,
|
|
int parc, char *parv[])
|
|
{
|
|
struct Client *acptr = 0;
|
|
struct Channel *achptr = 0;
|
|
char num[4];
|
|
|
|
/* Avoid trash, we need it to come from a server and have a target */
|
|
if ((parc < 2) || !IsServer(sptr))
|
|
return 0;
|
|
|
|
/* Who should receive this message ? Will we do something with it ?
|
|
Note that we use findUser functions, so the target can't be neither
|
|
a server, nor a channel (?) nor a list of targets (?) .. u2.10
|
|
should never generate numeric replies to non-users anyway
|
|
Ahem... it can be a channel actually, csc bots use it :\ --Nem */
|
|
|
|
if (IsChannelName(parv[1]))
|
|
achptr = FindChannel(parv[1]);
|
|
else
|
|
acptr = (nnn) ? (findNUser(parv[1])) : (FindUser(parv[1]));
|
|
|
|
if (((!acptr) || (cli_from(acptr) == cptr)) && !achptr)
|
|
return 0;
|
|
|
|
/* Remap low number numerics, not that I understand WHY.. --Nemesi */
|
|
/* numerics below 100 talk about the current 'connection', you're not
|
|
* connected to a remote server so it doesn't make sense to send them
|
|
* remotely - but the information they contain may be useful, so we
|
|
* remap them up. Weird, but true. -- Isomer */
|
|
if (numeric < 100)
|
|
numeric += 100;
|
|
|
|
ircd_snprintf(0, num, sizeof(num), "%03d", numeric);
|
|
|
|
/* Since 2.10.10.pl14 we rewrite numerics from remote servers to appear to
|
|
* come from the local server
|
|
*/
|
|
if (acptr)
|
|
sendcmdto_one((feature_bool(FEAT_HIS_REWRITE) && !IsOper(acptr)) ?
|
|
&me : sptr,
|
|
num, num, acptr, "%C %s", acptr, parv[2]);
|
|
else
|
|
sendcmdto_channel_butone(feature_bool(FEAT_HIS_REWRITE) ? &me : sptr,
|
|
num, num, achptr, cptr, SKIP_DEAF | SKIP_BURST,
|
|
'\0', "%H %s", achptr, parv[2]);
|
|
return 0;
|
|
}
|