]> jfr.im git - irc/quakenet/snircd.git/blobdiff - ircd/ircd_snprintf.c
add sbounce from asuka into snircd tree
[irc/quakenet/snircd.git] / ircd / ircd_snprintf.c
index 673daa894d6c997f5c1a665f50143429fd8acfde..e974a760f7d8cea363634c586678dd4b22258226 100644 (file)
@@ -18,7 +18,7 @@
  */
 /** @file
  * @brief IRC-specific printf() clone implementation.
- * @version $Id: ircd_snprintf.c,v 1.18 2004/12/11 05:13:45 klmitch Exp $
+ * @version $Id: ircd_snprintf.c,v 1.18.2.2 2006/04/07 03:51:48 entrope Exp $
  */
 #include "config.h"
 
@@ -36,7 +36,7 @@
 #include <time.h>
 
 /* Inhibit complaints when we use GCC extensions */
-#if defined(__GNUC__) && defined(HAVE_LONG_LONG)
+#if defined(__GNUC__) && SIZEOF_LONG_LONG
 # define EXTENSION __extension__
 #else
 /** Fallback (empty) definition of EXTENSION. */
@@ -44,7 +44,7 @@
 #endif
 
 /* Find the largest type */
-#ifdef HAVE_LONG_LONG
+#if SIZEOF_LONG_LONG
 EXTENSION typedef long long _large_t;
 EXTENSION typedef unsigned long long _ularge_t;
 # define SIZEOF__LARGE_T SIZEOF_LONG_LONG
@@ -180,8 +180,8 @@ struct FieldData {
 #define CONV_VARARGS   0x05000000      /**< convert a %v */
 #define CONV_CLIENT    0x06000000      /**< convert a struct Client */
 #define CONV_CHANNEL   0x07000000      /**< convert a struct Channel */
+#define CONV_REAL      0x08000000      /**< convert a struct Client and show realhost */
 
-#define CONV_RESERVED7 0x08000000      /**< reserved for future expansion */
 #define CONV_RESERVED6 0x09000000      /**< reserved for future expansion */
 #define CONV_RESERVED5 0x0a000000      /**< reserved for future expansion */
 #define CONV_RESERVED4 0x0b000000      /**< reserved for future expansion */
@@ -1778,6 +1778,11 @@ doprintf(struct Client *dest, struct BufData *buf_p, const char *fmt,
        fld_s.flags |= ARG_PTR | CONV_CLIENT;
        break;
 
+      case 'R': /* convert a client name... */
+        fld_s.flags &= ~(FLAG_PLUS | FLAG_SPACE | FLAG_ZERO | TYPE_MASK);
+        fld_s.flags |= ARG_PTR | CONV_REAL;
+        break;
+       
       case 'H': /* convert a channel name... */
        fld_s.flags &= ~(FLAG_PLUS | FLAG_SPACE | FLAG_ALT | FLAG_ZERO |
                         FLAG_COLON | TYPE_MASK);
@@ -1805,7 +1810,7 @@ doprintf(struct Client *dest, struct BufData *buf_p, const char *fmt,
        if (fld_s.flags & TYPE_CHAR) /* eg, %hhu */
          fld_s.value.v_int = (unsigned char)va_arg(vp, unsigned int);
        else if (fld_s.flags & TYPE_SHORT) /* eg, %hu */
-         fld_s.value.v_int = (short)va_arg(vp, unsigned int);
+         fld_s.value.v_int = (unsigned short)va_arg(vp, unsigned int);
        else if (fld_s.flags & TYPE_QUAD) /* eg, %qu */
          fld_s.value.v_int = va_arg(vp, uint64_t);
        else if (fld_s.flags & TYPE_LONG) /* eg, %lu */
@@ -2038,7 +2043,8 @@ doprintf(struct Client *dest, struct BufData *buf_p, const char *fmt,
 
       vdata->vd_chars = buf_s.buf_loc; /* return relevant data */
       vdata->vd_overflow = SNP_MAX(buf_s.buf_overflow, buf_s.overflow);
-    } else if ((fld_s.flags & CONV_MASK) == CONV_CLIENT) {
+    } else if (((fld_s.flags & CONV_MASK) == CONV_CLIENT) ||
+               ((fld_s.flags & CONV_MASK) == CONV_REAL)) {
       struct Client *cptr = (struct Client*) fld_s.value.v_ptr;
       const char *str1 = 0, *str2 = 0, *str3 = 0;
       int slen1 = 0, slen2 = 0, slen3 = 0, elen = 0, plen = 0;
@@ -2057,8 +2063,13 @@ doprintf(struct Client *dest, struct BufData *buf_p, const char *fmt,
        if (!IsServer(cptr) && !IsMe(cptr) && fld_s.flags & FLAG_ALT) {
          assert(0 != cli_user(cptr));
          assert(0 != *(cli_name(cptr)));
-         str2 = cli_user(cptr)->username;
-         str3 = cli_user(cptr)->host;
+          if ((fld_s.flags & CONV_MASK) == CONV_REAL) {
+            str2 = cli_user(cptr)->realusername;
+            str3 = cli_user(cptr)->realhost;
+          } else {
+            str2 = cli_user(cptr)->username;
+            str3 = cli_user(cptr)->host;
+          }
        } else
          fld_s.flags &= ~FLAG_ALT;
       }