+ struct Client *target_p;
+ struct Channel *chptr;
+ struct Ban *actualBan;
+ rb_dlink_node *rb_dlink;
+ rb_dlink_node *ptr;
+ int channel_count = 0;
+ int local_client_conf_count = 0; /* local client conf links */
+ int users_counted = 0; /* user structs */
+
+ int channel_users = 0;
+ int channel_invites = 0;
+ int channel_bans = 0;
+ int channel_except = 0;
+ int channel_invex = 0;
+ int channel_quiets = 0;
+
+ int class_count = 0; /* classes */
+ int conf_count = 0; /* conf lines */
+ int users_invited_count = 0; /* users invited */
+ int user_channels = 0; /* users in channels */
+ int aways_counted = 0;
+ size_t number_servers_cached; /* number of servers cached by scache */
+
+ size_t channel_memory = 0;
+ size_t channel_ban_memory = 0;
+ size_t channel_except_memory = 0;
+ size_t channel_invex_memory = 0;
+ size_t channel_quiet_memory = 0;
+
+ size_t away_memory = 0; /* memory used by aways */
+ size_t ww = 0; /* whowas array count */
+ size_t wwm = 0; /* whowas array memory used */
+ size_t conf_memory = 0; /* memory used by conf lines */
+ size_t mem_servers_cached; /* memory used by scache */
+
+ size_t linebuf_count = 0;
+ size_t linebuf_memory_used = 0;
+
+ size_t total_channel_memory = 0;
+ size_t totww = 0;
+
+ size_t local_client_count = 0;
+ size_t local_client_memory_used = 0;
+
+ size_t remote_client_count = 0;
+ size_t remote_client_memory_used = 0;
+
+ size_t total_memory = 0;
+
+ count_whowas_memory(&ww, &wwm);
+
+ RB_DLINK_FOREACH(ptr, global_client_list.head)
+ {
+ target_p = ptr->data;
+ if(MyConnect(target_p))
+ {
+ local_client_conf_count++;
+ }
+
+ if(target_p->user)
+ {
+ users_counted++;
+ users_invited_count += rb_dlink_list_length(&target_p->user->invited);
+ user_channels += rb_dlink_list_length(&target_p->user->channel);
+ if(target_p->user->away)
+ {
+ aways_counted++;
+ away_memory += (strlen(target_p->user->away) + 1);
+ }
+ }
+ }
+
+ /* Count up all channels, ban lists, except lists, Invex lists */
+ RB_DLINK_FOREACH(ptr, global_channel_list.head)
+ {
+ chptr = ptr->data;
+ channel_count++;
+ channel_memory += (strlen(chptr->chname) + sizeof(struct Channel));
+
+ channel_users += rb_dlink_list_length(&chptr->members);
+ channel_invites += rb_dlink_list_length(&chptr->invites);
+
+ RB_DLINK_FOREACH(rb_dlink, chptr->banlist.head)
+ {
+ actualBan = rb_dlink->data;
+ channel_bans++;
+
+ channel_ban_memory += sizeof(rb_dlink_node) + sizeof(struct Ban);
+ }
+
+ RB_DLINK_FOREACH(rb_dlink, chptr->exceptlist.head)
+ {
+ actualBan = rb_dlink->data;
+ channel_except++;
+
+ channel_except_memory += (sizeof(rb_dlink_node) + sizeof(struct Ban));
+ }
+
+ RB_DLINK_FOREACH(rb_dlink, chptr->invexlist.head)
+ {
+ actualBan = rb_dlink->data;
+ channel_invex++;
+
+ channel_invex_memory += (sizeof(rb_dlink_node) + sizeof(struct Ban));
+ }
+
+ RB_DLINK_FOREACH(rb_dlink, chptr->quietlist.head)
+ {
+ actualBan = rb_dlink->data;
+ channel_quiets++;
+
+ channel_quiet_memory += (sizeof(rb_dlink_node) + sizeof(struct Ban));
+ }
+ }
+
+ /* count up all classes */
+
+ class_count = rb_dlink_list_length(&class_list) + 1;
+
+ rb_count_rb_linebuf_memory(&linebuf_count, &linebuf_memory_used);
+
+ sendto_one_numeric(source_p, RPL_STATSDEBUG,
+ "z :Users %u(%lu) Invites %u(%lu)",
+ users_counted,
+ (unsigned long) users_counted * sizeof(struct User),
+ users_invited_count,
+ (unsigned long) users_invited_count * sizeof(rb_dlink_node));
+
+ sendto_one_numeric(source_p, RPL_STATSDEBUG,
+ "z :User channels %u(%lu) Aways %u(%d)",
+ user_channels,
+ (unsigned long) user_channels * sizeof(rb_dlink_node),
+ aways_counted, (int) away_memory);
+
+ sendto_one_numeric(source_p, RPL_STATSDEBUG,
+ "z :Attached confs %u(%lu)",
+ local_client_conf_count,
+ (unsigned long) local_client_conf_count * sizeof(rb_dlink_node));
+
+ sendto_one_numeric(source_p, RPL_STATSDEBUG,
+ "z :Conflines %u(%d)", conf_count, (int) conf_memory);
+
+ sendto_one_numeric(source_p, RPL_STATSDEBUG,
+ "z :Classes %u(%lu)",
+ class_count,
+ (unsigned long) class_count * sizeof(struct Class));
+
+ sendto_one_numeric(source_p, RPL_STATSDEBUG,
+ "z :Channels %u(%d)",
+ channel_count, (int) channel_memory);
+
+ sendto_one_numeric(source_p, RPL_STATSDEBUG,
+ "z :Bans %u(%d) Exceptions %u(%d) Invex %u(%d) Quiets %u(%d)",
+ channel_bans, (int) channel_ban_memory,
+ channel_except, (int) channel_except_memory,
+ channel_invex, (int) channel_invex_memory,
+ channel_quiets, (int) channel_quiet_memory);
+
+ sendto_one_numeric(source_p, RPL_STATSDEBUG,
+ "z :Channel members %u(%lu) invite %u(%lu)",
+ channel_users,
+ (unsigned long) channel_users * sizeof(rb_dlink_node),
+ channel_invites,
+ (unsigned long) channel_invites * sizeof(rb_dlink_node));
+
+ total_channel_memory = channel_memory +
+ channel_ban_memory +
+ channel_users * sizeof(rb_dlink_node) + channel_invites * sizeof(rb_dlink_node);
+
+ sendto_one_numeric(source_p, RPL_STATSDEBUG,
+ "z :Whowas array %ld(%ld)",
+ (long)ww, (long)wwm);
+
+ totww = wwm;
+
+ sendto_one_numeric(source_p, RPL_STATSDEBUG,
+ "z :Hash: client %u(%ld) chan %u(%ld)",
+ U_MAX, (long)(U_MAX * sizeof(rb_dlink_list)),
+ CH_MAX, (long)(CH_MAX * sizeof(rb_dlink_list)));
+
+ sendto_one_numeric(source_p, RPL_STATSDEBUG,
+ "z :linebuf %ld(%ld)",
+ (long)linebuf_count, (long)linebuf_memory_used);
+
+ count_scache(&number_servers_cached, &mem_servers_cached);
+
+ sendto_one_numeric(source_p, RPL_STATSDEBUG,
+ "z :scache %ld(%ld)",
+ (long)number_servers_cached, (long)mem_servers_cached);
+
+ sendto_one_numeric(source_p, RPL_STATSDEBUG,
+ "z :hostname hash %d(%ld)",
+ HOST_MAX, (long)HOST_MAX * sizeof(rb_dlink_list));
+
+ total_memory = totww + total_channel_memory + conf_memory +
+ class_count * sizeof(struct Class);
+
+ total_memory += mem_servers_cached;
+ sendto_one_numeric(source_p, RPL_STATSDEBUG,
+ "z :Total: whowas %d channel %d conf %d",
+ (int) totww, (int) total_channel_memory,
+ (int) conf_memory);
+
+ count_local_client_memory(&local_client_count, &local_client_memory_used);
+ total_memory += local_client_memory_used;
+
+ sendto_one_numeric(source_p, RPL_STATSDEBUG,
+ "z :Local client Memory in use: %ld(%ld)",
+ (long)local_client_count, (long)local_client_memory_used);
+
+
+ count_remote_client_memory(&remote_client_count, &remote_client_memory_used);
+ total_memory += remote_client_memory_used;
+
+ sendto_one_numeric(source_p, RPL_STATSDEBUG,
+ "z :Remote client Memory in use: %ld(%ld)",
+ (long)remote_client_count,
+ (long)remote_client_memory_used);