Permalink
Browse files

m_stats: add optional constraint checking function pointer to stats_l…

…_list().
  • Loading branch information...
1 parent 55a06c8 commit e82bda18a57a1bcd18c658eb74c0f64da6855e0f @kaniini kaniini committed Sep 17, 2012
Showing with 10 additions and 8 deletions.
  1. +10 −8 modules/m_stats.c
View
@@ -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,37 +1538,37 @@ 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
{
/* they still need themselves if theyre local.. */
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;
}
/* 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;
@@ -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);
}
}

0 comments on commit e82bda1

Please sign in to comment.