X-Git-Url: http://git.pk910.de/?p=ircu2.10.12-pk.git;a=blobdiff_plain;f=ircd%2Fs_numeric.c;fp=ircd%2Fs_numeric.c;h=333d0f007f55c9a79dc47f9dafeb9c5f4c2f4280;hp=0000000000000000000000000000000000000000;hb=0400a5a6479398d82526785c18c0df8bc8b92dce;hpb=d17e10da972ce5776c60b4c317267c6abe0e1ead diff --git a/ircd/s_numeric.c b/ircd/s_numeric.c new file mode 100644 index 0000000..333d0f0 --- /dev/null +++ b/ircd/s_numeric.c @@ -0,0 +1,105 @@ +/* + * 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$ + */ +#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, + "%H %s", achptr, parv[2]); + return 0; +}