X-Git-Url: https://jfr.im/git/solanum.git/blobdiff_plain/23282da4b57c41128b557cc340b6a60561c47ffd..55abcbb20aeabcf2e878a9c65c9697210dd10079:/modules/m_stats.c diff --git a/modules/m_stats.c b/modules/m_stats.c index c013c992..f61e4885 100644 --- a/modules/m_stats.c +++ b/modules/m_stats.c @@ -70,7 +70,8 @@ DECLARE_MODULE_AV1(stats, NULL, NULL, stats_clist, stats_hlist, NULL, "$Revision const char *Lformat = "%s %u %u %u %u %u :%u %u %s"; -static void stats_l_list(struct Client *s, const char *, int, int, rb_dlink_list *, char); +static void stats_l_list(struct Client *s, const char *, int, int, rb_dlink_list *, char, + int (*check_fn)(struct Client *target_p)); static void stats_l_client(struct Client *source_p, struct Client *target_p, char statchar); @@ -94,6 +95,7 @@ static void stats_tdeny(struct Client *); static void stats_deny(struct Client *); static void stats_exempt(struct Client *); static void stats_events(struct Client *); +static void stats_prop_klines(struct Client *); static void stats_hubleaf(struct Client *); static void stats_auth(struct Client *); static void stats_tklines(struct Client *); @@ -101,6 +103,7 @@ static void stats_klines(struct Client *); static void stats_messages(struct Client *); static void stats_dnsbl(struct Client *); static void stats_oper(struct Client *); +static void stats_privset(struct Client *); static void stats_operedup(struct Client *); static void stats_ports(struct Client *); static void stats_tresv(struct Client *); @@ -118,6 +121,8 @@ static void stats_servlinks(struct Client *); static void stats_ltrace(struct Client *, int, const char **); static void stats_ziplinks(struct Client *); static void stats_comm(struct Client *); +static void stats_capability(struct Client *); + /* This table contains the possible stats items, in order: * stats letter, function to call, operonly? adminonly? * case only matters in the stats letter column.. -- fl_ @@ -129,13 +134,14 @@ static struct StatsStruct stats_cmd_table[] = { {'b', stats_delay, 1, 1, }, {'B', stats_hash, 1, 1, }, {'c', stats_connect, 0, 0, }, - {'C', stats_connect, 0, 0, }, + {'C', stats_capability, 1, 0, }, {'d', stats_tdeny, 1, 0, }, {'D', stats_deny, 1, 0, }, {'e', stats_exempt, 1, 0, }, {'E', stats_events, 1, 1, }, {'f', stats_comm, 1, 1, }, {'F', stats_comm, 1, 1, }, + {'g', stats_prop_klines, 1, 0, }, {'h', stats_hubleaf, 0, 0, }, {'H', stats_hubleaf, 0, 0, }, {'i', stats_auth, 0, 0, }, @@ -148,7 +154,7 @@ static struct StatsStruct stats_cmd_table[] = { {'M', stats_messages, 0, 0, }, {'n', stats_dnsbl, 0, 0, }, {'o', stats_oper, 0, 0, }, - {'O', stats_oper, 0, 0, }, + {'O', stats_privset, 1, 0, }, {'p', stats_operedup, 0, 0, }, {'P', stats_ports, 0, 0, }, {'q', stats_tresv, 1, 0, }, @@ -173,12 +179,11 @@ static struct StatsStruct stats_cmd_table[] = { /* * m_stats by fl_ - * parv[0] = sender prefix * parv[1] = stat letter/command * parv[2] = (if present) server/mask in stats L, or target * * This will search the tables for the appropriate stats letter, - * if found execute it. + * if found execute it. */ static int m_stats(struct Client *client_p, struct Client *source_p, int parc, const char *parv[]) @@ -197,7 +202,7 @@ m_stats(struct Client *client_p, struct Client *source_p, int parc, const char * /* safe enough to give this on a local connect only */ sendto_one(source_p, form_str(RPL_LOAD2HI), me.name, source_p->name, "STATS"); - sendto_one_numeric(source_p, RPL_ENDOFSTATS, + sendto_one_numeric(source_p, RPL_ENDOFSTATS, form_str(RPL_ENDOFSTATS), statchar); return 0; } @@ -241,7 +246,7 @@ m_stats(struct Client *client_p, struct Client *source_p, int parc, const char * } /* Send the end of stats notice, and the stats_spy */ - sendto_one_numeric(source_p, RPL_ENDOFSTATS, + sendto_one_numeric(source_p, RPL_ENDOFSTATS, form_str(RPL_ENDOFSTATS), statchar); return 0; @@ -280,7 +285,7 @@ stats_connect(struct Client *source_p) char *s; rb_dlink_node *ptr; - if((ConfigFileEntry.stats_c_oper_only || + if((ConfigFileEntry.stats_c_oper_only || (ConfigServerHide.flatten_links && !IsExemptShide(source_p))) && !IsOper(source_p)) { @@ -296,7 +301,6 @@ stats_connect(struct Client *source_p) if(ServerConfIllegal(server_p)) continue; - buf[0] = '\0'; s = buf; if(IsOper(source_p)) @@ -311,18 +315,14 @@ stats_connect(struct Client *source_p) *s++ = 'Z'; } - if(!buf[0]) + if(s == buf) *s++ = '*'; *s = '\0'; - sendto_one_numeric(source_p, RPL_STATSCLINE, + sendto_one_numeric(source_p, RPL_STATSCLINE, form_str(RPL_STATSCLINE), -#ifndef HIDE_SERVERS_IPS - server_p->host, -#else - "*@127.0.0.1", -#endif + "*@127.0.0.1", buf, server_p->name, server_p->port, server_p->class_name); } @@ -355,7 +355,7 @@ stats_tdeny (struct Client *source_p) get_printable_kline(source_p, aconf, &host, &pass, &user, &oper_reason); - sendto_one_numeric(source_p, RPL_STATSDLINE, + sendto_one_numeric(source_p, RPL_STATSDLINE, form_str (RPL_STATSDLINE), 'd', host, pass, oper_reason ? "|" : "", @@ -392,7 +392,7 @@ stats_deny (struct Client *source_p) get_printable_kline(source_p, aconf, &host, &pass, &user, &oper_reason); - sendto_one_numeric(source_p, RPL_STATSDLINE, + sendto_one_numeric(source_p, RPL_STATSDLINE, form_str (RPL_STATSDLINE), 'D', host, pass, oper_reason ? "|" : "", @@ -434,7 +434,7 @@ stats_exempt(struct Client *source_p) get_printable_conf (aconf, &name, &host, &pass, &user, &port, &classname); - sendto_one_numeric(source_p, RPL_STATSDLINE, + sendto_one_numeric(source_p, RPL_STATSDLINE, form_str(RPL_STATSDLINE), 'e', host, pass, "", ""); } @@ -454,13 +454,39 @@ stats_events (struct Client *source_p) rb_dump_events(stats_events_cb, source_p); } +static void +stats_prop_klines(struct Client *source_p) +{ + struct ConfItem *aconf; + rb_dlink_node *ptr; + char *user, *host, *pass, *oper_reason; + + RB_DLINK_FOREACH(ptr, prop_bans.head) + { + aconf = ptr->data; + + /* Skip non-klines and deactivated klines. */ + if(aconf->status != CONF_KILL) + continue; + + get_printable_kline(source_p, aconf, &host, &pass, + &user, &oper_reason); + + sendto_one_numeric(source_p, RPL_STATSKLINE, + form_str(RPL_STATSKLINE), + 'g', host, user, pass, + oper_reason ? "|" : "", + oper_reason ? oper_reason : ""); + } +} + static void stats_hubleaf(struct Client *source_p) { struct remote_conf *hub_p; rb_dlink_node *ptr; - if((ConfigFileEntry.stats_h_oper_only || + if((ConfigFileEntry.stats_h_oper_only || (ConfigServerHide.flatten_links && !IsExemptShide(source_p))) && !IsOper(source_p)) { @@ -497,7 +523,7 @@ stats_auth (struct Client *source_p) else if((ConfigFileEntry.stats_i_oper_only == 1) && !IsOper (source_p)) { struct ConfItem *aconf; - char *name, *host, *pass, *user, *classname; + char *name, *host, *pass = "*", *user, *classname; int port; if(MyConnect (source_p)) @@ -505,18 +531,20 @@ stats_auth (struct Client *source_p) (struct sockaddr *)&source_p->localClient->ip, CONF_CLIENT, source_p->localClient->ip.ss_family, - source_p->username); + source_p->username, NULL); else aconf = find_conf_by_address (source_p->host, NULL, NULL, NULL, CONF_CLIENT, - 0, source_p->username); + 0, source_p->username, NULL); if(aconf == NULL) return; get_printable_conf (aconf, &name, &host, &pass, &user, &port, &classname); + if(!EmptyString(aconf->spasswd)) + pass = aconf->spasswd; sendto_one_numeric(source_p, RPL_STATSILINE, form_str(RPL_STATSILINE), - name, show_iline_prefix(source_p, aconf, user), + name, pass, show_iline_prefix(source_p, aconf, user), host, port, classname); } @@ -545,10 +573,10 @@ stats_tklines(struct Client *source_p) (struct sockaddr *)&source_p->localClient->ip, CONF_KILL, source_p->localClient->ip.ss_family, - source_p->username); + source_p->username, NULL); else aconf = find_conf_by_address (source_p->host, NULL, NULL, NULL, CONF_KILL, - 0, source_p->username); + 0, source_p->username, NULL); if(aconf == NULL) return; @@ -559,7 +587,7 @@ stats_tklines(struct Client *source_p) get_printable_kline(source_p, aconf, &host, &pass, &user, &oper_reason); - sendto_one_numeric(source_p, RPL_STATSKLINE, + sendto_one_numeric(source_p, RPL_STATSKLINE, form_str(RPL_STATSKLINE), aconf->flags & CONF_FLAGS_TEMPORARY ? 'k' : 'K', host, user, pass, oper_reason ? "|" : "", oper_reason ? oper_reason : ""); @@ -578,7 +606,7 @@ stats_tklines(struct Client *source_p) { aconf = ptr->data; - get_printable_kline(source_p, aconf, &host, &pass, + get_printable_kline(source_p, aconf, &host, &pass, &user, &oper_reason); sendto_one_numeric(source_p, RPL_STATSKLINE, @@ -611,10 +639,10 @@ stats_klines(struct Client *source_p) (struct sockaddr *)&source_p->localClient->ip, CONF_KILL, source_p->localClient->ip.ss_family, - source_p->username); + source_p->username, NULL); else aconf = find_conf_by_address (source_p->host, NULL, NULL, NULL, CONF_KILL, - 0, source_p->username); + 0, source_p->username, NULL); if(aconf == NULL) return; @@ -672,14 +700,33 @@ stats_oper(struct Client *source_p) RB_DLINK_FOREACH(ptr, oper_conf_list.head) { oper_p = ptr->data; - - sendto_one_numeric(source_p, RPL_STATSOLINE, + + sendto_one_numeric(source_p, RPL_STATSOLINE, form_str(RPL_STATSOLINE), oper_p->username, oper_p->host, oper_p->name, - IsOper(source_p) ? get_oper_privs(oper_p->flags) : "0", "-1"); + IsOper(source_p) ? oper_p->privset->name : "0", "-1"); } } +static void +stats_capability_walk(const char *line, void *data) +{ + struct Client *client_p = data; + + sendto_one_numeric(client_p, RPL_STATSDEBUG, "C :%s", line); +} + +static void +stats_capability(struct Client *client_p) +{ + capability_index_stats(stats_capability_walk, client_p); +} + +static void +stats_privset(struct Client *source_p) +{ + privilegeset_report(source_p); +} /* stats_operedup() * @@ -708,7 +755,7 @@ stats_operedup (struct Client *source_p) sendto_one_numeric(source_p, RPL_STATSDEBUG, "p :%s (%s@%s)", - target_p->name, target_p->username, + target_p->name, target_p->username, target_p->host); } @@ -739,18 +786,18 @@ stats_tresv(struct Client *source_p) { aconf = ptr->data; if(aconf->hold) - sendto_one_numeric(source_p, RPL_STATSQLINE, + sendto_one_numeric(source_p, RPL_STATSQLINE, form_str(RPL_STATSQLINE), - 'q', aconf->port, aconf->name, aconf->passwd); + 'q', aconf->port, aconf->host, aconf->passwd); } HASH_WALK(i, R_MAX, ptr, resvTable) { aconf = ptr->data; if(aconf->hold) - sendto_one_numeric(source_p, RPL_STATSQLINE, + sendto_one_numeric(source_p, RPL_STATSQLINE, form_str(RPL_STATSQLINE), - 'q', aconf->port, aconf->name, aconf->passwd); + 'q', aconf->port, aconf->host, aconf->passwd); } HASH_WALK_END } @@ -767,18 +814,18 @@ stats_resv(struct Client *source_p) { aconf = ptr->data; if(!aconf->hold) - sendto_one_numeric(source_p, RPL_STATSQLINE, + sendto_one_numeric(source_p, RPL_STATSQLINE, form_str(RPL_STATSQLINE), - 'Q', aconf->port, aconf->name, aconf->passwd); + 'Q', aconf->port, aconf->host, aconf->passwd); } HASH_WALK(i, R_MAX, ptr, resvTable) { aconf = ptr->data; if(!aconf->hold) - sendto_one_numeric(source_p, RPL_STATSQLINE, + sendto_one_numeric(source_p, RPL_STATSQLINE, form_str(RPL_STATSQLINE), - 'Q', aconf->port, aconf->name, aconf->passwd); + 'Q', aconf->port, aconf->host, aconf->passwd); } HASH_WALK_END } @@ -812,17 +859,17 @@ stats_usage (struct Client *source_p) rup = (rb_current_time() - startup_time) * hzz; if(0 == rup) rup = 1; - + sendto_one_numeric(source_p, RPL_STATSDEBUG, - "R :CPU Secs %d:%d User %d:%d System %d:%d", + "R :CPU Secs %d:%02d User %d:%02d System %d:%02d", (int) (secs / 60), (int) (secs % 60), (int) (rus.ru_utime.tv_sec / 60), (int) (rus.ru_utime.tv_sec % 60), - (int) (rus.ru_stime.tv_sec / 60), + (int) (rus.ru_stime.tv_sec / 60), (int) (rus.ru_stime.tv_sec % 60)); sendto_one_numeric(source_p, RPL_STATSDEBUG, "R :RSS %ld ShMem %ld Data %ld Stack %ld", - rus.ru_maxrss, (rus.ru_ixrss / rup), + rus.ru_maxrss, (rus.ru_ixrss / rup), (rus.ru_idrss / rup), (rus.ru_isrss / rup)); sendto_one_numeric(source_p, RPL_STATSDEBUG, "R :Swaps %d Reclaims %d Faults %d", @@ -835,7 +882,7 @@ stats_usage (struct Client *source_p) (int) rus.ru_msgrcv, (int) rus.ru_msgsnd); sendto_one_numeric(source_p, RPL_STATSDEBUG, "R :Signals %d Context Vol. %d Invol %d", - (int) rus.ru_nsignals, (int) rus.ru_nvcsw, + (int) rus.ru_nsignals, (int) rus.ru_nvcsw, (int) rus.ru_nivcsw); } @@ -854,7 +901,7 @@ stats_tstats (struct Client *source_p) sp.is_sbs += target_p->localClient->sendB; sp.is_sbr += target_p->localClient->receiveB; - sp.is_sti += rb_current_time() - target_p->localClient->firsttime; + sp.is_sti += (unsigned long long)(rb_current_time() - target_p->localClient->firsttime); sp.is_sv++; } @@ -864,7 +911,7 @@ stats_tstats (struct Client *source_p) sp.is_cbs += target_p->localClient->sendB; sp.is_cbr += target_p->localClient->receiveB; - sp.is_cti += rb_current_time() - target_p->localClient->firsttime; + sp.is_cti += (unsigned long long)(rb_current_time() - target_p->localClient->firsttime); sp.is_cl++; } @@ -876,8 +923,10 @@ stats_tstats (struct Client *source_p) sendto_one_numeric(source_p, RPL_STATSDEBUG, "T :accepts %u refused %u", sp.is_ac, sp.is_ref); sendto_one_numeric(source_p, RPL_STATSDEBUG, - "T :rejected %u delaying %lu", - sp.is_rej, rb_dlink_list_length(&delay_exit)); + "T :rejected %u delaying %lu", + sp.is_rej, delay_exit_length()); + sendto_one_numeric(source_p, RPL_STATSDEBUG, + "T :throttled refused %u throttle list size %lu", sp.is_thr, throttle_size()); sendto_one_numeric(source_p, RPL_STATSDEBUG, "T :nicks being delayed %lu", get_nd_count()); @@ -888,13 +937,15 @@ stats_tstats (struct Client *source_p) "T :nick collisions %u saves %u unknown closes %u", sp.is_kill, sp.is_save, sp.is_ni); sendto_one_numeric(source_p, RPL_STATSDEBUG, - "T :wrong direction %u empty %u", + "T :wrong direction %u empty %u", sp.is_wrdi, sp.is_empt); sendto_one_numeric(source_p, RPL_STATSDEBUG, "T :numerics seen %u", sp.is_num); sendto_one_numeric(source_p, RPL_STATSDEBUG, "T :tgchange blocked msgs %u restricted addrs %lu", sp.is_tgch, rb_dlink_list_length(&tgchange_list)); + sendto_one_numeric(source_p, RPL_STATSDEBUG, + "T :ratelimit blocked commands %u", sp.is_rl); sendto_one_numeric(source_p, RPL_STATSDEBUG, "T :auth successes %u fails %u", sp.is_asuc, sp.is_abad); @@ -906,15 +957,15 @@ stats_tstats (struct Client *source_p) "T :connected %u %u", sp.is_cl, sp.is_sv); sendto_one_numeric(source_p, RPL_STATSDEBUG, "T :bytes sent %lluK %lluK", - sp.is_cbs / 1024, + sp.is_cbs / 1024, sp.is_sbs / 1024); sendto_one_numeric(source_p, RPL_STATSDEBUG, "T :bytes recv %lluK %lluK", - sp.is_cbr / 1024, + sp.is_cbr / 1024, sp.is_sbr / 1024); sendto_one_numeric(source_p, RPL_STATSDEBUG, - "T :time connected %lu %lu", - (long int)sp.is_cti, (long int)sp.is_sti); + "T :time connected %llu %llu", + sp.is_cti, sp.is_sti); } static void @@ -923,13 +974,13 @@ stats_uptime (struct Client *source_p) time_t now; now = rb_current_time() - startup_time; - sendto_one_numeric(source_p, RPL_STATSUPTIME, + sendto_one_numeric(source_p, RPL_STATSUPTIME, form_str (RPL_STATSUPTIME), - now / 86400, (now / 3600) % 24, - (now / 60) % 60, now % 60); + (int)(now / 86400), (int)((now / 3600) % 24), + (int)((now / 60) % 60), (int)(now % 60)); sendto_one_numeric(source_p, RPL_STATSCONN, form_str (RPL_STATSCONN), - MaxConnectionCount, MaxClientCount, + MaxConnectionCount, MaxClientCount, Count.totalrestartcount); } @@ -951,9 +1002,9 @@ static struct shared_flags shared_flagtable[] = { SHARED_UNRESV, 'R' }, { SHARED_LOCOPS, 'L' }, { SHARED_REHASH, 'H' }, - { SHARED_TDLINE, 'd' }, - { SHARED_PDLINE, 'D' }, - { SHARED_UNDLINE, 'E' }, + { SHARED_TDLINE, 'd' }, + { SHARED_PDLINE, 'D' }, + { SHARED_UNDLINE, 'E' }, { 0, '\0'} }; @@ -963,7 +1014,7 @@ stats_shared (struct Client *source_p) { struct remote_conf *shared_p; rb_dlink_node *ptr; - char buf[15]; + char buf[sizeof(shared_flagtable)/sizeof(shared_flagtable[0])]; char *p; int i; @@ -983,7 +1034,7 @@ stats_shared (struct Client *source_p) *p = '\0'; - sendto_one_numeric(source_p, RPL_STATSULINE, + sendto_one_numeric(source_p, RPL_STATSULINE, form_str(RPL_STATSULINE), shared_p->server, shared_p->username, shared_p->host, buf); @@ -1005,7 +1056,7 @@ stats_shared (struct Client *source_p) *p = '\0'; - sendto_one_numeric(source_p, RPL_STATSULINE, + sendto_one_numeric(source_p, RPL_STATSULINE, form_str(RPL_STATSULINE), shared_p->server, "*", "*", buf); } @@ -1055,7 +1106,7 @@ stats_servers (struct Client *source_p) (target_p->serv->by[0] ? target_p->serv->by : "Remote."), (int) (rb_current_time() - target_p->localClient->lasttime), (int) rb_linebuf_len (&target_p->localClient->buf_sendq), - days, (days == 1) ? "" : "s", hours, minutes, + days, (days == 1) ? "" : "s", hours, minutes, (int) seconds); } @@ -1076,7 +1127,7 @@ stats_tgecos(struct Client *source_p) if(aconf->hold) sendto_one_numeric(source_p, RPL_STATSXLINE, form_str(RPL_STATSXLINE), - 'x', aconf->port, aconf->name, + 'x', aconf->port, aconf->host, aconf->passwd); } } @@ -1094,7 +1145,7 @@ stats_gecos(struct Client *source_p) if(!aconf->hold) sendto_one_numeric(source_p, RPL_STATSXLINE, form_str(RPL_STATSXLINE), - 'X', aconf->port, aconf->name, + 'X', aconf->port, aconf->host, aconf->passwd); } } @@ -1114,7 +1165,6 @@ stats_memory (struct Client *source_p) { struct Client *target_p; struct Channel *chptr; - struct Ban *actualBan; rb_dlink_node *rb_dlink; rb_dlink_node *ptr; int channel_count = 0; @@ -1196,7 +1246,6 @@ stats_memory (struct Client *source_p) RB_DLINK_FOREACH(rb_dlink, chptr->banlist.head) { - actualBan = rb_dlink->data; channel_bans++; channel_ban_memory += sizeof(rb_dlink_node) + sizeof(struct Ban); @@ -1204,7 +1253,6 @@ stats_memory (struct Client *source_p) RB_DLINK_FOREACH(rb_dlink, chptr->exceptlist.head) { - actualBan = rb_dlink->data; channel_except++; channel_except_memory += (sizeof(rb_dlink_node) + sizeof(struct Ban)); @@ -1212,7 +1260,6 @@ stats_memory (struct Client *source_p) RB_DLINK_FOREACH(rb_dlink, chptr->invexlist.head) { - actualBan = rb_dlink->data; channel_invex++; channel_invex_memory += (sizeof(rb_dlink_node) + sizeof(struct Ban)); @@ -1220,7 +1267,6 @@ stats_memory (struct Client *source_p) RB_DLINK_FOREACH(rb_dlink, chptr->quietlist.head) { - actualBan = rb_dlink->data; channel_quiets++; channel_quiet_memory += (sizeof(rb_dlink_node) + sizeof(struct Ban)); @@ -1237,7 +1283,7 @@ stats_memory (struct Client *source_p) "z :Users %u(%lu) Invites %u(%lu)", users_counted, (unsigned long) users_counted * sizeof(struct User), - users_invited_count, + users_invited_count, (unsigned long) users_invited_count * sizeof(rb_dlink_node)); sendto_one_numeric(source_p, RPL_STATSDEBUG, @@ -1256,7 +1302,7 @@ stats_memory (struct Client *source_p) sendto_one_numeric(source_p, RPL_STATSDEBUG, "z :Classes %u(%lu)", - class_count, + class_count, (unsigned long) class_count * sizeof(struct Class)); sendto_one_numeric(source_p, RPL_STATSDEBUG, @@ -1274,7 +1320,7 @@ stats_memory (struct Client *source_p) "z :Channel members %u(%lu) invite %u(%lu)", channel_users, (unsigned long) channel_users * sizeof(rb_dlink_node), - channel_invites, + channel_invites, (unsigned long) channel_invites * sizeof(rb_dlink_node)); total_channel_memory = channel_memory + @@ -1289,7 +1335,7 @@ stats_memory (struct Client *source_p) sendto_one_numeric(source_p, RPL_STATSDEBUG, "z :Hash: client %u(%ld) chan %u(%ld)", - U_MAX, (long)(U_MAX * sizeof(rb_dlink_list)), + 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, @@ -1311,8 +1357,8 @@ stats_memory (struct Client *source_p) 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, + "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); @@ -1345,7 +1391,7 @@ stats_ziplinks (struct Client *source_p) target_p = ptr->data; if(IsCapable (target_p, CAP_ZIP)) { - zipstats = target_p->localClient->zipstats; + zipstats = target_p->localClient->zipstats; sprintf(buf, "%.2f%%", zipstats->out_ratio); sprintf(buf1, "%.2f%%", zipstats->in_ratio); sendto_one_numeric(source_p, RPL_STATSDEBUG, @@ -1353,8 +1399,8 @@ stats_ziplinks (struct Client *source_p) "(%llu kB data/%llu kB wire)] recv[%s compression " "(%llu kB data/%llu kB wire)]", target_p->name, - buf, zipstats->out >> 10, - zipstats->out_wire >> 10, buf1, + buf, zipstats->out >> 10, + zipstats->out_wire >> 10, buf1, zipstats->in >> 10, zipstats->in_wire >> 10); sent_data++; } @@ -1394,14 +1440,14 @@ stats_servlinks (struct Client *source_p) sendto_one(source_p, Sformat, get_id(&me, source_p), RPL_STATSLINKINFO, get_id(source_p, source_p), - get_server_name(target_p, SHOW_IP), + target_p->name, (int) rb_linebuf_len (&target_p->localClient->buf_sendq), (int) target_p->localClient->sendM, (int) target_p->localClient->sendK, (int) target_p->localClient->receiveM, (int) target_p->localClient->receiveK, rb_current_time() - target_p->localClient->firsttime, - (rb_current_time() > target_p->localClient->lasttime) ? + (rb_current_time() > target_p->localClient->lasttime) ? (rb_current_time() - target_p->localClient->lasttime) : 0, IsOper (source_p) ? show_capabilities (target_p) : "TS"); } @@ -1420,7 +1466,7 @@ stats_servlinks (struct Client *source_p) uptime = (rb_current_time() - startup_time); snprintf(buf, sizeof buf, "%7.2f %s (%4.1f K/s)", - _GMKv (me.localClient->sendK), + _GMKv (me.localClient->sendK), _GMKs (me.localClient->sendK), (float) ((float) me.localClient->sendK / (float) uptime)); sendto_one_numeric(source_p, RPL_STATSDEBUG, "? :Server send: %s", buf); @@ -1431,6 +1477,15 @@ stats_servlinks (struct Client *source_p) sendto_one_numeric(source_p, RPL_STATSDEBUG, "? :Server recv: %s", buf); } +static int +stats_l_should_show_oper(struct Client *target_p) +{ + if (IsOperInvis(target_p)) + return 0; + + return 1; +} + static void stats_ltrace(struct Client *source_p, int parc, const char *parv[]) { @@ -1491,8 +1546,8 @@ stats_ltrace(struct Client *source_p, int parc, const char *parv[]) /* local opers get everyone */ if(MyOper(source_p)) { - stats_l_list(source_p, name, doall, wilds, &unknown_list, statchar); - stats_l_list(source_p, name, doall, wilds, &lclient_list, statchar); + stats_l_list(source_p, name, doall, wilds, &unknown_list, statchar, NULL); + stats_l_list(source_p, name, doall, wilds, &lclient_list, statchar, NULL); } else { @@ -1500,12 +1555,12 @@ stats_ltrace(struct Client *source_p, int parc, const char *parv[]) if(MyClient(source_p)) stats_l_client(source_p, source_p, statchar); - stats_l_list(source_p, name, doall, wilds, &local_oper_list, statchar); + stats_l_list(source_p, name, doall, wilds, &local_oper_list, statchar, stats_l_should_show_oper); } if (!ConfigServerHide.flatten_links || IsOper(source_p) || IsExemptShide(source_p)) - stats_l_list(source_p, name, doall, wilds, &serv_list, statchar); + stats_l_list(source_p, name, doall, wilds, &serv_list, statchar, NULL); return; } @@ -1513,15 +1568,14 @@ stats_ltrace(struct Client *source_p, int parc, const char *parv[]) /* ok, at this point theyre looking for a specific client whos on * our server.. but it contains a wildcard. --fl */ - stats_l_list(source_p, name, doall, wilds, &lclient_list, statchar); + stats_l_list(source_p, name, doall, wilds, &lclient_list, statchar, NULL); return; } - static void stats_l_list(struct Client *source_p, const char *name, int doall, int wilds, - rb_dlink_list * list, char statchar) + rb_dlink_list * list, char statchar, int (*check_fn)(struct Client *target_p)) { rb_dlink_node *ptr; struct Client *target_p; @@ -1537,7 +1591,8 @@ stats_l_list(struct Client *source_p, const char *name, int doall, int wilds, if(!doall && wilds && !match(name, target_p->name)) continue; - stats_l_client(source_p, target_p, statchar); + if (check_fn == NULL || check_fn(target_p)) + stats_l_client(source_p, target_p, statchar); } } @@ -1548,14 +1603,14 @@ stats_l_client(struct Client *source_p, struct Client *target_p, if(IsAnyServer(target_p)) { sendto_one_numeric(source_p, RPL_STATSLINKINFO, Lformat, - get_server_name(target_p, SHOW_IP), + target_p->name, (int) rb_linebuf_len(&target_p->localClient->buf_sendq), (int) target_p->localClient->sendM, (int) target_p->localClient->sendK, (int) target_p->localClient->receiveM, (int) target_p->localClient->receiveK, rb_current_time() - target_p->localClient->firsttime, - (rb_current_time() > target_p->localClient->lasttime) ? + (rb_current_time() > target_p->localClient->lasttime) ? (rb_current_time() - target_p->localClient->lasttime) : 0, IsOper(source_p) ? show_capabilities(target_p) : "-"); } @@ -1574,7 +1629,7 @@ stats_l_client(struct Client *source_p, struct Client *target_p, (int) target_p->localClient->receiveM, (int) target_p->localClient->receiveK, rb_current_time() - target_p->localClient->firsttime, - (rb_current_time() > target_p->localClient->lasttime) ? + (rb_current_time() > target_p->localClient->lasttime) ? (rb_current_time() - target_p->localClient->lasttime) : 0, "-"); }