aboutsummaryrefslogtreecommitdiff
path: root/ircd/s_debug.c
diff options
context:
space:
mode:
Diffstat (limited to 'ircd/s_debug.c')
-rw-r--r--ircd/s_debug.c668
1 files changed, 668 insertions, 0 deletions
diff --git a/ircd/s_debug.c b/ircd/s_debug.c
new file mode 100644
index 0000000..c3d9c4f
--- /dev/null
+++ b/ircd/s_debug.c
@@ -0,0 +1,668 @@
+/************************************************************************
+ * IRC - Internet Relay Chat, ircd/s_debug.c
+ * Copyright (C) 1990 Jarkko Oikarinen and
+ * University of Oulu, Computing Center
+ *
+ * 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.
+ */
+
+#ifndef lint
+static char rcsid[] = "@(#)$Id: s_debug.c,v 1.28 1999/07/11 22:11:17 kalt Exp $";
+#endif
+
+#include "os.h"
+#include "s_defines.h"
+#define S_DEBUG_C
+#include "s_externs.h"
+#undef S_DEBUG_C
+
+/*
+ * Option string. Must be before #ifdef DEBUGMODE.
+ * spaces are not allowed.
+ */
+char serveropts[] = {
+#ifndef NO_IDENT
+'a',
+#endif
+#ifdef CHROOTDIR
+'c',
+#endif
+#ifdef CMDLINE_CONFIG
+'C',
+#endif
+#ifdef DEBUGMODE
+'D',
+#endif
+#ifdef RANDOM_NDELAY
+'d',
+#endif
+#if defined(LOCOP_REHASH) && defined(OPER_REHASH)
+'e',
+#endif
+#ifdef OPER_REHASH
+'E',
+#endif
+#ifdef SLOW_ACCEPT
+'f',
+#endif
+#ifdef CLONE_CHECK
+'F',
+#endif
+#ifdef SUN_GSO_BUG
+'g',
+#endif
+#ifdef HUB
+'H',
+#endif
+#ifdef BETTER_CDELAY
+'h',
+#endif
+#ifdef SHOW_INVISIBLE_LUSERS
+'i',
+#endif
+#ifndef NO_DEFAULT_INVISIBLE
+'I',
+#endif
+#if defined(LOCOP_DIE) && defined(OPER_DIE)
+'j',
+#endif
+#ifdef OPER_DIE
+'J',
+#endif
+#ifdef OPER_KILL
+# ifdef LOCAL_KILL_ONLY
+'k',
+# else
+'K',
+# endif
+#endif
+#ifdef LEAST_IDLE
+'L',
+#endif
+#ifdef M4_PREPROC
+'m',
+#endif
+#ifdef IDLE_FROM_MSG
+'M',
+#endif
+#ifdef NPATH /* gone */
+'N',
+#endif
+#ifdef BETTER_NDELAY
+'n',
+#endif
+#ifdef CRYPT_OPER_PASSWORD
+'p',
+#endif
+#ifdef CRYPT_LINK_PASSWORD
+'P',
+#endif
+#if defined(LOCOP_RESTART) && defined(OPER_RESTART)
+'r',
+#endif
+#ifdef OPER_RESTART
+'R',
+#endif
+#ifdef USE_SERVICES
+'s',
+#endif
+#ifdef ENABLE_SUMMON
+'S',
+#endif
+#ifdef OPER_REMOTE
+'t',
+#endif
+#ifndef NO_PREFIX
+'u',
+#endif
+#ifdef ENABLE_USERS
+'U',
+#endif
+#ifdef VALLOC
+'V',
+#endif
+#ifdef NOWRITEALARM
+'w',
+#endif
+#ifdef UNIXPORT
+'X',
+#endif
+#ifdef USE_SYSLOG
+'Y',
+#endif
+#ifdef ZIP_LINKS
+'Z',
+#endif
+#ifdef INET6
+'6',
+#endif
+'\0'};
+
+#ifdef DEBUGMODE
+static char debugbuf[2*READBUF_SIZE]; /* needs to be big.. */
+
+#if ! USE_STDARG
+void debug(level, form, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10)
+int level;
+char *form, *p1, *p2, *p3, *p4, *p5, *p6, *p7, *p8, *p9, *p10;
+#else
+void debug(int level, char *form, ...)
+#endif
+{
+ int err = errno;
+
+#ifdef USE_SYSLOG
+ if (level == DEBUG_ERROR)
+ {
+#if ! USE_STDARG
+ syslog(LOG_ERR, form, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10);
+#else
+# if HAVE_VSYSLOG
+ va_list va;
+ va_start(va, form);
+ vsyslog(LOG_ERR, form, va);
+ va_end(va);
+# else
+ va_list va;
+ va_start(va, form);
+ vsprintf(debugbuf, form, va);
+ va_end(va);
+ syslog(LOG_ERR, debugbuf);
+# endif
+#endif
+ }
+#endif
+ if ((debuglevel >= 0) && (level <= debuglevel))
+ {
+#if ! USE_STDARG
+ (void)sprintf(debugbuf, form,
+ p1, p2, p3, p4, p5, p6, p7, p8, p9, p10);
+#else
+ va_list va;
+ va_start(va, form);
+ (void)vsprintf(debugbuf, form, va);
+ va_end(va);
+#endif
+ if (local[2])
+ {
+ local[2]->sendM++;
+ local[2]->sendB += strlen(debugbuf);
+ }
+ (void)fprintf(stderr, "%s", debugbuf);
+ (void)fputc('\n', stderr);
+ }
+ errno = err;
+}
+#endif /* DEBUGMODE */
+
+/*
+ * This is part of the STATS replies. There is no offical numeric for this
+ * since this isnt an official command, in much the same way as HASH isnt.
+ * It is also possible that some systems wont support this call or have
+ * different field names for "struct rusage".
+ * -avalon
+ */
+void send_usage(cptr, nick)
+aClient *cptr;
+char *nick;
+{
+#if HAVE_GETRUSAGE
+ struct rusage rus;
+ time_t secs, rup;
+#ifdef hz
+# define hzz hz
+#else
+# ifdef HZ
+# define hzz HZ
+# else
+ int hzz = 1;
+# ifdef HPUX
+ hzz = (int)sysconf(_SC_CLK_TCK);
+# endif
+# endif
+#endif
+
+ if (getrusage(RUSAGE_SELF, &rus) == -1)
+ {
+ sendto_one(cptr,":%s NOTICE %s :Getruseage error: %s.",
+ me.name, nick, sys_errlist[errno]);
+ return;
+ }
+ secs = rus.ru_utime.tv_sec + rus.ru_stime.tv_sec;
+ rup = timeofday - me.since;
+ if (secs == 0)
+ secs = 1;
+
+ sendto_one(cptr,
+ ":%s %d %s :CPU Secs %d:%d User %d:%d System %d:%d",
+ me.name, RPL_STATSDEBUG, nick, secs/60, secs%60,
+ rus.ru_utime.tv_sec/60, rus.ru_utime.tv_sec%60,
+ rus.ru_stime.tv_sec/60, rus.ru_stime.tv_sec%60);
+ if (rup && hzz)
+ sendto_one(cptr, ":%s %d %s :RSS %d ShMem %d Data %d Stack %d",
+ me.name, RPL_STATSDEBUG, nick, rus.ru_maxrss,
+ rus.ru_ixrss / (rup * hzz),
+ rus.ru_idrss / (rup * hzz),
+ rus.ru_isrss / (rup * hzz));
+ sendto_one(cptr, ":%s %d %s :Swaps %d Reclaims %d Faults %d",
+ me.name, RPL_STATSDEBUG, nick, rus.ru_nswap,
+ rus.ru_minflt, rus.ru_majflt);
+ sendto_one(cptr, ":%s %d %s :Block in %d out %d",
+ me.name, RPL_STATSDEBUG, nick, rus.ru_inblock,
+ rus.ru_oublock);
+ sendto_one(cptr, ":%s %d %s :Msg Rcv %d Send %d",
+ me.name, RPL_STATSDEBUG, nick, rus.ru_msgrcv, rus.ru_msgsnd);
+ sendto_one(cptr, ":%s %d %s :Signals %d Context Vol. %d Invol %d",
+ me.name, RPL_STATSDEBUG, nick, rus.ru_nsignals,
+ rus.ru_nvcsw, rus.ru_nivcsw);
+#else /* HAVE_GETRUSAGE */
+# if HAVE_TIMES
+ struct tms tmsbuf;
+ time_t secs, mins;
+ int hzz = 1, ticpermin;
+ int umin, smin, usec, ssec;
+
+# ifdef HPUX
+ hzz = sysconf(_SC_CLK_TCK);
+# endif
+ ticpermin = hzz * 60;
+
+ umin = tmsbuf.tms_utime / ticpermin;
+ usec = (tmsbuf.tms_utime%ticpermin)/(float)hzz;
+ smin = tmsbuf.tms_stime / ticpermin;
+ ssec = (tmsbuf.tms_stime%ticpermin)/(float)hzz;
+ secs = usec + ssec;
+ mins = (secs/60) + umin + smin;
+ secs %= hzz;
+
+ if (times(&tmsbuf) == -1)
+ {
+ sendto_one(cptr, ":%s %d %s :times(2) error: %s.",
+ me.name, RPL_STATSDEBUG, nick, strerror(errno));
+ return;
+ }
+ secs = tmsbuf.tms_utime + tmsbuf.tms_stime;
+
+ sendto_one(cptr,
+ ":%s %d %s :CPU Secs %d:%d User %d:%d System %d:%d",
+ me.name, RPL_STATSDEBUG, nick, mins, secs, umin, usec,
+ smin, ssec);
+# endif /* HAVE_TIMES */
+#endif /* HAVE_GETRUSAGE */
+ sendto_one(cptr, ":%s %d %s :DBUF alloc %d blocks %d",
+ me.name, RPL_STATSDEBUG, nick, istat.is_dbufuse,
+ istat.is_dbufnow);
+#ifdef DEBUGMODE
+ sendto_one(cptr, ":%s %d %s :Reads %d Writes %d",
+ me.name, RPL_STATSDEBUG, nick, readcalls, writecalls);
+ sendto_one(cptr,
+ ":%s %d %s :Writes: <0 %d 0 %d <16 %d <32 %d <64 %d",
+ me.name, RPL_STATSDEBUG, nick,
+ writeb[0], writeb[1], writeb[2], writeb[3], writeb[4]);
+ sendto_one(cptr,
+ ":%s %d %s :<128 %d <256 %d <512 %d <1024 %d >1024 %d",
+ me.name, RPL_STATSDEBUG, nick,
+ writeb[5], writeb[6], writeb[7], writeb[8], writeb[9]);
+#endif
+ return;
+}
+
+void send_defines(cptr, nick)
+aClient *cptr;
+char *nick;
+{
+ sendto_one(cptr, ":%s %d %s :HUB:%s MS:%d",
+ ME, RPL_STATSDEFINE, nick,
+#ifdef HUB
+ "yes",
+#else
+ "no",
+#endif
+ MAXSERVERS);
+ sendto_one(cptr,
+ ":%s %d %s :LQ:%d MXC:%d TS:%d HRD:%d HGL:%d WWD:%d ATO:%d",
+ ME, RPL_STATSDEFINE, nick, LISTENQUEUE, MAXCONNECTIONS,
+ TIMESEC, HANGONRETRYDELAY, HANGONGOODLINK, WRITEWAITDELAY,
+ ACCEPTTIMEOUT);
+ sendto_one(cptr, ":%s %d %s :KCTL:%d DCTL:%d LDCTL: %d CF:%d MCPU:%d",
+ ME, RPL_STATSDEFINE, nick, KILLCHASETIMELIMIT,
+ DELAYCHASETIMELIMIT, LDELAYCHASETIMELIMIT,
+ CLIENT_FLOOD, MAXCHANNELSPERUSER);
+ sendto_one(cptr, ":%s %d %s :H:%d N:%d U:%d R:%d T:%d C:%d P:%d K:%d",
+ ME, RPL_STATSDEFINE, nick, HOSTLEN, NICKLEN, USERLEN,
+ REALLEN, TOPICLEN, CHANNELLEN, PASSWDLEN, KEYLEN);
+ sendto_one(cptr, ":%s %d %s :BS:%d MXR:%d MXB:%d MXBL:%d PY:%d",
+ ME, RPL_STATSDEFINE, nick, BUFSIZE, MAXRECIPIENTS, MAXBANS,
+ MAXBANLENGTH, MAXPENALTY);
+ sendto_one(cptr, ":%s %d %s :ZL:%d CM:%d CP:%d",
+ ME, RPL_STATSDEFINE, nick,
+#ifdef ZIP_LINKS
+ ZIP_LEVEL,
+#else
+ -1,
+#endif
+#ifdef CLONE_CHECK
+ CLONE_MAX, CLONE_PERIOD
+#else
+ -1, -1
+#endif
+ );
+}
+
+void count_memory(cptr, nick, debug)
+aClient *cptr;
+char *nick;
+int debug;
+{
+ extern aChannel *channel;
+ extern aClass *classes;
+ extern aConfItem *conf;
+ extern int _HASHSIZE, _CHANNELHASHSIZE;
+
+ Reg aClient *acptr;
+ Reg Link *link;
+ Reg aChannel *chptr;
+ Reg aConfItem *aconf;
+ Reg aClass *cltmp;
+
+ int lc = 0, d_lc = 0, /* local clients */
+ ch = 0, d_ch = 0, /* channels */
+ lcc = 0, d_lcc = 0, /* local client conf links */
+ rc = 0, d_rc = 0, /* remote clients */
+ us = 0, d_us = 0, /* user structs */
+ chu = 0, d_chu = 0, /* channel users */
+ chi = 0, d_chi = 0, /* channel invites */
+ chb = 0, d_chb = 0, /* channel bans */
+ chh = 0, d_chh = 0, /* channel in history */
+ wwu = 0, d_wwu = 0, /* whowas users */
+ cl = 0, d_cl = 0, /* classes */
+ co = 0, d_co = 0; /* conf lines */
+
+ int usi = 0, d_usi = 0, /* users invited */
+ usc = 0, d_usc = 0, /* users in channels */
+ aw = 0, d_aw = 0, /* aways set */
+ wwa = 0, d_wwa = 0, /* whowas aways */
+ wwuw = 0, d_wwuw = 0; /* whowas uwas */
+
+ u_long chm = 0, d_chm = 0, /* memory used by channels */
+ chhm = 0, d_chhm = 0, /* memory used by channel in history */
+ chbm = 0, d_chbm = 0, /* memory used by channel bans */
+ lcm = 0, d_lcm = 0, /* memory used by local clients */
+ rcm = 0, d_rcm = 0, /* memory used by remote clients */
+ awm = 0, d_awm = 0, /* memory used by aways */
+ wwam = 0, d_wwam = 0, /* whowas away memory used */
+ wwm = 0, d_wwm = 0, /* whowas array memory used */
+ dm = 0, d_dm = 0, /* delay array memory used */
+ com = 0, d_com = 0, /* memory used by conf lines */
+ db = 0, d_db = 0, /* memory used by dbufs */
+ rm = 0, d_rm = 0, /* res memory used */
+ totcl = 0, d_totcl = 0,
+ totch = 0, d_totch = 0,
+ totww = 0, d_totww = 0,
+ tot = 0, d_tot = 0;
+ time_t start = 0;
+
+ if (debug)
+ {
+ start = time(NULL);
+ count_whowas_memory(&d_wwu, &d_wwa, &d_wwam, &d_wwuw);
+ d_wwm = sizeof(aName) * ww_size;
+ d_dm = sizeof(aLock) * lk_size;
+ }
+ wwu = istat.is_wwusers;
+ wwa = istat.is_wwaways;
+ wwam = istat.is_wwawaysmem;
+ wwuw = istat.is_wwuwas;
+ wwm = sizeof(aName) * ww_size;
+ dm = sizeof(aLock) * lk_size;
+
+ /*lc = istat.is_unknown + istat.is_myclnt + istat.is_serv;*/
+ lc = istat.is_localc;
+ lcc = istat.is_conflink;
+ rc = istat.is_remc;
+ us = istat.is_users;
+ usi = istat.is_useri;
+ usc = istat.is_userc;
+ aw = istat.is_away;
+ awm = istat.is_awaymem;
+
+ if (debug)
+ for (acptr = client; acptr; acptr = acptr->next)
+ {
+ if (MyConnect(acptr))
+ {
+ d_lc++;
+ for (link =acptr->confs; link; link=link->next)
+ d_lcc++;
+ }
+ else
+ d_rc++;
+ if (acptr->user)
+ {
+ d_us++;
+ for (link = acptr->user->invited; link;
+ link = link->next)
+ d_usi++;
+ d_usc += acptr->user->joined;
+ if (acptr->user->away)
+ {
+ d_aw++;
+ d_awm += (strlen(acptr->user->away)+1);
+ }
+ }
+ }
+
+ lcm = lc * CLIENT_LOCAL_SIZE;
+ rcm = rc * CLIENT_REMOTE_SIZE;
+
+ d_lcm = d_lc * CLIENT_LOCAL_SIZE;
+ d_rcm = d_rc * CLIENT_REMOTE_SIZE;
+
+ ch = istat.is_chan;
+ chm = istat.is_chanmem;
+ chh = istat.is_hchan;
+ chhm = istat.is_hchanmem;
+ chi = istat.is_invite;
+ chb = istat.is_bans;
+ chbm = istat.is_banmem + chb * sizeof(Link);
+ chu = istat.is_chanusers;
+
+ if (debug)
+ {
+ for (chptr = channel; chptr; chptr = chptr->nextch)
+ {
+ if (chptr->users == 0)
+ {
+ d_chh++;
+ d_chhm+=strlen(chptr->chname)+sizeof(aChannel);
+ }
+ else
+ {
+ d_ch++;
+ d_chm += (strlen(chptr->chname) +
+ sizeof(aChannel));
+ }
+ for (link = chptr->members; link; link = link->next)
+ d_chu++;
+ for (link = chptr->invites; link; link = link->next)
+ d_chi++;
+ for (link = chptr->mlist; link; link = link->next)
+ {
+ d_chb++;
+ d_chbm += strlen(link->value.cp) + 1;
+ }
+ }
+ d_chbm += d_chb * sizeof(Link);
+ }
+
+ co = istat.is_conf;
+ com = istat.is_confmem;
+ cl = istat.is_class;
+
+ if (debug)
+ {
+ for (aconf = conf; aconf; aconf = aconf->next)
+ {
+ d_co++;
+ d_com += aconf->host ? strlen(aconf->host)+1 : 0;
+ d_com += aconf->passwd ? strlen(aconf->passwd)+1 : 0;
+ d_com += aconf->name ? strlen(aconf->name)+1 : 0;
+ d_com += aconf->ping ? sizeof(*aconf->ping) : 0;
+ d_com += sizeof(aConfItem);
+ }
+ for (cltmp = classes; cltmp; cltmp = cltmp->next)
+ d_cl++;
+ }
+
+ if (debug)
+ sendto_one(cptr, ":%s %d %s :Request processed in %u seconds",
+ me.name, RPL_STATSDEBUG, nick, time(NULL) - start);
+
+ sendto_one(cptr,
+ ":%s %d %s :Client Local %d(%d) Remote %d(%d) Auth %d(%d)",
+ me.name, RPL_STATSDEBUG, nick, lc, lcm, rc, rcm,
+ istat.is_auth, istat.is_authmem);
+ if (debug
+ && (lc != d_lc || lcm != d_lcm || rc != d_rc || rcm != d_rcm))
+ sendto_one(cptr,
+ ":%s %d %s :Client Local %d(%d) Remote %d(%d) [REAL]",
+ me.name, RPL_STATSDEBUG, nick, d_lc, d_lcm, d_rc,
+ d_rcm);
+ sendto_one(cptr,
+ ":%s %d %s :Users %d in/visible %d/%d(%d) Invites %d(%d)",
+ me.name, RPL_STATSDEBUG, nick, us, istat.is_user[1],
+ istat.is_user[0], us*sizeof(anUser), usi,
+ usi*sizeof(Link));
+ if (debug && (us != d_us || usi != d_usi))
+ sendto_one(cptr,
+ ":%s %d %s :Users %d(%d) Invites %d(%d) [REAL]",
+ me.name, RPL_STATSDEBUG, nick, d_us,
+ d_us*sizeof(anUser), d_usi, d_usi * sizeof(Link));
+ sendto_one(cptr, ":%s %d %s :User channels %d(%d) Aways %d(%d)",
+ me.name, RPL_STATSDEBUG, nick, usc, usc*sizeof(Link),
+ aw, awm);
+ if (debug && (usc != d_usc || aw != d_aw || awm != d_awm))
+ sendto_one(cptr,
+ ":%s %d %s :User channels %d(%d) Aways %d(%d) [REAL]",
+ me.name, RPL_STATSDEBUG, nick, d_usc,
+ d_usc*sizeof(Link), d_aw, d_awm);
+ sendto_one(cptr, ":%s %d %s :Attached confs %d(%d)",
+ me.name, RPL_STATSDEBUG, nick, lcc, lcc*sizeof(Link));
+ if (debug && lcc != d_lcc)
+ sendto_one(cptr, ":%s %d %s :Attached confs %d(%d) [REAL]",
+ me.name, RPL_STATSDEBUG, nick, d_lcc,
+ d_lcc*sizeof(Link));
+
+ totcl = lcm + rcm + us*sizeof(anUser) + usc*sizeof(Link) + awm;
+ totcl += lcc*sizeof(Link) + usi*sizeof(Link);
+ d_totcl = d_lcm + d_rcm + d_us*sizeof(anUser) + d_usc*sizeof(Link);
+ d_totcl += d_awm + d_lcc*sizeof(Link) + d_usi*sizeof(Link);
+
+ sendto_one(cptr, ":%s %d %s :Conflines %d(%d)",
+ me.name, RPL_STATSDEBUG, nick, co, com);
+ if (debug && (co != d_co || com != d_com))
+ sendto_one(cptr, ":%s %d %s :Conflines %d(%d) [REAL]",
+ me.name, RPL_STATSDEBUG, nick, d_co, d_com);
+
+ sendto_one(cptr, ":%s %d %s :Classes %d(%d)",
+ me.name, RPL_STATSDEBUG, nick, cl, cl*sizeof(aClass));
+ if (debug && cl != d_cl)
+ sendto_one(cptr, ":%s %d %s :Classes %d(%d) [REAL]",
+ me.name, RPL_STATSDEBUG, nick, d_cl,
+ d_cl*sizeof(aClass));
+
+ sendto_one(cptr,
+ ":%s %d %s :Channels %d(%d) Modes %d(%d) History %d(%d) Cache %d(%d)",
+ me.name, RPL_STATSDEBUG, nick, ch, chm, chb, chbm, chh,
+ chhm, istat.is_cchan, istat.is_cchanmem);
+ if (debug && (ch != d_ch || chm != d_chm || chb != d_chb
+ || chbm != d_chbm || chh != d_chh || chhm != d_chhm))
+ sendto_one(cptr,
+ ":%s %d %s :Channels %d(%d) Modes %d(%d) History %d(%d) [REAL]",
+ me.name, RPL_STATSDEBUG, nick, d_ch, d_chm, d_chb,
+ d_chbm, d_chh, d_chhm);
+ sendto_one(cptr, ":%s %d %s :Channel members %d(%d) invite %d(%d)",
+ me.name, RPL_STATSDEBUG, nick, chu, chu*sizeof(Link),
+ chi, chi*sizeof(Link));
+ if (debug && (chu != d_chu || chi != d_chi))
+ sendto_one(cptr,
+ ":%s %d %s :Channel members %d(%d) invite %d(%d) [REAL]",
+ me.name, RPL_STATSDEBUG, nick, d_chu, d_chu*sizeof(Link),
+ d_chi, d_chi*sizeof(Link));
+
+ totch = chm + chhm + chbm + chu*sizeof(Link) + chi*sizeof(Link);
+ d_totch = d_chm + d_chhm + d_chbm + d_chu*sizeof(Link)
+ + d_chi*sizeof(Link);
+
+ sendto_one(cptr,
+ ":%s %d %s :Whowas users %d(%d) away %d(%d) links %d(%d)",
+ me.name, RPL_STATSDEBUG, nick, wwu, wwu*sizeof(anUser),
+ wwa, wwam, wwuw, wwuw*sizeof(Link));
+ if (debug && (wwu != d_wwu || wwa != d_wwa || wwam != d_wwam
+ || wwuw != d_wwuw))
+ sendto_one(cptr,
+ ":%s %d %s :Whowas users %d(%d) away %d(%d) links %d(%d) [REAL]",
+ me.name, RPL_STATSDEBUG, nick, d_wwu, d_wwu*sizeof(anUser),
+ d_wwa, d_wwam, d_wwuw, d_wwuw*sizeof(Link));
+ sendto_one(cptr, ":%s %d %s :Whowas array %d(%d) Delay array %d(%d)",
+ me.name, RPL_STATSDEBUG, nick, ww_size, wwm, lk_size, dm);
+ if (debug && (wwm != d_wwm || dm != d_dm))
+ sendto_one(cptr,
+ ":%s %d %s :Whowas array %d(%d) Delay array %d(%d) [REAL]",
+ me.name, RPL_STATSDEBUG, nick, ww_size, d_wwm, lk_size,
+ d_dm);
+
+ totww = wwu*sizeof(anUser) + wwam + wwm;
+ d_totww = d_wwu*sizeof(anUser) + d_wwam + d_wwm;
+
+ sendto_one(cptr, ":%s %d %s :Hash: client %d(%d) chan %d(%d)",
+ me.name, RPL_STATSDEBUG, nick, _HASHSIZE,
+ sizeof(aHashEntry) * _HASHSIZE,
+ _CHANNELHASHSIZE, sizeof(aHashEntry) * _CHANNELHASHSIZE);
+ d_db = db = istat.is_dbufnow * sizeof(dbufbuf);
+ db = istat.is_dbufnow * sizeof(dbufbuf);
+ sendto_one(cptr,
+ ":%s %d %s :Dbuf blocks %u(%d) (> %u [%u]) (%u < %u) [%u]",
+ me.name, RPL_STATSDEBUG, nick, istat.is_dbufnow, db,
+ istat.is_dbuf,
+ (u_int) (((u_int)BUFFERPOOL) / ((u_int)sizeof(dbufbuf))),
+ istat.is_dbufuse, istat.is_dbufmax, istat.is_dbufmore);
+
+ d_rm = rm = cres_mem(cptr, nick);
+
+ tot = totww + totch + totcl + com + cl*sizeof(aClass) + db + rm;
+ tot += sizeof(aHashEntry) * _HASHSIZE;
+ tot += sizeof(aHashEntry) * _CHANNELHASHSIZE;
+ d_tot = d_totww + d_totch + d_totcl + d_com + d_cl*sizeof(aClass);
+ d_tot += d_db + d_rm;
+ d_tot += sizeof(aHashEntry) * _HASHSIZE;
+ d_tot += sizeof(aHashEntry) * _CHANNELHASHSIZE;
+
+ sendto_one(cptr, ":%s %d %s :Total: ww %d ch %d cl %d co %d db %d",
+ me.name, RPL_STATSDEBUG, nick, totww, totch, totcl, com,db);
+ if (debug && tot != d_tot)
+ {
+ sendto_one(cptr,
+ ":%s %d %s :Total: ww %d ch %d cl %d co %d db %d [REAL]",
+ me.name, RPL_STATSDEBUG, nick, d_totww, d_totch, d_totcl,
+ d_com, d_db);
+ sendto_one(cptr, ":%s %d %s :TOTAL: %d [REAL]",
+ me.name, RPL_STATSDEBUG, nick, d_tot);
+ }
+ sendto_one(cptr, ":%s %d %s :TOTAL: %d sbrk(0)-etext: %u",
+ me.name, RPL_STATSDEBUG, nick, tot,
+ (u_long)sbrk((size_t)0)-(u_long)sbrk0);
+ return;
+}