X-Git-Url: https://jfr.im/git/solanum.git/blobdiff_plain/416d868ed4fdda55ed02e1ceb88b3acba1d6a434..b2c208be091670e3c5259eba77187bae6ac6eece:/modules/m_stats.c?ds=sidebyside diff --git a/modules/m_stats.c b/modules/m_stats.c index b9ab3907..667b8fbc 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); @@ -120,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_ @@ -131,7 +134,7 @@ 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, }, @@ -706,6 +709,20 @@ stats_oper(struct Client *source_p) } } +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) { @@ -845,7 +862,7 @@ stats_usage (struct Client *source_p) 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), @@ -928,6 +945,8 @@ stats_tstats (struct Client *source_p) 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); @@ -1147,7 +1166,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; @@ -1229,7 +1247,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); @@ -1237,7 +1254,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)); @@ -1245,7 +1261,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)); @@ -1253,7 +1268,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)); @@ -1464,6 +1478,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[]) { @@ -1524,8 +1547,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 { @@ -1533,12 +1556,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; } @@ -1546,15 +1569,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; @@ -1570,7 +1592,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); } }