added basic ssl support to ircu
[ircu2.10.12-pk.git] / ircd / s_numeric.c
index 2fb84f419fc7b51e17dfe9c8ec8193196af7adb4..333d0f007f55c9a79dc47f9dafeb9c5f4c2f4280 100644 (file)
  * 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.
- *
- * $Id$
+ */
+/** @file
+ * @brief Send a numeric message to a client.
+ * @version $Id$
  */
 #include "config.h"
 
@@ -27,6 +29,7 @@
 #include "client.h"
 #include "hash.h"
 #include "ircd.h"
+#include "ircd_features.h"
 #include "ircd_snprintf.h"
 #include "numnicks.h"
 #include "send.h"
  * 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 savy approach is NEVER generate an error in response to an... error :)
+ * 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[])
 {
@@ -78,11 +90,16 @@ int do_numeric(int numeric, int nnn, struct Client *cptr, struct Client *sptr,
 
   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(sptr, num, num, acptr, "%C %s", acptr, parv[2]);
+    sendcmdto_one((feature_bool(FEAT_HIS_REWRITE) && !IsOper(acptr)) ?
+                    &me : sptr,
+                  num, num, acptr, "%C %s", acptr, parv[2]);
   else
-    sendcmdto_channel_butone(sptr, num, num, achptr, cptr,
-                            SKIP_DEAF | SKIP_BURST, "%H %s", achptr, parv[2]);
-
+    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;
 }