*/
/** @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"
#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. */
#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
#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 */
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);
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 */
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;
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;
}