From e82bda18a57a1bcd18c658eb74c0f64da6855e0f Mon Sep 17 00:00:00 2001 From: William Pitcock Date: Mon, 17 Sep 2012 16:38:31 -0500 Subject: [PATCH] m_stats: add optional constraint checking function pointer to stats_l_list(). --- modules/m_stats.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/modules/m_stats.c b/modules/m_stats.c index 32890a9a..83046d47 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); @@ -1537,8 +1538,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 { @@ -1546,12 +1547,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, NULL); } 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; } @@ -1559,7 +1560,7 @@ 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; } @@ -1567,7 +1568,7 @@ stats_ltrace(struct Client *source_p, int parc, const char *parv[]) 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; @@ -1583,7 +1584,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); } }